diff --git a/.claude/.dev/update_tags.py b/.claude/.dev/update_tags.py index e51909b0..a5d85289 100644 --- a/.claude/.dev/update_tags.py +++ b/.claude/.dev/update_tags.py @@ -88,7 +88,12 @@ def update_tags(tag_names=None): with open(output_file, "w") as f: json.dump(update_tags, f, indent=4) + tags_file = ( + Path(__file__).parent.parent.parent + / "src/leetcode_py/cli/resources/leetcode/json/tags.json5" + ) print(f"\nUpdate tags with missing problems written to {output_file}") + print(f"Target file to update: {tags_file}") print(f"Total tags with missing problems: {len(update_tags)}") diff --git a/.claude/commands/batch-problem-creation.md b/.claude/skills/batch-problem-creation/SKILL.md similarity index 89% rename from .claude/commands/batch-problem-creation.md rename to .claude/skills/batch-problem-creation/SKILL.md index 78f5fb1c..738ae4bc 100644 --- a/.claude/commands/batch-problem-creation.md +++ b/.claude/skills/batch-problem-creation/SKILL.md @@ -1,15 +1,21 @@ +--- +name: batch-problem-creation +argument-hint: "[count]" +description: Batch creation workflow for multiple LeetCode problems - loops through problem creation, solution implementation, and quality assurance for a specified count. Accepts optional count argument (e.g., /batch-problem-creation 10). Defaults to 5 if no argument. Use ONLY when user explicitly requests batch creation via /batch-problem-creation command. +--- + # Batch Problem Creation Command ## Assistant Workflow When user requests **batch creation of multiple problems**, the assistant will: -1. **Get count from user** (default: 5 problems) +1. **Parse count**: Use `$ARGUMENTS` as count if provided (must be valid integer). Otherwise ask user (default: 5 problems) 2. **Loop through each problem** following the complete workflow 3. **For each problem**: - Find next problem via `uv run python .claude/.dev/next_problem.py` - - Follow all steps from @.claude/commands/problem-creation.md - - **MANDATORY**: Read and follow @.claude/commands/test-quality-assurance.md for quality verification + - Follow all steps from @.claude/skills/problem-creation.md + - **MANDATORY**: Read and follow @.claude/skills/test-quality-assurance.md for quality verification 4. **Provide batch summary** at the end **CRITICAL INSTRUCTION**: You MUST read the test-quality-assurance.md file before executing quality assurance for any problem. Do not rely on memory or assumptions about the workflow. @@ -38,7 +44,7 @@ uv run python .claude/.dev/next_problem.py #### 2.2: Follow Problem Creation Workflow -Execute complete workflow from @.claude/commands/problem-creation.md: +Execute complete workflow from @.claude/skills/problem-creation.md: 1. **Scrape** problem data using `uv run lcpy scrape` 2. **Transform** data into proper JSON template format @@ -58,11 +64,11 @@ Execute complete workflow from @.claude/commands/problem-creation.md: #### 2.4: Quality Assurance & Reproducibility Verification -**MANDATORY**: You MUST read and follow the complete workflow from `.claude/commands/test-quality-assurance.md` for EVERY problem. +**MANDATORY**: You MUST read and follow the complete workflow from `.claude/skills/test-quality-assurance.md` for EVERY problem. **REQUIRED ACTION**: Before proceeding with quality assurance, you MUST: -1. **Read the file**: @.claude/commands/test-quality-assurance.md +1. **Read the file**: @.claude/skills/test-quality-assurance.md 2. **Follow the exact 4-step process** described in that file 3. **Execute each step** as specified in the test-quality-assurance.md workflow diff --git a/.claude/commands/problem-creation.md b/.claude/skills/problem-creation/SKILL.md similarity index 98% rename from .claude/commands/problem-creation.md rename to .claude/skills/problem-creation/SKILL.md index 928de408..92f3a8b7 100644 --- a/.claude/commands/problem-creation.md +++ b/.claude/skills/problem-creation/SKILL.md @@ -1,3 +1,8 @@ +--- +name: problem-creation +description: Guide for creating a single LeetCode problem scaffold - scrape, transform to JSON template, generate files, and verify. Use ONLY when user explicitly requests problem creation via /problem-creation command or provides a specific LeetCode problem number/name. +--- + # Problem Creation Guide ## Assistant Workflow diff --git a/.claude/commands/test-quality-assurance.md b/.claude/skills/test-quality-assurance/SKILL.md similarity index 56% rename from .claude/commands/test-quality-assurance.md rename to .claude/skills/test-quality-assurance/SKILL.md index a50cd65b..d13393b2 100644 --- a/.claude/commands/test-quality-assurance.md +++ b/.claude/skills/test-quality-assurance/SKILL.md @@ -1,3 +1,8 @@ +--- +name: test-quality-assurance +description: Test quality assurance workflow for LeetCode problems - verifies reproducibility, fixes linting issues, and ensures test structure matches JSON templates. Use ONLY when user explicitly requests test quality assurance via /test-quality-assurance command. +--- + # Test Quality Assurance Rules ## CRITICAL: Follow These Steps EXACTLY - No Deviations @@ -33,20 +38,20 @@ rm -rf leetcode/{problem_name}_backup ### 3. What NOT to Do -- ❌ **NEVER edit cookiecutter templates** (`{{cookiecutter.problem_name}}/` files) -- ❌ **NEVER use `uv run python -m leetcode_py.cli.main gen`** - use `bake p-gen` instead -- ❌ **NEVER modify helpers.py manually** - let regeneration handle it -- ❌ **NEVER skip ty verification** - this is the main CI issue -- ❌ **NEVER assume tests will pass** - they may fail if solution is incomplete -- ❌ **NEVER use `null` in JSON templates** - use `None` for Python None values +- **NEVER edit cookiecutter templates** (`{{cookiecutter.problem_name}}/` files) +- **NEVER use `uv run python -m leetcode_py.cli.main gen`** - use `bake p-gen` instead +- **NEVER modify helpers.py manually** - let regeneration handle it +- **NEVER skip ty verification** - this is the main CI issue +- **NEVER assume tests will pass** - they may fail if solution is incomplete +- **NEVER use `null` in JSON templates** - use `None` for Python None values ### 4. What to Do -- ✅ **ALWAYS use `bake p-gen -p {problem_name} -f`** for regeneration -- ✅ **ALWAYS verify ty passes** before considering task complete -- ✅ **ALWAYS restore original solution** after regeneration -- ✅ **ALWAYS check JSON template** if ty fails (look for `assert_assert_` bugs) -- ✅ **ALWAYS use `None` not `null` in JSON templates** for Python None values +- **ALWAYS use `bake p-gen -p {problem_name} -f`** for regeneration +- **ALWAYS verify ty passes** before considering task complete +- **ALWAYS restore original solution** after regeneration +- **ALWAYS check JSON template** if ty fails (look for `assert_assert_` bugs) +- **ALWAYS use `None` not `null` in JSON templates** for Python None values ## Test Case Standards @@ -99,42 +104,42 @@ bake p-gen -p {problem_name} -f ## Common Issues & Solutions -### Issue: `assert_assert_missing_number` Error +### Issue: \`assert_assert_missing_number\` Error -**Cause**: JSON template has `helpers_assert_name: "assert_missing_number"` but template adds `assert_` prefix -**Solution**: Change JSON to `helpers_assert_name: "missing_number"` so template generates `assert_missing_number` +**Cause**: JSON template has \`helpers*assert_name: "assert_missing_number"\` but template adds \`assert*\` prefix +**Solution**: Change JSON to \`helpers_assert_name: "missing_number"\` so template generates \`assert_missing_number\` ### Issue: ty Import Errors **Cause**: Regenerated helpers.py doesn't match test imports -**Solution**: Use `bake p-gen` (not uv run) and verify JSON template is correct +**Solution**: Use \`bake p-gen\` (not uv run) and verify JSON template is correct ### Issue: Tests Fail After Regeneration **Expected**: Tests may fail if solution is incomplete (returns 0 or placeholder) **Action**: This is normal - focus on ty passing, not test results -### Issue: `null` vs `None` in JSON Templates +### Issue: \`null\` vs \`None\` in JSON Templates -**Cause**: JSON template uses `null` which causes linting errors in generated Python code +**Cause**: JSON template uses \`null\` which causes linting errors in generated Python code -- Error: `F821 Undefined name 'null'` from ruff/ty -- Generated test files contain `null` which is not valid Python +- Error: \`F821 Undefined name 'null'\` from ruff/ty +- Generated test files contain \`null\` which is not valid Python -**Solution**: Update JSON template to use `None` instead of `null` +**Solution**: Update JSON template to use \`None\` instead of \`null\` -- Change: `"([1, null, 2], 3, 1)"` → `"([1, None, 2], 3, 1)"` -- This applies to `test_cases` list and `playground_setup` fields -- After fixing JSON, regenerate with `bake p-gen -p {problem_name} -f` +- Change: \`"([1, null, 2], 3, 1)"\` → \`"([1, None, 2], 3, 1)"\` +- This applies to \`test_cases\` list and \`playground_setup\` fields +- After fixing JSON, regenerate with \`bake p-gen -p {problem_name} -f\` - Generated code will now pass linting without manual edits ## Success Criteria -- ✅ **ty passes** with no errors (CRITICAL for CI) -- ✅ **Test structure matches JSON template** exactly -- ✅ **Original solution preserved** (user's code intact) -- ✅ **helpers.py generated correctly** (no `assert_assert_` bugs) -- ✅ **Reproducibility verified** (can regenerate consistently) +- **ty passes** with no errors (CRITICAL for CI) +- **Test structure matches JSON template** exactly +- **Original solution preserved** (user's code intact) +- **helpers.py generated correctly** (no \`assert*assert*\` bugs) +- **Reproducibility verified** (can regenerate consistently) ## When to Use This Workflow diff --git a/.claude/commands/update-tags.md b/.claude/skills/update-tags/SKILL.md similarity index 89% rename from .claude/commands/update-tags.md rename to .claude/skills/update-tags/SKILL.md index 7cdab3a7..a05686ea 100644 --- a/.claude/commands/update-tags.md +++ b/.claude/skills/update-tags/SKILL.md @@ -1,3 +1,8 @@ +--- +name: update-tags +description: Updates .tags.json5 by running update_tags.py script, sorting output alphabetically, and cleaning up temp files. Use ONLY when user explicitly requests "update tags" or "/update-tags". +--- + # Update Tags Command ## Description diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 2e00dba8..be0d4ddf 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -17,7 +17,7 @@ jobs: # ==================================================== semantic-release: name: semantic-release - uses: wislertt/zerv/.github/workflows/shared-semantic-release.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-semantic-release.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 with: allowed_workflow_dispatch_branches: '["main"]' fail_on_invalid_workflow_dispatch_ref: true @@ -25,11 +25,11 @@ jobs: zerv-versioning: needs: semantic-release if: needs.semantic-release.outputs.is_valid_semantic_release == 'true' - uses: wislertt/zerv/.github/workflows/shared-zerv-versioning.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-zerv-versioning.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 create-version-prefix-tags: needs: zerv-versioning - uses: wislertt/zerv/.github/workflows/shared-create-tags.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-create-tags.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 with: tags: >- [ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b71252e2..80de61b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: # ==================================================== check-pre-release: name: check-pre-release - uses: wislertt/zerv/.github/workflows/shared-check-pr-label-and-branch.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-check-pr-label-and-branch.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 with: target_label: "pre-release" branch_prefixes: '["release/"]' @@ -23,7 +23,7 @@ jobs: zerv-versioning: name: zerv-versioning needs: check-pre-release - uses: wislertt/zerv/.github/workflows/shared-zerv-versioning.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-zerv-versioning.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 with: schema: >- ${{ (needs.check-pre-release.outputs.is_valid == 'true' @@ -34,7 +34,7 @@ jobs: name: tag-pre-release needs: [zerv-versioning, check-pre-release] if: needs.check-pre-release.outputs.is_valid == 'true' - uses: wislertt/zerv/.github/workflows/shared-create-tags.yml@643777b9a3573497fd9f8edabe340f256acce981 # v0.8.13 + uses: wislertt/zerv/.github/workflows/shared-create-tags.yml@bab11cb3fe35f4f9b4fd746f7ea159ba00e0109d # v0.8.15 with: tags: '["${{ fromJson(needs.zerv-versioning.outputs.versions).v_semver }}"]' diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 3fdf7f96..488898ac 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run Trivy dependency scan - uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 with: scan-type: fs format: table diff --git a/.github/workflows/test-reproducibility.yml b/.github/workflows/test-reproducibility.yml index 6cfc8fdd..c9b66a07 100644 --- a/.github/workflows/test-reproducibility.yml +++ b/.github/workflows/test-reproducibility.yml @@ -87,6 +87,15 @@ jobs: - name: run-linting-to-verify-reproducibility run: bake lint + - name: convert-notebooks-to-python + run: bake nb-to-py + + - name: run-linting-to-verify-reproducibility-after-convert-nb-to-py + run: bake lint + + - name: check-consistency-with-json + run: bake check-consistency --backup .cache/leetcode + - name: copy-solution-files-from-backup run: | for problem in .cache/leetcode/*/; do diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bd39484e..0e14399d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -101,6 +101,6 @@ jobs: - name: sonarqube-scan if: matrix.python-version == inputs.target_python_version && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) - uses: SonarSource/sonarqube-scan-action@299e4b793aaa83bf2aba7c9c14bedbb485688ec4 # v7.1.0 + uses: SonarSource/sonarqube-scan-action@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/bakefile.py b/bakefile.py index 12a9cb82..e2905ede 100644 --- a/bakefile.py +++ b/bakefile.py @@ -1,10 +1,16 @@ +import difflib +import re import shutil +import tempfile from pathlib import Path from typing import Annotated import typer from bake import command, console from bakelib import GitHubActionsTools, PythonLibSpace +from rich.panel import Panel +from rich.syntax import Syntax +from rich.text import Text problem_option = Annotated[str | None, typer.Option("-p", "--problem")] force_option = Annotated[bool, typer.Option("-f", "--force")] @@ -12,7 +18,7 @@ class MyBakebook(GitHubActionsTools, PythonLibSpace): ci: bool = False - problem: str = "path_sum_iii" + problem: str = "powx_n" def lint(self) -> None: self.ctx.run("uv run python scripts/sort_tags.py") @@ -53,15 +59,15 @@ def problem_delete(self, problem: problem_option = None): shutil.rmtree(problem_path) console.echo(f"Deleted: {problem_path}") + def _convert_notebooks_to_python(self, base_dir: Path = Path("leetcode")) -> None: + self.ctx.run(f"uv run jupytext --to py:percent {base_dir}/**/*.ipynb") + for notebook in base_dir.rglob("*.ipynb"): + notebook.unlink() + @command("nb-to-py", help="Convert all .ipynb to .py and delete .ipynb") def notebook_to_python(self): console.echo("Converting all .ipynb files in leetcode/ to .py files...") - - # Find, convert, and delete all .ipynb files - for notebook in Path("leetcode").rglob("*.ipynb"): - self.ctx.run(f"uv run jupytext --to py:percent {notebook}") - notebook.unlink() - + self._convert_notebooks_to_python() console.success("Conversion complete. All .ipynb files converted to .py and deleted.") @command("check-test-cases", help="Find problems with few test cases") @@ -100,5 +106,140 @@ def gen_all_problems(self, force: force_option = False): force_flag = "--force" if force else "" self.ctx.run(f"uv run lcpy gen --all -o leetcode {force_flag}".strip()) + # leetcode/ is generated from JSON templates via `lcpy gen --all`: + # src/leetcode_py/cli/resources/leetcode/json/problems/*.json (source of truth) + # + src/.../leetcode/{{cookiecutter.problem_name}}/ (cookiecutter template) + # → leetcode//{solution.py, test_solution.py, helpers.py, ...} + # + # To fix drift: edit the JSON file in src/.../json/problems/, NOT the generated file. + @command("check-consistency", help="Check leetcode/ consistency with JSON source of truth") + def check_consistency( + self, + backup_dir: Annotated[ + str | None, + typer.Option("-b", "--backup", help="Path to backup directory (auto if omitted)"), + ] = None, + ): + leetcode_path = Path("leetcode") + + if not leetcode_path.exists(): + console.error("leetcode/ directory not found") + raise typer.Exit(1) + + auto_mode = backup_dir is None + if auto_mode: + with tempfile.TemporaryDirectory() as tmp: + backup_path = Path(tmp) / "leetcode" + console.echo("Auto-backing up leetcode/...") + shutil.copytree(leetcode_path, backup_path) + console.echo("Deleting leetcode/...") + shutil.rmtree(leetcode_path) + console.echo("Regenerating all problems...") + self.ctx.run("uv run lcpy gen --all -o leetcode --force") + console.echo("Converting notebooks to .py...") + self._convert_notebooks_to_python(leetcode_path) + console.echo("Linting generated files...") + self.lint() + try: + self._run_consistency_check(leetcode_path, backup_path) + finally: + console.echo("Restoring original leetcode/...") + shutil.rmtree(leetcode_path) + shutil.copytree(backup_path, leetcode_path) + else: + backup_path = Path(backup_dir) + if not backup_path.exists(): + console.error(f"Backup directory not found: {backup_dir}") + raise typer.Exit(1) + self._run_consistency_check(leetcode_path, backup_path) + + def _run_consistency_check(self, leetcode_path: Path, backup_path: Path) -> None: + files_to_check = [ + "README.md", + "__init__.py", + "helpers.py", + "test_solution.py", + "playground.py", + ] + drifted_files: list[str] = [] + drifted_problems: set[str] = set() + + for problem_dir in sorted(leetcode_path.iterdir()): + if not problem_dir.is_dir(): + continue + + problem_name = problem_dir.name + backup_problem = backup_path / problem_name + + if not backup_problem.exists(): + console.echo(f" New problem (not in backup): {problem_name}") + continue + + for filename in files_to_check: + current_file = problem_dir / filename + backup_file = backup_problem / filename + + if not current_file.exists() and not backup_file.exists(): + continue + + if current_file.exists() != backup_file.exists(): + relative = f"leetcode/{problem_name}/{filename}" + drifted_files.append(relative) + drifted_problems.add(problem_name) + status = "missing in backup" if backup_file.exists() else "missing in generated" + console.error(f" Drift: {relative} ({status})") + continue + + current_text = current_file.read_text() + backup_text = backup_file.read_text() + + if filename == "playground.py": + current_text = self._strip_jupytext_metadata(current_text) + backup_text = self._strip_jupytext_metadata(backup_text) + + if current_text != backup_text: + relative = f"leetcode/{problem_name}/{filename}" + drifted_files.append(relative) + drifted_problems.add(problem_name) + diff = difflib.unified_diff( + backup_text.splitlines(), + current_text.splitlines(), + fromfile=f"committed/{relative}", + tofile=f"generated/{relative}", + lineterm="", + ) + diff_text = "\n".join(diff) + syntax = Syntax(diff_text, "diff", theme="monokai") + console.err.print( + Panel( + syntax, + title=f"[bold red]Drift:[/] {relative}", + border_style="red", + padding=(0, 1), + ) + ) + + if drifted_files: + console.echo("") + console.error( + f"Consistency check FAILED: {len(drifted_problems)} problem(s) " + f"have drift across {len(drifted_files)} file(s)" + ) + fix_text = Text.from_markup( + "[bold]Fix:[/] update JSON or generated file so they stay consistent.\n\n" + "[dim]JSON:[/] " + "src/leetcode_py/cli/resources/leetcode/json/problems/.json\n" + "[dim]Template:[/] " + "src/leetcode_py/cli/resources/leetcode/{{cookiecutter.problem_name}}/" + ) + console.err.print(Panel(fix_text, border_style="yellow", padding=(0, 2))) + raise typer.Exit(1) + + console.success("Consistency check PASSED: all files match JSON source of truth") + + @staticmethod + def _strip_jupytext_metadata(text: str) -> str: + return re.sub(r"^# ---\n#.*?\n# ---\n", "", text, count=1, flags=re.DOTALL) + bakebook = MyBakebook() diff --git a/leetcode/accounts_merge/README.md b/leetcode/accounts_merge/README.md index dd3f61e2..4f66ede0 100644 --- a/leetcode/accounts_merge/README.md +++ b/leetcode/accounts_merge/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, String, Depth-First Search, Breadth-First Search, Union Find, Sorting -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 721](https://leetcode.com/problems/accounts-merge/description/) diff --git a/leetcode/accounts_merge/playground.py b/leetcode/accounts_merge/playground.py index d2ee36c8..407ca02a 100644 --- a/leetcode/accounts_merge/playground.py +++ b/leetcode/accounts_merge/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/add_binary/README.md b/leetcode/add_binary/README.md index 92224a0b..021e1bd2 100644 --- a/leetcode/add_binary/README.md +++ b/leetcode/add_binary/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Math, String, Bit Manipulation, Simulation -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 67](https://leetcode.com/problems/add-binary/description/) diff --git a/leetcode/add_binary/playground.py b/leetcode/add_binary/playground.py index 41e3fddd..334d07b3 100644 --- a/leetcode/add_binary/playground.py +++ b/leetcode/add_binary/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/add_two_numbers/README.md b/leetcode/add_two_numbers/README.md index b684a223..457bc7ae 100644 --- a/leetcode/add_two_numbers/README.md +++ b/leetcode/add_two_numbers/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Linked List, Math, Recursion -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 2](https://leetcode.com/problems/add-two-numbers/description/) diff --git a/leetcode/add_two_numbers/playground.py b/leetcode/add_two_numbers/playground.py index 8b576b5d..ba01944d 100644 --- a/leetcode/add_two_numbers/playground.py +++ b/leetcode/add_two_numbers/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/alien_dictionary/README.md b/leetcode/alien_dictionary/README.md index 2861950e..1281c733 100644 --- a/leetcode/alien_dictionary/README.md +++ b/leetcode/alien_dictionary/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, String, Depth-First Search, Breadth-First Search, Graph, Topological Sort -**Tags:** grind-75, grind +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 269](https://leetcode.com/problems/alien-dictionary/description/) diff --git a/leetcode/alien_dictionary/playground.py b/leetcode/alien_dictionary/playground.py index 147f8456..72ae56e9 100644 --- a/leetcode/alien_dictionary/playground.py +++ b/leetcode/alien_dictionary/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/balanced_binary_tree/README.md b/leetcode/balanced_binary_tree/README.md index 776d6aa3..5878e225 100644 --- a/leetcode/balanced_binary_tree/README.md +++ b/leetcode/balanced_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 110](https://leetcode.com/problems/balanced-binary-tree/description/) diff --git a/leetcode/balanced_binary_tree/playground.py b/leetcode/balanced_binary_tree/playground.py index 900c979b..c6699bda 100644 --- a/leetcode/balanced_binary_tree/playground.py +++ b/leetcode/balanced_binary_tree/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python @@ -16,8 +16,6 @@ from helpers import assert_is_balanced, run_is_balanced from solution import Solution -from leetcode_py import TreeNode - # %% # Example test case root_list: list[int | None] = [3, 9, 20, None, None, 15, 7] @@ -27,9 +25,5 @@ result = run_is_balanced(Solution, root_list) result -# %% -root = TreeNode.from_list(root_list) -root - # %% assert_is_balanced(result, expected) diff --git a/leetcode/basic_calculator/README.md b/leetcode/basic_calculator/README.md index 885a6c8e..2c70b50e 100644 --- a/leetcode/basic_calculator/README.md +++ b/leetcode/basic_calculator/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Math, String, Stack, Recursion -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 224](https://leetcode.com/problems/basic-calculator/description/) diff --git a/leetcode/basic_calculator/playground.py b/leetcode/basic_calculator/playground.py index 261975f8..d9b2d1fb 100644 --- a/leetcode/basic_calculator/playground.py +++ b/leetcode/basic_calculator/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/basic_calculator/test_solution.py b/leetcode/basic_calculator/test_solution.py index 6bbc8710..d0d0abaa 100644 --- a/leetcode/basic_calculator/test_solution.py +++ b/leetcode/basic_calculator/test_solution.py @@ -22,7 +22,6 @@ def setup_method(self): ("-(1+2)", -3), ("2147483647", 2147483647), ("1-1+1", 1), - # Additional edge cases from old tests ("0", 0), ("-0", 0), ("1+(2+3)", 6), @@ -44,24 +43,3 @@ def setup_method(self): def test_calculate(self, s: str, expected: int): result = run_calculate(Solution, s) assert_calculate(result, expected) - - @logged_test - @pytest.mark.parametrize( - "s, error_msg", - [ - ("(1+2", "Mismatched parentheses"), - ("1+2)", "Mismatched parentheses"), - ("((1+2)", "Mismatched parentheses"), - ("1+2))", "Mismatched parentheses"), - ("1*2", r"Invalid character: '\*'"), - ("1/2", "Invalid character: '/'"), - ("1%2", "Invalid character: '%'"), - ("1^2", r"Invalid character: '\^'"), - ("1&2", "Invalid character: '&'"), - ("a+b", "Invalid character: 'a'"), - ("1+2.5", r"Invalid character: '\.'"), - ], - ) - def test_calculate_invalid_input(self, s: str, error_msg: str): - with pytest.raises(ValueError, match=error_msg): - self.solution.calculate(s) diff --git a/leetcode/basic_calculator/test_solution_extra.py b/leetcode/basic_calculator/test_solution_extra.py new file mode 100644 index 00000000..9094b6f8 --- /dev/null +++ b/leetcode/basic_calculator/test_solution_extra.py @@ -0,0 +1,31 @@ +import pytest + +from leetcode_py import logged_test + +from .solution import Solution + + +class TestBasicCalculatorExtra: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "s, error_msg", + [ + ("(1+2", "Mismatched parentheses"), + ("1+2)", "Mismatched parentheses"), + ("((1+2)", "Mismatched parentheses"), + ("1+2))", "Mismatched parentheses"), + ("1*2", r"Invalid character: '\*'"), + ("1/2", "Invalid character: '/'"), + ("1%2", "Invalid character: '%'"), + ("1^2", r"Invalid character: '\^'"), + ("1&2", "Invalid character: '&'"), + ("a+b", "Invalid character: 'a'"), + ("1+2.5", r"Invalid character: '\.'"), + ], + ) + def test_calculate_invalid_input(self, s: str, error_msg: str): + with pytest.raises(ValueError, match=error_msg): + self.solution.calculate(s) diff --git a/leetcode/best_time_to_buy_and_sell_stock/README.md b/leetcode/best_time_to_buy_and_sell_stock/README.md index a18f45b9..44a83b85 100644 --- a/leetcode/best_time_to_buy_and_sell_stock/README.md +++ b/leetcode/best_time_to_buy_and_sell_stock/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Dynamic Programming -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 121](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/) diff --git a/leetcode/best_time_to_buy_and_sell_stock/playground.py b/leetcode/best_time_to_buy_and_sell_stock/playground.py index e643984e..1ba2038f 100644 --- a/leetcode/best_time_to_buy_and_sell_stock/playground.py +++ b/leetcode/best_time_to_buy_and_sell_stock/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_search/README.md b/leetcode/binary_search/README.md index 16d04614..49b2b4c3 100644 --- a/leetcode/binary_search/README.md +++ b/leetcode/binary_search/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Binary Search -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 704](https://leetcode.com/problems/binary-search/description/) diff --git a/leetcode/binary_search/playground.py b/leetcode/binary_search/playground.py index 02af2a13..f74df79d 100644 --- a/leetcode/binary_search/playground.py +++ b/leetcode/binary_search/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_inorder_traversal/playground.py b/leetcode/binary_tree_inorder_traversal/playground.py index 859989c7..95e6b96e 100644 --- a/leetcode/binary_tree_inorder_traversal/playground.py +++ b/leetcode/binary_tree_inorder_traversal/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_level_order_traversal/README.md b/leetcode/binary_tree_level_order_traversal/README.md index 346f6232..23297557 100644 --- a/leetcode/binary_tree_level_order_traversal/README.md +++ b/leetcode/binary_tree_level_order_traversal/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Breadth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 102](https://leetcode.com/problems/binary-tree-level-order-traversal/description/) diff --git a/leetcode/binary_tree_level_order_traversal/playground.py b/leetcode/binary_tree_level_order_traversal/playground.py index 42a84cdb..a36eaf93 100644 --- a/leetcode/binary_tree_level_order_traversal/playground.py +++ b/leetcode/binary_tree_level_order_traversal/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_maximum_path_sum/README.md b/leetcode/binary_tree_maximum_path_sum/README.md index 1b0b7ef9..21c47c26 100644 --- a/leetcode/binary_tree_maximum_path_sum/README.md +++ b/leetcode/binary_tree_maximum_path_sum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Dynamic Programming, Tree, Depth-First Search, Binary Tree -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 124](https://leetcode.com/problems/binary-tree-maximum-path-sum/description/) diff --git a/leetcode/binary_tree_maximum_path_sum/playground.py b/leetcode/binary_tree_maximum_path_sum/playground.py index c24c7bf7..2c2f2083 100644 --- a/leetcode/binary_tree_maximum_path_sum/playground.py +++ b/leetcode/binary_tree_maximum_path_sum/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_postorder_traversal/playground.py b/leetcode/binary_tree_postorder_traversal/playground.py index 3a44e07f..19fb2ae1 100644 --- a/leetcode/binary_tree_postorder_traversal/playground.py +++ b/leetcode/binary_tree_postorder_traversal/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_preorder_traversal/playground.py b/leetcode/binary_tree_preorder_traversal/playground.py index 09c3cfa4..b95136bb 100644 --- a/leetcode/binary_tree_preorder_traversal/playground.py +++ b/leetcode/binary_tree_preorder_traversal/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/binary_tree_right_side_view/README.md b/leetcode/binary_tree_right_side_view/README.md index b44249ab..ae9d86d5 100644 --- a/leetcode/binary_tree_right_side_view/README.md +++ b/leetcode/binary_tree_right_side_view/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Depth-First Search, Breadth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 199](https://leetcode.com/problems/binary-tree-right-side-view/description/) diff --git a/leetcode/binary_tree_right_side_view/playground.py b/leetcode/binary_tree_right_side_view/playground.py index bbef9b51..279a9594 100644 --- a/leetcode/binary_tree_right_side_view/playground.py +++ b/leetcode/binary_tree_right_side_view/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python @@ -17,17 +16,11 @@ from helpers import assert_right_side_view, run_right_side_view from solution import Solution -from leetcode_py import TreeNode - # %% # Example test case root_list: list[int | None] = [1, 2, 3, None, 5, None, 4] expected = [1, 3, 4] -# %% -root = TreeNode.from_list(root_list) -root - # %% result = run_right_side_view(Solution, root_list) result diff --git a/leetcode/binary_tree_right_side_view/test_solution.py b/leetcode/binary_tree_right_side_view/test_solution.py index 260e71b8..0a04f7c0 100644 --- a/leetcode/binary_tree_right_side_view/test_solution.py +++ b/leetcode/binary_tree_right_side_view/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_right_side_view, run_right_side_view -from .solution import Solution, SolutionBFS, SolutionDFS +from .solution import Solution class TestBinaryTreeRightSideView: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionDFS, SolutionBFS]) @pytest.mark.parametrize( "root_list, expected", [ @@ -31,8 +30,6 @@ def setup_method(self): ([10, 5, 15, None, 6, 12, 20], [10, 15, 20]), ], ) - def test_right_side_view( - self, solution_class: type, root_list: list[int | None], expected: list[int] - ): - result = run_right_side_view(solution_class, root_list) + def test_right_side_view(self, root_list: list[int | None], expected: list[int]): + result = run_right_side_view(Solution, root_list) assert_right_side_view(result, expected) diff --git a/leetcode/binary_tree_right_side_view/test_solution_extra.py b/leetcode/binary_tree_right_side_view/test_solution_extra.py new file mode 100644 index 00000000..a963b1d7 --- /dev/null +++ b/leetcode/binary_tree_right_side_view/test_solution_extra.py @@ -0,0 +1,35 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_right_side_view, run_right_side_view +from .solution import SolutionBFS, SolutionDFS + + +class TestBinaryTreeRightSideViewExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionBFS, SolutionDFS]) + @pytest.mark.parametrize( + "root_list, expected", + [ + ([1, 2, 3, None, 5, None, 4], [1, 3, 4]), + ([1, 2, 3, 4, None, None, None, 5], [1, 3, 4, 5]), + ([1, None, 3], [1, 3]), + ([], []), + ([1], [1]), + ([1, 2], [1, 2]), + ([1, None, 2], [1, 2]), + ([1, 2, 3], [1, 3]), + ([1, 2, None, 4], [1, 2, 4]), + ([1, 2, 3, 4, 5, 6, 7], [1, 3, 7]), + ([1, 2, 3, None, None, 4, 5], [1, 3, 5]), + ([5, 4, 6, None, None, None, 7], [5, 6, 7]), + ([1, 2, 3, 4, 5, None, None, 8], [1, 3, 5, 8]), + ([10, 5, 15, None, 6, 12, 20], [10, 15, 20]), + ], + ) + def test_right_side_view( + self, solution_class: type, root_list: list[int | None], expected: list[int] + ): + result = run_right_side_view(solution_class, root_list) + assert_right_side_view(result, expected) diff --git a/leetcode/cheapest_flights_within_k_stops/README.md b/leetcode/cheapest_flights_within_k_stops/README.md index c8eb3c36..4f53038d 100644 --- a/leetcode/cheapest_flights_within_k_stops/README.md +++ b/leetcode/cheapest_flights_within_k_stops/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Dynamic Programming, Depth-First Search, Breadth-First Search, Graph Theory, Heap (Priority Queue), Shortest Path -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 787](https://leetcode.com/problems/cheapest-flights-within-k-stops/description/) diff --git a/leetcode/cheapest_flights_within_k_stops/playground.py b/leetcode/cheapest_flights_within_k_stops/playground.py index 5ac62883..4f019f0b 100644 --- a/leetcode/cheapest_flights_within_k_stops/playground.py +++ b/leetcode/cheapest_flights_within_k_stops/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/climbing_stairs/README.md b/leetcode/climbing_stairs/README.md index 18ea888c..6f0b4f7d 100644 --- a/leetcode/climbing_stairs/README.md +++ b/leetcode/climbing_stairs/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Math, Dynamic Programming, Memoization -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 70](https://leetcode.com/problems/climbing-stairs/description/) diff --git a/leetcode/climbing_stairs/playground.py b/leetcode/climbing_stairs/playground.py index 51601a57..a5e9106d 100644 --- a/leetcode/climbing_stairs/playground.py +++ b/leetcode/climbing_stairs/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/clone_graph/README.md b/leetcode/clone_graph/README.md index 2e20837b..f77e5e18 100644 --- a/leetcode/clone_graph/README.md +++ b/leetcode/clone_graph/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, Depth-First Search, Breadth-First Search, Graph -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 133](https://leetcode.com/problems/clone-graph/description/) diff --git a/leetcode/clone_graph/playground.py b/leetcode/clone_graph/playground.py index 509f0518..1a5ed195 100644 --- a/leetcode/clone_graph/playground.py +++ b/leetcode/clone_graph/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/clone_graph/test_solution.py b/leetcode/clone_graph/test_solution.py index 4bc8818b..b6107d88 100644 --- a/leetcode/clone_graph/test_solution.py +++ b/leetcode/clone_graph/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_clone_graph, run_clone_graph -from .solution import Solution, SolutionBFS, SolutionDFS +from .solution import Solution class TestCloneGraph: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionBFS, SolutionDFS]) @pytest.mark.parametrize( "adj_list", [ @@ -29,6 +28,6 @@ def setup_method(self): [[2], [3], [4], [5], []], ], ) - def test_clone_graph(self, solution_class: type, adj_list: list[list[int]]): - result = run_clone_graph(solution_class, adj_list) + def test_clone_graph(self, adj_list: list[list[int]]): + result = run_clone_graph(Solution, adj_list) assert_clone_graph(result, adj_list) diff --git a/leetcode/clone_graph/test_solution_extra.py b/leetcode/clone_graph/test_solution_extra.py new file mode 100644 index 00000000..32b66df4 --- /dev/null +++ b/leetcode/clone_graph/test_solution_extra.py @@ -0,0 +1,31 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_clone_graph, run_clone_graph +from .solution import SolutionBFS, SolutionDFS + + +class TestCloneGraphExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionBFS, SolutionDFS]) + @pytest.mark.parametrize( + "adj_list", + [ + [[2, 4], [1, 3], [2, 4], [1, 3]], + [[]], + [], + [[2], [1]], + [[2, 3], [1], [1]], + [[2], [3], [4], []], + [[2, 3, 4], [1], [1], [1]], + [[2, 3], [1, 3], [1, 2]], + [[2, 5], [1, 3], [2, 4], [3, 5], [1, 4]], + [[2, 3], [1, 4], [1, 4], [2, 3]], + [[2, 3, 4, 5], [1], [1], [1], [1]], + [[2], [3], [4], [5], []], + ], + ) + def test_clone_graph(self, solution_class: type, adj_list: list[list[int]]): + result = run_clone_graph(solution_class, adj_list) + assert_clone_graph(result, adj_list) diff --git a/leetcode/coin_change/README.md b/leetcode/coin_change/README.md index 54b005e5..32e4e787 100644 --- a/leetcode/coin_change/README.md +++ b/leetcode/coin_change/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming, Breadth-First Search -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 322](https://leetcode.com/problems/coin-change/description/) diff --git a/leetcode/coin_change/playground.py b/leetcode/coin_change/playground.py index 99c925d7..7b90cdbd 100644 --- a/leetcode/coin_change/playground.py +++ b/leetcode/coin_change/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/combination_sum/README.md b/leetcode/combination_sum/README.md index 6d59d3e2..1a62d534 100644 --- a/leetcode/combination_sum/README.md +++ b/leetcode/combination_sum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Backtracking -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 39](https://leetcode.com/problems/combination-sum/description/) diff --git a/leetcode/combination_sum/playground.py b/leetcode/combination_sum/playground.py index c971550a..d3981e9a 100644 --- a/leetcode/combination_sum/playground.py +++ b/leetcode/combination_sum/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/combination_sum_ii/README.md b/leetcode/combination_sum_ii/README.md new file mode 100644 index 00000000..f21eee07 --- /dev/null +++ b/leetcode/combination_sum_ii/README.md @@ -0,0 +1,37 @@ +# Combination Sum II + +**Difficulty:** Medium +**Topics:** Array, Backtracking +**Tags:** neetcode-150 + +**LeetCode:** [Problem 40](https://leetcode.com/problems/combination-sum-ii/description/) + +## Problem Description + +Given a collection of candidate numbers (`candidates`) and a target number (`target`), find all unique combinations in `candidates` where the candidate numbers sum to `target`. + +Each number in `candidates` may only be used **once** in the combination. + +**Note:** The solution set must not contain duplicate combinations. + +## Examples + +### Example 1: + +``` +Input: candidates = [10,1,2,7,6,1,5], target = 8 +Output: [[1,1,6],[1,2,5],[1,7],[2,6]] +``` + +### Example 2: + +``` +Input: candidates = [2,5,2,1,2], target = 5 +Output: [[1,2,2],[5]] +``` + +## Constraints + +- 1 <= candidates.length <= 100 +- 1 <= candidates[i] <= 50 +- 1 <= target <= 30 diff --git a/leetcode/combination_sum_ii/__init__.py b/leetcode/combination_sum_ii/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/leetcode/combination_sum_ii/helpers.py b/leetcode/combination_sum_ii/helpers.py new file mode 100644 index 00000000..df4b5481 --- /dev/null +++ b/leetcode/combination_sum_ii/helpers.py @@ -0,0 +1,10 @@ +def run_combination_sum2(solution_class: type, candidates: list[int], target: int): + implementation = solution_class() + result = implementation.combination_sum2(candidates, target) + return sorted([sorted(combo) for combo in result]) + + +def assert_combination_sum2(result: list[list[int]], expected: list[list[int]]) -> bool: + expected_sorted = sorted([sorted(combo) for combo in expected]) + assert result == expected_sorted + return True diff --git a/leetcode/combination_sum_ii/playground.py b/leetcode/combination_sum_ii/playground.py new file mode 100644 index 00000000..f440e047 --- /dev/null +++ b/leetcode/combination_sum_ii/playground.py @@ -0,0 +1,30 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.19.2 +# kernelspec: +# display_name: leetcode-py-py3.13 +# language: python +# name: python3 +# --- + +# %% +from helpers import assert_combination_sum2, run_combination_sum2 +from solution import Solution + +# %% +# Example test case +candidates = [10, 1, 2, 7, 6, 1, 5] +target = 8 +expected = [[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]] + +# %% +result = run_combination_sum2(Solution, candidates, target) +result + +# %% +assert_combination_sum2(result, expected) diff --git a/leetcode/combination_sum_ii/solution.py b/leetcode/combination_sum_ii/solution.py new file mode 100644 index 00000000..81705255 --- /dev/null +++ b/leetcode/combination_sum_ii/solution.py @@ -0,0 +1,22 @@ +class Solution: + # Time: O(2^n) + # Space: O(n) + def combination_sum2(self, candidates: list[int], target: int) -> list[list[int]]: + candidates.sort() + result: list[list[int]] = [] + + def backtrack(start: int, remaining: int, path: list[int]) -> None: + if remaining == 0: + result.append(path[:]) + return + for i in range(start, len(candidates)): + if i > start and candidates[i] == candidates[i - 1]: + continue + if candidates[i] > remaining: + break + path.append(candidates[i]) + backtrack(i + 1, remaining - candidates[i], path) + path.pop() + + backtrack(0, target, []) + return result diff --git a/leetcode/combination_sum_ii/test_solution.py b/leetcode/combination_sum_ii/test_solution.py new file mode 100644 index 00000000..ef1ea72d --- /dev/null +++ b/leetcode/combination_sum_ii/test_solution.py @@ -0,0 +1,35 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_combination_sum2, run_combination_sum2 +from .solution import Solution + + +class TestCombinationSumII: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "candidates, target, expected", + [ + ([10, 1, 2, 7, 6, 1, 5], 8, [[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]]), + ([2, 5, 2, 1, 2], 5, [[1, 2, 2], [5]]), + ([1], 1, [[1]]), + ([1], 2, []), + ([2], 1, []), + ([1, 1], 2, [[1, 1]]), + ([1, 1, 1], 2, [[1, 1]]), + ([1, 1, 1, 1, 1], 3, [[1, 1, 1]]), + ([1, 2], 4, []), + ([1, 2, 3], 3, [[1, 2], [3]]), + ([5, 3, 2, 1], 6, [[1, 2, 3], [1, 5]]), + ([1, 2, 2, 2, 5], 5, [[1, 2, 2], [5]]), + ([2, 2, 2], 4, [[2, 2]]), + ([1, 1, 2, 2], 4, [[1, 1, 2], [2, 2]]), + ], + ) + def test_combination_sum2(self, candidates: list[int], target: int, expected: list[list[int]]): + result = run_combination_sum2(Solution, candidates, target) + assert_combination_sum2(result, expected) diff --git a/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/README.md b/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/README.md index 1fff6761..299bf306 100644 --- a/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/README.md +++ b/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Divide and Conquer, Tree, Binary Tree -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 105](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/) diff --git a/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/playground.py b/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/playground.py index fa4baf42..e7277fd1 100644 --- a/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/playground.py +++ b/leetcode/construct_binary_tree_from_preorder_and_inorder_traversal/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/container_with_most_water/README.md b/leetcode/container_with_most_water/README.md index a9ee63f5..82cc43d5 100644 --- a/leetcode/container_with_most_water/README.md +++ b/leetcode/container_with_most_water/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Two Pointers, Greedy -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 11](https://leetcode.com/problems/container-with-most-water/description/) diff --git a/leetcode/container_with_most_water/playground.py b/leetcode/container_with_most_water/playground.py index 6d9f266b..1c438976 100644 --- a/leetcode/container_with_most_water/playground.py +++ b/leetcode/container_with_most_water/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/contains_duplicate/README.md b/leetcode/contains_duplicate/README.md index c09c400a..d903fdc3 100644 --- a/leetcode/contains_duplicate/README.md +++ b/leetcode/contains_duplicate/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Hash Table, Sorting -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 217](https://leetcode.com/problems/contains-duplicate/description/) diff --git a/leetcode/contains_duplicate/playground.py b/leetcode/contains_duplicate/playground.py index 84b60647..5c9bd27b 100644 --- a/leetcode/contains_duplicate/playground.py +++ b/leetcode/contains_duplicate/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/contiguous_array/playground.py b/leetcode/contiguous_array/playground.py index f94714d2..0de716c9 100644 --- a/leetcode/contiguous_array/playground.py +++ b/leetcode/contiguous_array/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/counting_bits/README.md b/leetcode/counting_bits/README.md index b57a6661..74573b60 100644 --- a/leetcode/counting_bits/README.md +++ b/leetcode/counting_bits/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Dynamic Programming, Bit Manipulation -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 338](https://leetcode.com/problems/counting-bits/description/) diff --git a/leetcode/counting_bits/playground.py b/leetcode/counting_bits/playground.py index 65343cf3..fb339b6a 100644 --- a/leetcode/counting_bits/playground.py +++ b/leetcode/counting_bits/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/course_schedule/README.md b/leetcode/course_schedule/README.md index bdc1cdd5..d2211d15 100644 --- a/leetcode/course_schedule/README.md +++ b/leetcode/course_schedule/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Graph, Topological Sort -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 207](https://leetcode.com/problems/course-schedule/description/) diff --git a/leetcode/course_schedule/playground.py b/leetcode/course_schedule/playground.py index f1e4aef6..867ea936 100644 --- a/leetcode/course_schedule/playground.py +++ b/leetcode/course_schedule/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/course_schedule_ii/README.md b/leetcode/course_schedule_ii/README.md index cd49468e..c6b5ec9d 100644 --- a/leetcode/course_schedule_ii/README.md +++ b/leetcode/course_schedule_ii/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Graph, Topological Sort -**Tags:** grind +**Tags:** algo-master-75, grind, neetcode-150 **LeetCode:** [Problem 210](https://leetcode.com/problems/course-schedule-ii/description/) diff --git a/leetcode/course_schedule_ii/playground.py b/leetcode/course_schedule_ii/playground.py index 4c8d4246..b55bf3de 100644 --- a/leetcode/course_schedule_ii/playground.py +++ b/leetcode/course_schedule_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/course_schedule_ii/test_solution.py b/leetcode/course_schedule_ii/test_solution.py index c8e664a0..809d0ad2 100644 --- a/leetcode/course_schedule_ii/test_solution.py +++ b/leetcode/course_schedule_ii/test_solution.py @@ -31,11 +31,7 @@ def setup_method(self): (3, [[0, 1], [1, 0], [2, 1]], []), (4, [[1, 0], [2, 0], [3, 0]], [0, 1, 2, 3]), (5, [[1, 0], [2, 1], [3, 2], [4, 3], [0, 4]], []), - ( - 7, - [[1, 0], [2, 0], [3, 1], [4, 1], [5, 2], [6, 2]], - [0, 1, 2, 3, 4, 5, 6], - ), + (7, [[1, 0], [2, 0], [3, 1], [4, 1], [5, 2], [6, 2]], [0, 1, 2, 3, 4, 5, 6]), ], ) def test_find_order( diff --git a/leetcode/daily_temperatures/README.md b/leetcode/daily_temperatures/README.md index ce4e11f2..9bf9a892 100644 --- a/leetcode/daily_temperatures/README.md +++ b/leetcode/daily_temperatures/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Stack, Monotonic Stack -**Tags:** grind +**Tags:** grind, neetcode-150 **LeetCode:** [Problem 739](https://leetcode.com/problems/daily-temperatures/description/) diff --git a/leetcode/daily_temperatures/playground.py b/leetcode/daily_temperatures/playground.py index 18c07bf5..0662dd3d 100644 --- a/leetcode/daily_temperatures/playground.py +++ b/leetcode/daily_temperatures/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/decode_string/playground.py b/leetcode/decode_string/playground.py index e67cb0fb..8c57d496 100644 --- a/leetcode/decode_string/playground.py +++ b/leetcode/decode_string/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/decode_ways/README.md b/leetcode/decode_ways/README.md index 3d15f9c8..b793028d 100644 --- a/leetcode/decode_ways/README.md +++ b/leetcode/decode_ways/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** String, Dynamic Programming -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 91](https://leetcode.com/problems/decode-ways/description/) diff --git a/leetcode/decode_ways/playground.py b/leetcode/decode_ways/playground.py index f25ee803..04fe0af0 100644 --- a/leetcode/decode_ways/playground.py +++ b/leetcode/decode_ways/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/design_add_and_search_words_data_structure/README.md b/leetcode/design_add_and_search_words_data_structure/README.md index 7ea8ac7b..0905631e 100644 --- a/leetcode/design_add_and_search_words_data_structure/README.md +++ b/leetcode/design_add_and_search_words_data_structure/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** String, Depth-First Search, Design, Trie -**Tags:** grind +**Tags:** blind-75, grind, neetcode-150 **LeetCode:** [Problem 211](https://leetcode.com/problems/design-add-and-search-words-data-structure/description/) diff --git a/leetcode/design_add_and_search_words_data_structure/playground.py b/leetcode/design_add_and_search_words_data_structure/playground.py index c349e25c..27596a18 100644 --- a/leetcode/design_add_and_search_words_data_structure/playground.py +++ b/leetcode/design_add_and_search_words_data_structure/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/design_add_and_search_words_data_structure/test_solution.py b/leetcode/design_add_and_search_words_data_structure/test_solution.py index 0f607dd2..e71fc8bf 100644 --- a/leetcode/design_add_and_search_words_data_structure/test_solution.py +++ b/leetcode/design_add_and_search_words_data_structure/test_solution.py @@ -92,24 +92,8 @@ class TestDesignAddAndSearchWordsDataStructure: [None, None, None, None, True, True, True, False], ), ( - [ - "WordDictionary", - "addWord", - "addWord", - "addWord", - "search", - "search", - "search", - ], - [ - [], - ["run"], - ["runner"], - ["running"], - ["run"], - ["run..."], - ["run....."], - ], + ["WordDictionary", "addWord", "addWord", "addWord", "search", "search", "search"], + [[], ["run"], ["runner"], ["running"], ["run"], ["run..."], ["run....."]], [None, None, None, None, True, True, False], ), ( @@ -120,10 +104,7 @@ class TestDesignAddAndSearchWordsDataStructure: ], ) def test_word_dictionary( - self, - operations: list[str], - inputs: list[list[str]], - expected: list[bool | None], + self, operations: list[str], inputs: list[list[str]], expected: list[bool | None] ): result = run_word_dictionary(WordDictionary, operations, inputs) assert_word_dictionary(result, expected) diff --git a/leetcode/design_in_memory_file_system/playground.py b/leetcode/design_in_memory_file_system/playground.py index efb17aa6..11a32e43 100644 --- a/leetcode/design_in_memory_file_system/playground.py +++ b/leetcode/design_in_memory_file_system/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/design_in_memory_file_system/test_solution.py b/leetcode/design_in_memory_file_system/test_solution.py index ad0c3dab..9c39ec29 100644 --- a/leetcode/design_in_memory_file_system/test_solution.py +++ b/leetcode/design_in_memory_file_system/test_solution.py @@ -12,14 +12,7 @@ class TestDesignInMemoryFileSystem: "operations, inputs, expected", [ ( - [ - "FileSystem", - "ls", - "mkdir", - "addContentToFile", - "ls", - "readContentFromFile", - ], + ["FileSystem", "ls", "mkdir", "addContentToFile", "ls", "readContentFromFile"], [[], ["/"], ["/a/b/c"], ["/a/b/c/d", "hello"], ["/"], ["/a/b/c/d"]], [None, [], None, None, ["a"], "hello"], ), @@ -29,13 +22,7 @@ class TestDesignInMemoryFileSystem: [None, [], None, ["a"], None, ["a"]], ), ( - [ - "FileSystem", - "mkdir", - "addContentToFile", - "ls", - "readContentFromFile", - ], + ["FileSystem", "mkdir", "addContentToFile", "ls", "readContentFromFile"], [[], ["/x/y"], ["/x/y/z", "content"], ["/x/y"], ["/x/y/z"]], [None, None, None, ["z"], "content"], ), @@ -67,29 +54,12 @@ class TestDesignInMemoryFileSystem: [None, None, ["file"], "data"], ), ( - [ - "FileSystem", - "mkdir", - "addContentToFile", - "ls", - "readContentFromFile", - ], - [ - [], - ["/folder"], - ["/folder/doc", "text"], - ["/folder"], - ["/folder/doc"], - ], + ["FileSystem", "mkdir", "addContentToFile", "ls", "readContentFromFile"], + [[], ["/folder"], ["/folder/doc", "text"], ["/folder"], ["/folder/doc"]], [None, None, None, ["doc"], "text"], ), ( - [ - "FileSystem", - "addContentToFile", - "addContentToFile", - "readContentFromFile", - ], + ["FileSystem", "addContentToFile", "addContentToFile", "readContentFromFile"], [[], ["/log", "line1"], ["/log", "line2"], ["/log"]], [None, None, None, "line1line2"], ), @@ -120,10 +90,7 @@ class TestDesignInMemoryFileSystem: ], ) def test_file_system( - self, - operations: list[str], - inputs: list[list], - expected: list[str | list[str] | None], + self, operations: list[str], inputs: list[list], expected: list[str | list[str] | None] ): result, _ = run_file_system(FileSystem, operations, inputs) assert_file_system(result, expected) diff --git a/leetcode/diagonal_traverse/playground.py b/leetcode/diagonal_traverse/playground.py index ffdfc995..d616b3ad 100644 --- a/leetcode/diagonal_traverse/playground.py +++ b/leetcode/diagonal_traverse/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/diagonal_traverse/test_solution.py b/leetcode/diagonal_traverse/test_solution.py index e122fa86..a8c3e70f 100644 --- a/leetcode/diagonal_traverse/test_solution.py +++ b/leetcode/diagonal_traverse/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_find_diagonal_order, run_find_diagonal_order -from .solution import Solution, SolutionRowShift +from .solution import Solution class TestDiagonalTraverse: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionRowShift]) @pytest.mark.parametrize( "mat, expected", [ @@ -32,6 +31,6 @@ def setup_method(self): ([[100]], [100]), ], ) - def test_find_diagonal_order(self, solution_class, mat: list[list[int]], expected: list[int]): - result = run_find_diagonal_order(solution_class, mat) + def test_find_diagonal_order(self, mat: list[list[int]], expected: list[int]): + result = run_find_diagonal_order(Solution, mat) assert_find_diagonal_order(result, expected) diff --git a/leetcode/diagonal_traverse/test_solution_extra.py b/leetcode/diagonal_traverse/test_solution_extra.py new file mode 100644 index 00000000..44f16977 --- /dev/null +++ b/leetcode/diagonal_traverse/test_solution_extra.py @@ -0,0 +1,36 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_find_diagonal_order, run_find_diagonal_order +from .solution import SolutionRowShift + + +class TestDiagonalTraverseExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionRowShift]) + @pytest.mark.parametrize( + "mat, expected", + [ + ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], [1, 2, 4, 7, 5, 3, 6, 8, 9]), + ([[1, 2], [3, 4]], [1, 2, 3, 4]), + ([[1]], [1]), + ([[1, 2, 3]], [1, 2, 3]), + ([[1], [2], [3]], [1, 2, 3]), + ([[1, 2, 3, 4], [5, 6, 7, 8]], [1, 2, 5, 6, 3, 4, 7, 8]), + ([[1, 2], [3, 4], [5, 6]], [1, 2, 3, 5, 4, 6]), + ([[1, 2, 3, 4, 5]], [1, 2, 3, 4, 5]), + ([[1], [2], [3], [4], [5]], [1, 2, 3, 4, 5]), + ( + [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], + [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12], + ), + ([[-1, 0, 1], [2, -3, 4]], [-1, 0, 2, -3, 1, 4]), + ([[100]], [100]), + ], + ) + def test_find_diagonal_order( + self, solution_class: type, mat: list[list[int]], expected: list[int] + ): + result = run_find_diagonal_order(solution_class, mat) + assert_find_diagonal_order(result, expected) diff --git a/leetcode/diameter_of_binary_tree/README.md b/leetcode/diameter_of_binary_tree/README.md index 4b1580bc..8a747f9f 100644 --- a/leetcode/diameter_of_binary_tree/README.md +++ b/leetcode/diameter_of_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 543](https://leetcode.com/problems/diameter-of-binary-tree/description/) diff --git a/leetcode/diameter_of_binary_tree/playground.py b/leetcode/diameter_of_binary_tree/playground.py index afd819ae..61fde0ed 100644 --- a/leetcode/diameter_of_binary_tree/playground.py +++ b/leetcode/diameter_of_binary_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/encode_and_decode_strings/README.md b/leetcode/encode_and_decode_strings/README.md index d534c472..66f7251b 100644 --- a/leetcode/encode_and_decode_strings/README.md +++ b/leetcode/encode_and_decode_strings/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, String, Design -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 271](https://leetcode.com/problems/encode-and-decode-strings/description/) diff --git a/leetcode/encode_and_decode_strings/playground.py b/leetcode/encode_and_decode_strings/playground.py index 05befc64..295a3884 100644 --- a/leetcode/encode_and_decode_strings/playground.py +++ b/leetcode/encode_and_decode_strings/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/evaluate_reverse_polish_notation/README.md b/leetcode/evaluate_reverse_polish_notation/README.md index 4015f66c..25773af7 100644 --- a/leetcode/evaluate_reverse_polish_notation/README.md +++ b/leetcode/evaluate_reverse_polish_notation/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Math, Stack -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 150](https://leetcode.com/problems/evaluate-reverse-polish-notation/description/) diff --git a/leetcode/evaluate_reverse_polish_notation/playground.py b/leetcode/evaluate_reverse_polish_notation/playground.py index 8ecfa9fc..910b7fcb 100644 --- a/leetcode/evaluate_reverse_polish_notation/playground.py +++ b/leetcode/evaluate_reverse_polish_notation/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_all_anagrams_in_a_string/README.md b/leetcode/find_all_anagrams_in_a_string/README.md index d84fab3f..95066450 100644 --- a/leetcode/find_all_anagrams_in_a_string/README.md +++ b/leetcode/find_all_anagrams_in_a_string/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Sliding Window -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75 **LeetCode:** [Problem 438](https://leetcode.com/problems/find-all-anagrams-in-a-string/description/) diff --git a/leetcode/find_all_anagrams_in_a_string/playground.py b/leetcode/find_all_anagrams_in_a_string/playground.py index 42f330b0..638b7f2c 100644 --- a/leetcode/find_all_anagrams_in_a_string/playground.py +++ b/leetcode/find_all_anagrams_in_a_string/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_first_and_last_position_of_element_in_sorted_array/playground.py b/leetcode/find_first_and_last_position_of_element_in_sorted_array/playground.py index 078aac3b..1d2f8ab9 100644 --- a/leetcode/find_first_and_last_position_of_element_in_sorted_array/playground.py +++ b/leetcode/find_first_and_last_position_of_element_in_sorted_array/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_k_closest_elements/playground.py b/leetcode/find_k_closest_elements/playground.py index c8b8b8be..2c76a243 100644 --- a/leetcode/find_k_closest_elements/playground.py +++ b/leetcode/find_k_closest_elements/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_median_from_data_stream/README.md b/leetcode/find_median_from_data_stream/README.md index 90ace29c..066ec53b 100644 --- a/leetcode/find_median_from_data_stream/README.md +++ b/leetcode/find_median_from_data_stream/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Two Pointers, Design, Sorting, Heap (Priority Queue), Data Stream -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 295](https://leetcode.com/problems/find-median-from-data-stream/description/) diff --git a/leetcode/find_median_from_data_stream/playground.py b/leetcode/find_median_from_data_stream/playground.py index 351a75ad..b336afb3 100644 --- a/leetcode/find_median_from_data_stream/playground.py +++ b/leetcode/find_median_from_data_stream/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_median_from_data_stream/test_solution.py b/leetcode/find_median_from_data_stream/test_solution.py index f62dec88..b00b9356 100644 --- a/leetcode/find_median_from_data_stream/test_solution.py +++ b/leetcode/find_median_from_data_stream/test_solution.py @@ -3,12 +3,11 @@ from leetcode_py import logged_test from .helpers import assert_median_finder, run_median_finder -from .solution import MedianFinder, MedianFinderHybrid +from .solution import MedianFinder class TestFindMedianFromDataStream: @logged_test - @pytest.mark.parametrize("solution_class", [MedianFinder, MedianFinderHybrid]) @pytest.mark.parametrize( "operations, inputs, expected", [ @@ -129,11 +128,7 @@ class TestFindMedianFromDataStream: ], ) def test_median_finder( - self, - solution_class: type, - operations: list[str], - inputs: list[list[int]], - expected: list[float | None], + self, operations: list[str], inputs: list[list[int]], expected: list[float | None] ): - result, _ = run_median_finder(solution_class, operations, inputs) + result, _ = run_median_finder(MedianFinder, operations, inputs) assert_median_finder(result, expected) diff --git a/leetcode/find_median_from_data_stream/test_solution_extra.py b/leetcode/find_median_from_data_stream/test_solution_extra.py new file mode 100644 index 00000000..61dbdd53 --- /dev/null +++ b/leetcode/find_median_from_data_stream/test_solution_extra.py @@ -0,0 +1,139 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_median_finder, run_median_finder +from .solution import MedianFinderHybrid + + +class TestFindMedianFromDataStreamExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [MedianFinderHybrid]) + @pytest.mark.parametrize( + "operations, inputs, expected", + [ + ( + ["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"], + [[], [1], [2], [], [3], []], + [None, None, None, 1.5, None, 2.0], + ), + (["MedianFinder", "addNum", "findMedian"], [[], [1], []], [None, None, 1.0]), + ( + ["MedianFinder", "addNum", "addNum", "addNum", "findMedian"], + [[], [1], [1], [1], []], + [None, None, None, None, 1.0], + ), + ( + ["MedianFinder", "addNum", "addNum", "addNum", "addNum", "findMedian"], + [[], [1], [2], [3], [4], []], + [None, None, None, None, None, 2.5], + ), + ( + [ + "MedianFinder", + "addNum", + "addNum", + "findMedian", + "addNum", + "addNum", + "findMedian", + ], + [[], [-1], [0], [], [1], [2], []], + [None, None, None, -0.5, None, None, 0.5], + ), + ( + ["MedianFinder", "addNum", "addNum", "addNum", "addNum", "addNum", "findMedian"], + [[], [5], [1], [3], [2], [4], []], + [None, None, None, None, None, None, 3.0], + ), + ( + [ + "MedianFinder", + "addNum", + "findMedian", + "addNum", + "findMedian", + "addNum", + "findMedian", + ], + [[], [100000], [], [-100000], [], [0], []], + [None, None, 100000.0, None, 0.0, None, 0.0], + ), + ( + [ + "MedianFinder", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "findMedian", + ], + [[], [10], [5], [15], [3], [7], [12], [18], []], + [None, None, None, None, None, None, None, None, 10.0], + ), + ( + [ + "MedianFinder", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "findMedian", + ], + [[], [6], [10], [2], [6], [5], [0], []], + [None, None, None, None, None, None, None, 5.5], + ), + ( + [ + "MedianFinder", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "findMedian", + ], + [[], [1], [2], [3], [4], [5], [6], [7], [8], []], + [None, None, None, None, None, None, None, None, None, 4.5], + ), + ( + [ + "MedianFinder", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "addNum", + "findMedian", + ], + [[], [9], [8], [7], [6], [5], [4], [3], [2], [1], []], + [None, None, None, None, None, None, None, None, None, None, 5.0], + ), + ( + ["MedianFinder", "addNum", "addNum", "addNum", "addNum", "addNum", "findMedian"], + [[], [0], [0], [0], [0], [0], []], + [None, None, None, None, None, None, 0.0], + ), + ], + ) + def test_median_finder( + self, + solution_class: type, + operations: list[str], + inputs: list[list[int]], + expected: list[float | None], + ): + result, _ = run_median_finder(solution_class, operations, inputs) + assert_median_finder(result, expected) diff --git a/leetcode/find_minimum_in_rotated_sorted_array/README.md b/leetcode/find_minimum_in_rotated_sorted_array/README.md index f739190a..5ab357d9 100644 --- a/leetcode/find_minimum_in_rotated_sorted_array/README.md +++ b/leetcode/find_minimum_in_rotated_sorted_array/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Binary Search -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 153](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/) diff --git a/leetcode/find_minimum_in_rotated_sorted_array/playground.py b/leetcode/find_minimum_in_rotated_sorted_array/playground.py index 1255b05c..d1946ab0 100644 --- a/leetcode/find_minimum_in_rotated_sorted_array/playground.py +++ b/leetcode/find_minimum_in_rotated_sorted_array/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/find_minimum_in_rotated_sorted_array/test_solution.py b/leetcode/find_minimum_in_rotated_sorted_array/test_solution.py index f19f92b1..78ae9d1c 100644 --- a/leetcode/find_minimum_in_rotated_sorted_array/test_solution.py +++ b/leetcode/find_minimum_in_rotated_sorted_array/test_solution.py @@ -28,10 +28,7 @@ def setup_method(self): ([7, 8, 9, 10, 11, 12, 13, 14, 1, 2, 3, 4, 5, 6], 1), ([8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7], 1), ([9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1, 2, 3, 4, 5, 6, 7, 8], 1), - ( - [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9], - 1, - ), + ([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9], 1), ], ) def test_find_min(self, nums: list[int], expected: int): diff --git a/leetcode/find_the_duplicate_number/README.md b/leetcode/find_the_duplicate_number/README.md index c5ed9a4c..f36a51d0 100644 --- a/leetcode/find_the_duplicate_number/README.md +++ b/leetcode/find_the_duplicate_number/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Two Pointers, Binary Search, Bit Manipulation -**Tags:** grind +**Tags:** grind, neetcode-150 **LeetCode:** [Problem 287](https://leetcode.com/problems/find-the-duplicate-number/description/) diff --git a/leetcode/find_the_duplicate_number/playground.py b/leetcode/find_the_duplicate_number/playground.py index 407a4988..389c44b1 100644 --- a/leetcode/find_the_duplicate_number/playground.py +++ b/leetcode/find_the_duplicate_number/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/first_bad_version/README.md b/leetcode/first_bad_version/README.md index a710eb05..720b7a11 100644 --- a/leetcode/first_bad_version/README.md +++ b/leetcode/first_bad_version/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Binary Search, Interactive -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 278](https://leetcode.com/problems/first-bad-version/description/) diff --git a/leetcode/first_bad_version/playground.py b/leetcode/first_bad_version/playground.py index 34af8a1a..2dca4241 100644 --- a/leetcode/first_bad_version/playground.py +++ b/leetcode/first_bad_version/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/first_missing_positive/playground.py b/leetcode/first_missing_positive/playground.py index 7c286a4d..b1d58e4f 100644 --- a/leetcode/first_missing_positive/playground.py +++ b/leetcode/first_missing_positive/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/flood_fill/README.md b/leetcode/flood_fill/README.md index 24f808f5..3f77f207 100644 --- a/leetcode/flood_fill/README.md +++ b/leetcode/flood_fill/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Depth-First Search, Breadth-First Search, Matrix -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 733](https://leetcode.com/problems/flood-fill/description/) diff --git a/leetcode/flood_fill/playground.py b/leetcode/flood_fill/playground.py index 674fb9c1..56bb2863 100644 --- a/leetcode/flood_fill/playground.py +++ b/leetcode/flood_fill/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/gas_station/README.md b/leetcode/gas_station/README.md index ac00986a..4f635b0d 100644 --- a/leetcode/gas_station/README.md +++ b/leetcode/gas_station/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Greedy -**Tags:** grind +**Tags:** grind, neetcode-150 **LeetCode:** [Problem 134](https://leetcode.com/problems/gas-station/description/) diff --git a/leetcode/gas_station/playground.py b/leetcode/gas_station/playground.py index 10b8e6ed..7bdb2235 100644 --- a/leetcode/gas_station/playground.py +++ b/leetcode/gas_station/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/generate_parentheses/README.md b/leetcode/generate_parentheses/README.md new file mode 100644 index 00000000..d5536f6f --- /dev/null +++ b/leetcode/generate_parentheses/README.md @@ -0,0 +1,31 @@ +# Generate Parentheses + +**Difficulty:** Medium +**Topics:** String, Dynamic Programming, Backtracking +**Tags:** neetcode-150 + +**LeetCode:** [Problem 22](https://leetcode.com/problems/generate-parentheses/description/) + +## Problem Description + +Given `n` pairs of parentheses, write a function to generate all combinations of well-formed parentheses. + +## Examples + +### Example 1: + +``` +Input: n = 3 +Output: ["((()))","(()())","(())()","()(())","()()()"] +``` + +### Example 2: + +``` +Input: n = 1 +Output: ["()"] +``` + +## Constraints + +- 1 <= n <= 8 diff --git a/leetcode/generate_parentheses/__init__.py b/leetcode/generate_parentheses/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/leetcode/generate_parentheses/helpers.py b/leetcode/generate_parentheses/helpers.py new file mode 100644 index 00000000..18e41c67 --- /dev/null +++ b/leetcode/generate_parentheses/helpers.py @@ -0,0 +1,8 @@ +def run_generate_parenthesis(solution_class: type, n: int): + implementation = solution_class() + return sorted(implementation.generate_parenthesis(n)) + + +def assert_generate_parenthesis(result: list[str], expected: list[str]) -> bool: + assert sorted(result) == sorted(expected) + return True diff --git a/leetcode/generate_parentheses/playground.py b/leetcode/generate_parentheses/playground.py new file mode 100644 index 00000000..3a62d7f5 --- /dev/null +++ b/leetcode/generate_parentheses/playground.py @@ -0,0 +1,29 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.19.2 +# kernelspec: +# display_name: leetcode-py-py3.13 +# language: python +# name: python3 +# --- + +# %% +from helpers import assert_generate_parenthesis, run_generate_parenthesis +from solution import Solution + +# %% +# Example test case +n = 3 +expected = ["((()))", "(()())", "(())()", "()(())", "()()()"] + +# %% +result = run_generate_parenthesis(Solution, n) +result + +# %% +assert_generate_parenthesis(result, expected) diff --git a/leetcode/generate_parentheses/solution.py b/leetcode/generate_parentheses/solution.py new file mode 100644 index 00000000..368e9443 --- /dev/null +++ b/leetcode/generate_parentheses/solution.py @@ -0,0 +1,17 @@ +class Solution: + # Time: O(4^n / sqrt(n)) + # Space: O(4^n / sqrt(n)) + def generate_parenthesis(self, n: int) -> list[str]: + result: list[str] = [] + + def backtrack(s: str, open_count: int, close_count: int) -> None: + if len(s) == 2 * n: + result.append(s) + return + if open_count < n: + backtrack(s + "(", open_count + 1, close_count) + if close_count < open_count: + backtrack(s + ")", open_count, close_count + 1) + + backtrack("", 0, 0) + return result diff --git a/leetcode/generate_parentheses/test_solution.py b/leetcode/generate_parentheses/test_solution.py new file mode 100644 index 00000000..7b7357a5 --- /dev/null +++ b/leetcode/generate_parentheses/test_solution.py @@ -0,0 +1,96 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_generate_parenthesis, run_generate_parenthesis +from .solution import Solution + + +class TestGenerateParentheses: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "n, expected", + [ + (1, ["()"]), + (2, ["(())", "()()"]), + (3, ["((()))", "(()())", "(())()", "()(())", "()()()"]), + ( + 4, + [ + "(((())))", + "((()()))", + "((())())", + "((()))()", + "(()(()))", + "(()()())", + "(()())()", + "(())(())", + "(())()()", + "()((()))", + "()(()())", + "()(())()", + "()()(())", + "()()()()", + ], + ), + (0, [""]), + ( + 5, + [ + "((((()))))", + "(((()())))", + "(((())()))", + "(((()))())", + "(((())))()", + "((()(())))", + "((()()()))", + "((()())())", + "((()()))()", + "((())(()))", + "((())()())", + "((())())()", + "((()))(())", + "((()))()()", + "(()((())))", + "(()(()()))", + "(()(())())", + "(()(()))()", + "(()()(()))", + "(()()()())", + "(()()())()", + "(()())(())", + "(()())()()", + "(())((()))", + "(())(()())", + "(())(())()", + "(())()(())", + "(())()()()", + "()(((())))", + "()((()()))", + "()((())())", + "()((()))()", + "()(()(()))", + "()(()()())", + "()(()())()", + "()(())(())", + "()(())()()", + "()()((()))", + "()()(()())", + "()()(())()", + "()()()(())", + "()()()()()", + ], + ), + pytest.param(1, ["()"], id="dup1"), + pytest.param(2, ["(())", "()()"], id="dup2"), + pytest.param(3, ["((()))", "(()())", "(())()", "()(())", "()()()"], id="dup3a"), + pytest.param(3, ["((()))", "(()())", "(())()", "()(())", "()()()"], id="dup3b"), + pytest.param(3, ["((()))", "(()())", "(())()", "()(())", "()()()"], id="dup3c"), + ], + ) + def test_generate_parenthesis(self, n: int, expected: list[str]): + result = run_generate_parenthesis(Solution, n) + assert_generate_parenthesis(result, expected) diff --git a/leetcode/graph_valid_tree/README.md b/leetcode/graph_valid_tree/README.md index fef45297..4ba5a6ef 100644 --- a/leetcode/graph_valid_tree/README.md +++ b/leetcode/graph_valid_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Union Find, Graph -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 261](https://leetcode.com/problems/graph-valid-tree/description/) diff --git a/leetcode/graph_valid_tree/playground.py b/leetcode/graph_valid_tree/playground.py index 08583b7d..aebc50b8 100644 --- a/leetcode/graph_valid_tree/playground.py +++ b/leetcode/graph_valid_tree/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/group_anagrams/README.md b/leetcode/group_anagrams/README.md index c7f95618..46c645f5 100644 --- a/leetcode/group_anagrams/README.md +++ b/leetcode/group_anagrams/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, String, Sorting -**Tags:** grind +**Tags:** algo-master-75, blind-75, grind, neetcode-150 **LeetCode:** [Problem 49](https://leetcode.com/problems/group-anagrams/description/) diff --git a/leetcode/group_anagrams/playground.py b/leetcode/group_anagrams/playground.py index dd57ae4f..07c999fd 100644 --- a/leetcode/group_anagrams/playground.py +++ b/leetcode/group_anagrams/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/house_robber/README.md b/leetcode/house_robber/README.md index 1486e418..8dd2ffb6 100644 --- a/leetcode/house_robber/README.md +++ b/leetcode/house_robber/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming -**Tags:** grind +**Tags:** blind-75, grind, neetcode-150 **LeetCode:** [Problem 198](https://leetcode.com/problems/house-robber/description/) diff --git a/leetcode/house_robber/playground.py b/leetcode/house_robber/playground.py index 92a889ad..5cf70b1c 100644 --- a/leetcode/house_robber/playground.py +++ b/leetcode/house_robber/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/house_robber_ii/README.md b/leetcode/house_robber_ii/README.md index a86b7760..e3a93c8a 100644 --- a/leetcode/house_robber_ii/README.md +++ b/leetcode/house_robber_ii/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 213](https://leetcode.com/problems/house-robber-ii/description/) diff --git a/leetcode/house_robber_ii/playground.py b/leetcode/house_robber_ii/playground.py index ed5d6a2d..ad315ef6 100644 --- a/leetcode/house_robber_ii/playground.py +++ b/leetcode/house_robber_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/implement_queue_using_stacks/README.md b/leetcode/implement_queue_using_stacks/README.md index a1e659ff..c345ad3e 100644 --- a/leetcode/implement_queue_using_stacks/README.md +++ b/leetcode/implement_queue_using_stacks/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Stack, Design, Queue -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 232](https://leetcode.com/problems/implement-queue-using-stacks/description/) diff --git a/leetcode/implement_queue_using_stacks/playground.py b/leetcode/implement_queue_using_stacks/playground.py index 834b6b87..9ad2dff2 100644 --- a/leetcode/implement_queue_using_stacks/playground.py +++ b/leetcode/implement_queue_using_stacks/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/implement_trie_prefix_tree/README.md b/leetcode/implement_trie_prefix_tree/README.md index 7e0cd3cc..320623e0 100644 --- a/leetcode/implement_trie_prefix_tree/README.md +++ b/leetcode/implement_trie_prefix_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Design, Trie -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 208](https://leetcode.com/problems/implement-trie-prefix-tree/description/) diff --git a/leetcode/implement_trie_prefix_tree/helpers.py b/leetcode/implement_trie_prefix_tree/helpers.py index 17ae31a0..c8417511 100644 --- a/leetcode/implement_trie_prefix_tree/helpers.py +++ b/leetcode/implement_trie_prefix_tree/helpers.py @@ -10,7 +10,7 @@ def run_trie_operations(solution_class: type, operations: list[str], inputs: lis results.append(None) elif op == "search" and trie is not None: results.append(trie.search(inputs[i][0])) - elif op == "starts_with" and trie is not None: + elif op in ("starts_with", "startsWith") and trie is not None: results.append(trie.starts_with(inputs[i][0])) return results, trie diff --git a/leetcode/implement_trie_prefix_tree/playground.py b/leetcode/implement_trie_prefix_tree/playground.py index 815d6f6e..d9740ae5 100644 --- a/leetcode/implement_trie_prefix_tree/playground.py +++ b/leetcode/implement_trie_prefix_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/implement_trie_prefix_tree/test_solution.py b/leetcode/implement_trie_prefix_tree/test_solution.py index 62fe9d3e..2c764e74 100644 --- a/leetcode/implement_trie_prefix_tree/test_solution.py +++ b/leetcode/implement_trie_prefix_tree/test_solution.py @@ -36,11 +36,7 @@ class TestImplementTriePrefixTree: [[], ["a"], ["a"], ["a"]], [None, None, True, True], ), - ( - ["Trie", "search", "starts_with"], - [[], ["empty"], ["empty"]], - [None, False, False], - ), + (["Trie", "search", "starts_with"], [[], ["empty"], ["empty"]], [None, False, False]), ( ["Trie", "insert", "insert", "search", "search", "starts_with", "starts_with"], [[], ["word"], ["world"], ["word"], ["world"], ["wor"], ["wo"]], diff --git a/leetcode/insert_interval/README.md b/leetcode/insert_interval/README.md index aff876dd..20ddf2f6 100644 --- a/leetcode/insert_interval/README.md +++ b/leetcode/insert_interval/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 57](https://leetcode.com/problems/insert-interval/description/) diff --git a/leetcode/insert_interval/playground.py b/leetcode/insert_interval/playground.py index d895d174..3df4aee4 100644 --- a/leetcode/insert_interval/playground.py +++ b/leetcode/insert_interval/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/invert_binary_tree/README.md b/leetcode/invert_binary_tree/README.md index a2b7dedc..1d8b726b 100644 --- a/leetcode/invert_binary_tree/README.md +++ b/leetcode/invert_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, Breadth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 226](https://leetcode.com/problems/invert-binary-tree/description/) diff --git a/leetcode/invert_binary_tree/playground.py b/leetcode/invert_binary_tree/playground.py index 2805ae64..afbcaa08 100644 --- a/leetcode/invert_binary_tree/playground.py +++ b/leetcode/invert_binary_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/invert_binary_tree/test_solution.py b/leetcode/invert_binary_tree/test_solution.py index c86cc486..44195ad1 100644 --- a/leetcode/invert_binary_tree/test_solution.py +++ b/leetcode/invert_binary_tree/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_invert_tree, run_invert_tree -from .solution import Solution, SolutionBFS, SolutionDFS +from .solution import Solution class TestInvertBinaryTree: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionDFS, SolutionBFS]) @pytest.mark.parametrize( "root_list, expected_list", [ @@ -32,8 +31,6 @@ def setup_method(self): ([1, 2, 3, None, 4, None, 5], [1, 3, 2, 5, None, 4]), ], ) - def test_invert_tree( - self, solution_class: type, root_list: list[int | None], expected_list: list[int | None] - ): - result = run_invert_tree(solution_class, root_list) + def test_invert_tree(self, root_list: list[int | None], expected_list: list[int | None]): + result = run_invert_tree(Solution, root_list) assert_invert_tree(result, expected_list) diff --git a/leetcode/invert_binary_tree/test_solution_extra.py b/leetcode/invert_binary_tree/test_solution_extra.py new file mode 100644 index 00000000..2b4f31a5 --- /dev/null +++ b/leetcode/invert_binary_tree/test_solution_extra.py @@ -0,0 +1,36 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_invert_tree, run_invert_tree +from .solution import SolutionBFS, SolutionDFS + + +class TestInvertBinaryTreeExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionBFS, SolutionDFS]) + @pytest.mark.parametrize( + "root_list, expected_list", + [ + ([4, 2, 7, 1, 3, 6, 9], [4, 7, 2, 9, 6, 3, 1]), + ([2, 1, 3], [2, 3, 1]), + ([], []), + ([1], [1]), + ([1, 2], [1, None, 2]), + ([1, None, 2], [1, 2]), + ([1, 2, 3, 4, 5], [1, 3, 2, None, None, 5, 4]), + ([1, 2, 3, None, None, 4, 5], [1, 3, 2, 5, 4]), + ([1, 2, 3, 4, 5, 6, 7], [1, 3, 2, 7, 6, 5, 4]), + ([5, 3, 8, 2, 4, 7, 9], [5, 8, 3, 9, 7, 4, 2]), + ([10, 5, 15, None, 6, 12, 20], [10, 15, 5, 20, 12, 6]), + ([1, 2, None, 3], [1, None, 2, None, 3]), + ([0, -1, 1], [0, 1, -1]), + ([100, 50, 150], [100, 150, 50]), + ([1, 2, 3, None, 4, None, 5], [1, 3, 2, 5, None, 4]), + ], + ) + def test_invert_tree( + self, solution_class: type, root_list: list[int | None], expected_list: list[int | None] + ): + result = run_invert_tree(solution_class, root_list) + assert_invert_tree(result, expected_list) diff --git a/leetcode/is_graph_bipartite/playground.py b/leetcode/is_graph_bipartite/playground.py index 9c545b2b..144e0f8c 100644 --- a/leetcode/is_graph_bipartite/playground.py +++ b/leetcode/is_graph_bipartite/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/is_subsequence/playground.py b/leetcode/is_subsequence/playground.py index 0357f975..da0c33b6 100644 --- a/leetcode/is_subsequence/playground.py +++ b/leetcode/is_subsequence/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/jump_game/README.md b/leetcode/jump_game/README.md index 97b97386..7ce81bf0 100644 --- a/leetcode/jump_game/README.md +++ b/leetcode/jump_game/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming, Greedy -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 55](https://leetcode.com/problems/jump-game/description/) diff --git a/leetcode/jump_game/playground.py b/leetcode/jump_game/playground.py index 467797ce..a0e70469 100644 --- a/leetcode/jump_game/playground.py +++ b/leetcode/jump_game/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/jump_game_ii/README.md b/leetcode/jump_game_ii/README.md index 95e0ccc4..a491c0fe 100644 --- a/leetcode/jump_game_ii/README.md +++ b/leetcode/jump_game_ii/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming, Greedy -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 45](https://leetcode.com/problems/jump-game-ii/description/) diff --git a/leetcode/jump_game_ii/playground.py b/leetcode/jump_game_ii/playground.py index 09cddf70..cdb1002d 100644 --- a/leetcode/jump_game_ii/playground.py +++ b/leetcode/jump_game_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/k_closest_points_to_origin/README.md b/leetcode/k_closest_points_to_origin/README.md index 54395ba4..b7dd3712 100644 --- a/leetcode/k_closest_points_to_origin/README.md +++ b/leetcode/k_closest_points_to_origin/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Math, Divide and Conquer, Geometry, Sorting, Heap (Priority Queue), Quickselect -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 973](https://leetcode.com/problems/k-closest-points-to-origin/description/) diff --git a/leetcode/k_closest_points_to_origin/playground.py b/leetcode/k_closest_points_to_origin/playground.py index 5efc6f02..c7aba284 100644 --- a/leetcode/k_closest_points_to_origin/playground.py +++ b/leetcode/k_closest_points_to_origin/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/kth_smallest_element_in_a_bst/README.md b/leetcode/kth_smallest_element_in_a_bst/README.md index fefde64b..43691214 100644 --- a/leetcode/kth_smallest_element_in_a_bst/README.md +++ b/leetcode/kth_smallest_element_in_a_bst/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Depth-First Search, Binary Search Tree, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 230](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/) diff --git a/leetcode/kth_smallest_element_in_a_bst/playground.py b/leetcode/kth_smallest_element_in_a_bst/playground.py index 6cff3f7a..0eb24367 100644 --- a/leetcode/kth_smallest_element_in_a_bst/playground.py +++ b/leetcode/kth_smallest_element_in_a_bst/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/largest_rectangle_in_histogram/README.md b/leetcode/largest_rectangle_in_histogram/README.md index ac89d7c7..bb416c7f 100644 --- a/leetcode/largest_rectangle_in_histogram/README.md +++ b/leetcode/largest_rectangle_in_histogram/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Stack, Monotonic Stack -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 84](https://leetcode.com/problems/largest-rectangle-in-histogram/description/) diff --git a/leetcode/largest_rectangle_in_histogram/playground.py b/leetcode/largest_rectangle_in_histogram/playground.py index 16761db7..39bd7478 100644 --- a/leetcode/largest_rectangle_in_histogram/playground.py +++ b/leetcode/largest_rectangle_in_histogram/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/letter_combinations_of_a_phone_number/README.md b/leetcode/letter_combinations_of_a_phone_number/README.md index 43f0064e..d582bda5 100644 --- a/leetcode/letter_combinations_of_a_phone_number/README.md +++ b/leetcode/letter_combinations_of_a_phone_number/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Backtracking -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 17](https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/) diff --git a/leetcode/letter_combinations_of_a_phone_number/playground.py b/leetcode/letter_combinations_of_a_phone_number/playground.py index 3dcbf29d..db9d531d 100644 --- a/leetcode/letter_combinations_of_a_phone_number/playground.py +++ b/leetcode/letter_combinations_of_a_phone_number/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/linked_list_cycle/README.md b/leetcode/linked_list_cycle/README.md index 4ec75c4f..0c66db43 100644 --- a/leetcode/linked_list_cycle/README.md +++ b/leetcode/linked_list_cycle/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Hash Table, Linked List, Two Pointers -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 141](https://leetcode.com/problems/linked-list-cycle/description/) diff --git a/leetcode/linked_list_cycle/playground.py b/leetcode/linked_list_cycle/playground.py index b19e7f68..398861a0 100644 --- a/leetcode/linked_list_cycle/playground.py +++ b/leetcode/linked_list_cycle/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python @@ -14,7 +13,7 @@ # --- # %% -from helpers import assert_has_cycle, create_cycle_list, run_has_cycle +from helpers import assert_has_cycle, run_has_cycle from solution import Solution # %% @@ -23,10 +22,6 @@ pos = 1 expected = True -# %% -head = create_cycle_list(values, pos) -head - # %% result = run_has_cycle(Solution, values, pos) result diff --git a/leetcode/linked_list_cycle_ii/playground.py b/leetcode/linked_list_cycle_ii/playground.py index 81e416f2..8f9fc3d0 100644 --- a/leetcode/linked_list_cycle_ii/playground.py +++ b/leetcode/linked_list_cycle_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_common_subsequence/README.md b/leetcode/longest_common_subsequence/README.md index e537d40b..ae0486dd 100644 --- a/leetcode/longest_common_subsequence/README.md +++ b/leetcode/longest_common_subsequence/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** String, Dynamic Programming -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 1143](https://leetcode.com/problems/longest-common-subsequence/description/) diff --git a/leetcode/longest_common_subsequence/playground.py b/leetcode/longest_common_subsequence/playground.py index 5b467159..48fcb589 100644 --- a/leetcode/longest_common_subsequence/playground.py +++ b/leetcode/longest_common_subsequence/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_consecutive_sequence/README.md b/leetcode/longest_consecutive_sequence/README.md index f8073270..0a59ac19 100644 --- a/leetcode/longest_consecutive_sequence/README.md +++ b/leetcode/longest_consecutive_sequence/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Union Find -**Tags:** grind +**Tags:** algo-master-75, blind-75, grind, neetcode-150 **LeetCode:** [Problem 128](https://leetcode.com/problems/longest-consecutive-sequence/description/) diff --git a/leetcode/longest_consecutive_sequence/playground.py b/leetcode/longest_consecutive_sequence/playground.py index 54b2d39e..f09294e1 100644 --- a/leetcode/longest_consecutive_sequence/playground.py +++ b/leetcode/longest_consecutive_sequence/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_increasing_path_in_a_matrix/README.md b/leetcode/longest_increasing_path_in_a_matrix/README.md index 263da61a..32b6928f 100644 --- a/leetcode/longest_increasing_path_in_a_matrix/README.md +++ b/leetcode/longest_increasing_path_in_a_matrix/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Dynamic Programming, Depth-First Search, Breadth-First Search, Graph Theory, Topological Sort, Memoization, Matrix -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 329](https://leetcode.com/problems/longest-increasing-path-in-a-matrix/description/) diff --git a/leetcode/longest_increasing_path_in_a_matrix/playground.py b/leetcode/longest_increasing_path_in_a_matrix/playground.py index 73028bfc..c61ae0fa 100644 --- a/leetcode/longest_increasing_path_in_a_matrix/playground.py +++ b/leetcode/longest_increasing_path_in_a_matrix/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_increasing_subsequence/README.md b/leetcode/longest_increasing_subsequence/README.md index 391d1e5d..71a2b8cf 100644 --- a/leetcode/longest_increasing_subsequence/README.md +++ b/leetcode/longest_increasing_subsequence/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Binary Search, Dynamic Programming -**Tags:** grind +**Tags:** algo-master-75, blind-75, grind, neetcode-150 **LeetCode:** [Problem 300](https://leetcode.com/problems/longest-increasing-subsequence/description/) diff --git a/leetcode/longest_increasing_subsequence/playground.py b/leetcode/longest_increasing_subsequence/playground.py index bdd6fc9c..63b8cb71 100644 --- a/leetcode/longest_increasing_subsequence/playground.py +++ b/leetcode/longest_increasing_subsequence/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_palindrome/README.md b/leetcode/longest_palindrome/README.md index 327f7193..a6005d20 100644 --- a/leetcode/longest_palindrome/README.md +++ b/leetcode/longest_palindrome/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Hash Table, String, Greedy -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 409](https://leetcode.com/problems/longest-palindrome/description/) diff --git a/leetcode/longest_palindrome/playground.py b/leetcode/longest_palindrome/playground.py index d84ed135..e05e4a9f 100644 --- a/leetcode/longest_palindrome/playground.py +++ b/leetcode/longest_palindrome/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_palindromic_substring/README.md b/leetcode/longest_palindromic_substring/README.md index 29669aba..b184233c 100644 --- a/leetcode/longest_palindromic_substring/README.md +++ b/leetcode/longest_palindromic_substring/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Two Pointers, String, Dynamic Programming -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 5](https://leetcode.com/problems/longest-palindromic-substring/description/) diff --git a/leetcode/longest_palindromic_substring/playground.py b/leetcode/longest_palindromic_substring/playground.py index ee1069b6..622b1461 100644 --- a/leetcode/longest_palindromic_substring/playground.py +++ b/leetcode/longest_palindromic_substring/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_palindromic_substring/test_solution.py b/leetcode/longest_palindromic_substring/test_solution.py index 5751e253..ff8ffb27 100644 --- a/leetcode/longest_palindromic_substring/test_solution.py +++ b/leetcode/longest_palindromic_substring/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_longest_palindrome, run_longest_palindrome -from .solution import Solution, SolutionManacher +from .solution import Solution class TestLongestPalindromicSubstring: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionManacher]) @pytest.mark.parametrize( "s, expected", [ @@ -29,6 +28,6 @@ def setup_method(self): ("abcba", {"abcba"}), ], ) - def test_longest_palindrome(self, solution_class: type, s: str, expected: set[str]): - result = run_longest_palindrome(solution_class, s) + def test_longest_palindrome(self, s: str, expected: set[str]): + result = run_longest_palindrome(Solution, s) assert_longest_palindrome(result, expected) diff --git a/leetcode/longest_palindromic_substring/test_solution_extra.py b/leetcode/longest_palindromic_substring/test_solution_extra.py new file mode 100644 index 00000000..e1d53142 --- /dev/null +++ b/leetcode/longest_palindromic_substring/test_solution_extra.py @@ -0,0 +1,31 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_longest_palindrome, run_longest_palindrome +from .solution import SolutionManacher + + +class TestLongestPalindromicSubstringExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionManacher]) + @pytest.mark.parametrize( + "s, expected", + [ + ("babad", {"bab", "aba"}), + ("cbbd", {"bb"}), + ("a", {"a"}), + ("ac", {"a", "c"}), + ("racecar", {"racecar"}), + ("aabbaa", {"aabbaa"}), + ("abacabad", {"abacaba"}), + ("noon", {"noon"}), + ("abccba", {"abccba"}), + ("aa", {"aa"}), + ("aba", {"aba"}), + ("abcba", {"abcba"}), + ], + ) + def test_longest_palindrome(self, solution_class: type, s: str, expected: set[str]): + result = run_longest_palindrome(solution_class, s) + assert_longest_palindrome(result, expected) diff --git a/leetcode/longest_repeating_character_replacement/README.md b/leetcode/longest_repeating_character_replacement/README.md index 1ff0943d..0440952d 100644 --- a/leetcode/longest_repeating_character_replacement/README.md +++ b/leetcode/longest_repeating_character_replacement/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Sliding Window -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 424](https://leetcode.com/problems/longest-repeating-character-replacement/description/) diff --git a/leetcode/longest_repeating_character_replacement/playground.py b/leetcode/longest_repeating_character_replacement/playground.py index 6d1405a6..86821aa1 100644 --- a/leetcode/longest_repeating_character_replacement/playground.py +++ b/leetcode/longest_repeating_character_replacement/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/longest_substring_without_repeating_characters/README.md b/leetcode/longest_substring_without_repeating_characters/README.md index 53c884d7..e6933758 100644 --- a/leetcode/longest_substring_without_repeating_characters/README.md +++ b/leetcode/longest_substring_without_repeating_characters/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Sliding Window -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 3](https://leetcode.com/problems/longest-substring-without-repeating-characters/description/) diff --git a/leetcode/longest_substring_without_repeating_characters/playground.py b/leetcode/longest_substring_without_repeating_characters/playground.py index e2b9bf4d..e552df4b 100644 --- a/leetcode/longest_substring_without_repeating_characters/playground.py +++ b/leetcode/longest_substring_without_repeating_characters/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/lowest_common_ancestor_of_a_binary_search_tree/README.md b/leetcode/lowest_common_ancestor_of_a_binary_search_tree/README.md index a5b2f27b..14f7dba2 100644 --- a/leetcode/lowest_common_ancestor_of_a_binary_search_tree/README.md +++ b/leetcode/lowest_common_ancestor_of_a_binary_search_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Depth-First Search, Binary Search Tree, Binary Tree -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 235](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/) diff --git a/leetcode/lowest_common_ancestor_of_a_binary_search_tree/playground.py b/leetcode/lowest_common_ancestor_of_a_binary_search_tree/playground.py index 1e7eb79f..5d61a00a 100644 --- a/leetcode/lowest_common_ancestor_of_a_binary_search_tree/playground.py +++ b/leetcode/lowest_common_ancestor_of_a_binary_search_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/lowest_common_ancestor_of_a_binary_tree/README.md b/leetcode/lowest_common_ancestor_of_a_binary_tree/README.md index 1c562a61..8187c65f 100644 --- a/leetcode/lowest_common_ancestor_of_a_binary_tree/README.md +++ b/leetcode/lowest_common_ancestor_of_a_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Depth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75 **LeetCode:** [Problem 236](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/) diff --git a/leetcode/lowest_common_ancestor_of_a_binary_tree/playground.py b/leetcode/lowest_common_ancestor_of_a_binary_tree/playground.py index 39884fc0..3d0d3673 100644 --- a/leetcode/lowest_common_ancestor_of_a_binary_tree/playground.py +++ b/leetcode/lowest_common_ancestor_of_a_binary_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/lru_cache/README.md b/leetcode/lru_cache/README.md index 7037dbc5..d011a149 100644 --- a/leetcode/lru_cache/README.md +++ b/leetcode/lru_cache/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, Linked List, Design, Doubly-Linked List -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 146](https://leetcode.com/problems/lru-cache/description/) diff --git a/leetcode/lru_cache/playground.py b/leetcode/lru_cache/playground.py index 6269d30d..f2a3705d 100644 --- a/leetcode/lru_cache/playground.py +++ b/leetcode/lru_cache/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python @@ -26,7 +25,7 @@ # %% result, cache = run_lru_cache(LRUCache, operations, inputs) print(result) -cache.cache +cache # %% assert_lru_cache(result, expected) diff --git a/leetcode/lru_cache/test_solution.py b/leetcode/lru_cache/test_solution.py index aa1d5804..4be1a98a 100644 --- a/leetcode/lru_cache/test_solution.py +++ b/leetcode/lru_cache/test_solution.py @@ -3,12 +3,11 @@ from leetcode_py import logged_test from .helpers import assert_lru_cache, run_lru_cache -from .solution import LRUCache, LRUCacheWithDoublyList +from .solution import LRUCache class TestLRUCache: @logged_test - @pytest.mark.parametrize("solution_class", [LRUCache, LRUCacheWithDoublyList]) @pytest.mark.parametrize( "operations, inputs, expected", [ @@ -67,11 +66,7 @@ class TestLRUCache: ], ) def test_lru_cache( - self, - solution_class: type, - operations: list[str], - inputs: list[list[int]], - expected: list[int | None], + self, operations: list[str], inputs: list[list[int]], expected: list[int | None] ): - result, _ = run_lru_cache(solution_class, operations, inputs) + result, _ = run_lru_cache(LRUCache, operations, inputs) assert_lru_cache(result, expected) diff --git a/leetcode/lru_cache/test_solution_extra.py b/leetcode/lru_cache/test_solution_extra.py new file mode 100644 index 00000000..d342a838 --- /dev/null +++ b/leetcode/lru_cache/test_solution_extra.py @@ -0,0 +1,77 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_lru_cache, run_lru_cache +from .solution import LRUCacheWithDoublyList + + +class TestLruCacheExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [LRUCacheWithDoublyList]) + @pytest.mark.parametrize( + "operations, inputs, expected", + [ + ( + ["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"], + [[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]], + [None, None, None, 1, None, -1, None, -1, 3, 4], + ), + ( + ["LRUCache", "get", "put", "get", "put", "put", "get", "get"], + [[2], [2], [2, 6], [1], [1, 5], [1, 2], [1], [2]], + [None, -1, None, -1, None, None, 2, 6], + ), + ( + ["LRUCache", "put", "get", "put", "get", "get"], + [[1], [2, 1], [2], [3, 2], [2], [3]], + [None, None, 1, None, -1, 2], + ), + (["LRUCache", "get"], [[1], [1]], [None, -1]), + (["LRUCache", "put", "get"], [[1], [1, 100], [1]], [None, None, 100]), + ( + ["LRUCache", "put", "put", "get", "get"], + [[2], [1, 1], [2, 2], [1], [2]], + [None, None, None, 1, 2], + ), + ( + ["LRUCache", "put", "put", "put", "get", "get", "get"], + [[2], [1, 1], [2, 2], [3, 3], [1], [2], [3]], + [None, None, None, None, -1, 2, 3], + ), + ( + ["LRUCache", "put", "get", "put", "get", "put", "get"], + [[3], [1, 1], [1], [2, 2], [2], [3, 3], [3]], + [None, None, 1, None, 2, None, 3], + ), + ( + ["LRUCache", "put", "put", "put", "put", "get", "get"], + [[3], [1, 1], [2, 2], [3, 3], [4, 4], [4], [3]], + [None, None, None, None, None, 4, 3], + ), + ( + ["LRUCache", "put", "put", "get", "put", "get", "get"], + [[2], [2, 1], [1, 1], [2], [4, 1], [1], [2]], + [None, None, None, 1, None, -1, 1], + ), + ( + ["LRUCache", "put", "put", "get", "put", "put", "get"], + [[2], [2, 1], [2, 2], [2], [1, 1], [4, 1], [2]], + [None, None, None, 2, None, None, -1], + ), + ( + ["LRUCache", "put", "put", "put", "get", "put", "get", "get", "get", "get"], + [[3], [1, 1], [2, 2], [3, 3], [2], [4, 4], [1], [3], [4], [2]], + [None, None, None, None, 2, None, -1, 3, 4, 2], + ), + ], + ) + def test_lru_cache( + self, + solution_class: type, + operations: list[str], + inputs: list[list[int]], + expected: list[int | None], + ): + result, _ = run_lru_cache(solution_class, operations, inputs) + assert_lru_cache(result, expected) diff --git a/leetcode/majority_element/README.md b/leetcode/majority_element/README.md index 38222723..0534a5e0 100644 --- a/leetcode/majority_element/README.md +++ b/leetcode/majority_element/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Hash Table, Divide and Conquer, Sorting, Counting -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75 **LeetCode:** [Problem 169](https://leetcode.com/problems/majority-element/description/) diff --git a/leetcode/majority_element/playground.py b/leetcode/majority_element/playground.py index ac2bcd39..d852a6f8 100644 --- a/leetcode/majority_element/playground.py +++ b/leetcode/majority_element/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/max_points_on_a_line/playground.py b/leetcode/max_points_on_a_line/playground.py index 0c990edb..9515a562 100644 --- a/leetcode/max_points_on_a_line/playground.py +++ b/leetcode/max_points_on_a_line/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/maximum_depth_of_binary_tree/README.md b/leetcode/maximum_depth_of_binary_tree/README.md index 4663e246..51ddbeb1 100644 --- a/leetcode/maximum_depth_of_binary_tree/README.md +++ b/leetcode/maximum_depth_of_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, Breadth-First Search, Binary Tree -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 104](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/) diff --git a/leetcode/maximum_depth_of_binary_tree/playground.py b/leetcode/maximum_depth_of_binary_tree/playground.py index e2f6ebfc..8873d00d 100644 --- a/leetcode/maximum_depth_of_binary_tree/playground.py +++ b/leetcode/maximum_depth_of_binary_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/maximum_product_subarray/README.md b/leetcode/maximum_product_subarray/README.md index 6ced65a5..1d0104db 100644 --- a/leetcode/maximum_product_subarray/README.md +++ b/leetcode/maximum_product_subarray/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming -**Tags:** grind +**Tags:** blind-75, grind, neetcode-150 **LeetCode:** [Problem 152](https://leetcode.com/problems/maximum-product-subarray/description/) diff --git a/leetcode/maximum_product_subarray/playground.py b/leetcode/maximum_product_subarray/playground.py index 98c1811b..71da7f22 100644 --- a/leetcode/maximum_product_subarray/playground.py +++ b/leetcode/maximum_product_subarray/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/maximum_profit_in_job_scheduling/README.md b/leetcode/maximum_profit_in_job_scheduling/README.md index 100bfa72..23c79c60 100644 --- a/leetcode/maximum_profit_in_job_scheduling/README.md +++ b/leetcode/maximum_profit_in_job_scheduling/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Binary Search, Dynamic Programming, Sorting -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 1235](https://leetcode.com/problems/maximum-profit-in-job-scheduling/description/) diff --git a/leetcode/maximum_profit_in_job_scheduling/playground.py b/leetcode/maximum_profit_in_job_scheduling/playground.py index 777d9279..3b5be615 100644 --- a/leetcode/maximum_profit_in_job_scheduling/playground.py +++ b/leetcode/maximum_profit_in_job_scheduling/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/maximum_subarray/README.md b/leetcode/maximum_subarray/README.md index e4d7afac..550ec7d5 100644 --- a/leetcode/maximum_subarray/README.md +++ b/leetcode/maximum_subarray/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Divide and Conquer, Dynamic Programming -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 53](https://leetcode.com/problems/maximum-subarray/description/) diff --git a/leetcode/maximum_subarray/playground.py b/leetcode/maximum_subarray/playground.py index 4c514a93..87e9b102 100644 --- a/leetcode/maximum_subarray/playground.py +++ b/leetcode/maximum_subarray/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/maximum_width_of_binary_tree/playground.py b/leetcode/maximum_width_of_binary_tree/playground.py index b637275b..fe762a95 100644 --- a/leetcode/maximum_width_of_binary_tree/playground.py +++ b/leetcode/maximum_width_of_binary_tree/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/median_of_two_sorted_arrays/README.md b/leetcode/median_of_two_sorted_arrays/README.md index 2d6a89cf..97d79e91 100644 --- a/leetcode/median_of_two_sorted_arrays/README.md +++ b/leetcode/median_of_two_sorted_arrays/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Binary Search, Divide and Conquer -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 4](https://leetcode.com/problems/median-of-two-sorted-arrays/description/) diff --git a/leetcode/median_of_two_sorted_arrays/playground.py b/leetcode/median_of_two_sorted_arrays/playground.py index 5ec39a9c..bb017f18 100644 --- a/leetcode/median_of_two_sorted_arrays/playground.py +++ b/leetcode/median_of_two_sorted_arrays/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/meeting_rooms/README.md b/leetcode/meeting_rooms/README.md index fbe300bc..e15cee81 100644 --- a/leetcode/meeting_rooms/README.md +++ b/leetcode/meeting_rooms/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Sorting -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 252](https://leetcode.com/problems/meeting-rooms/description/) diff --git a/leetcode/meeting_rooms/playground.py b/leetcode/meeting_rooms/playground.py index 465f1f82..abfb0482 100644 --- a/leetcode/meeting_rooms/playground.py +++ b/leetcode/meeting_rooms/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/meeting_rooms_ii/README.md b/leetcode/meeting_rooms_ii/README.md index 8b846c0c..2c17aba8 100644 --- a/leetcode/meeting_rooms_ii/README.md +++ b/leetcode/meeting_rooms_ii/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Two Pointers, Greedy, Sorting, Heap (Priority Queue) -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 253](https://leetcode.com/problems/meeting-rooms-ii/description/) diff --git a/leetcode/meeting_rooms_ii/playground.py b/leetcode/meeting_rooms_ii/playground.py index 95e3db6b..366813ee 100644 --- a/leetcode/meeting_rooms_ii/playground.py +++ b/leetcode/meeting_rooms_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/merge_intervals/README.md b/leetcode/merge_intervals/README.md index 0f648cf6..00e742e0 100644 --- a/leetcode/merge_intervals/README.md +++ b/leetcode/merge_intervals/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Sorting -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 56](https://leetcode.com/problems/merge-intervals/description/) diff --git a/leetcode/merge_intervals/playground.py b/leetcode/merge_intervals/playground.py index 0c3c6b04..c61207e1 100644 --- a/leetcode/merge_intervals/playground.py +++ b/leetcode/merge_intervals/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/merge_k_sorted_lists/README.md b/leetcode/merge_k_sorted_lists/README.md index 7912c38c..fe70f8d6 100644 --- a/leetcode/merge_k_sorted_lists/README.md +++ b/leetcode/merge_k_sorted_lists/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Linked List, Divide and Conquer, Heap (Priority Queue), Merge Sort -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 23](https://leetcode.com/problems/merge-k-sorted-lists/description/) diff --git a/leetcode/merge_k_sorted_lists/playground.py b/leetcode/merge_k_sorted_lists/playground.py index f30a2ad7..7ec47a11 100644 --- a/leetcode/merge_k_sorted_lists/playground.py +++ b/leetcode/merge_k_sorted_lists/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/merge_two_sorted_lists/README.md b/leetcode/merge_two_sorted_lists/README.md index a9721a5a..e0a1a7a3 100644 --- a/leetcode/merge_two_sorted_lists/README.md +++ b/leetcode/merge_two_sorted_lists/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Linked List, Recursion -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 21](https://leetcode.com/problems/merge-two-sorted-lists/description/) diff --git a/leetcode/merge_two_sorted_lists/playground.py b/leetcode/merge_two_sorted_lists/playground.py index 2d47603c..feb9e93b 100644 --- a/leetcode/merge_two_sorted_lists/playground.py +++ b/leetcode/merge_two_sorted_lists/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/middle_of_the_linked_list/README.md b/leetcode/middle_of_the_linked_list/README.md index 1f36bf28..60bbcf87 100644 --- a/leetcode/middle_of_the_linked_list/README.md +++ b/leetcode/middle_of_the_linked_list/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Linked List, Two Pointers -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 876](https://leetcode.com/problems/middle-of-the-linked-list/description/) diff --git a/leetcode/middle_of_the_linked_list/playground.py b/leetcode/middle_of_the_linked_list/playground.py index a81e5a1f..af0afc71 100644 --- a/leetcode/middle_of_the_linked_list/playground.py +++ b/leetcode/middle_of_the_linked_list/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/min_cost_to_connect_all_points/README.md b/leetcode/min_cost_to_connect_all_points/README.md index ab36700f..6544f1e6 100644 --- a/leetcode/min_cost_to_connect_all_points/README.md +++ b/leetcode/min_cost_to_connect_all_points/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Union-Find, Graph Theory, Minimum Spanning Tree -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 1584](https://leetcode.com/problems/min-cost-to-connect-all-points/description/) diff --git a/leetcode/min_cost_to_connect_all_points/playground.py b/leetcode/min_cost_to_connect_all_points/playground.py index e8be4046..4d3b5b89 100644 --- a/leetcode/min_cost_to_connect_all_points/playground.py +++ b/leetcode/min_cost_to_connect_all_points/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/min_stack/README.md b/leetcode/min_stack/README.md index 46edefb8..4b368e79 100644 --- a/leetcode/min_stack/README.md +++ b/leetcode/min_stack/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Stack, Design -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 155](https://leetcode.com/problems/min-stack/description/) diff --git a/leetcode/min_stack/playground.py b/leetcode/min_stack/playground.py index a331ae1d..9e0acd29 100644 --- a/leetcode/min_stack/playground.py +++ b/leetcode/min_stack/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/minimum_height_trees/README.md b/leetcode/minimum_height_trees/README.md index 15ad7258..ca8e6830 100644 --- a/leetcode/minimum_height_trees/README.md +++ b/leetcode/minimum_height_trees/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Graph, Topological Sort -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 310](https://leetcode.com/problems/minimum-height-trees/description/) diff --git a/leetcode/minimum_height_trees/playground.py b/leetcode/minimum_height_trees/playground.py index 32fdfbd4..33671c2c 100644 --- a/leetcode/minimum_height_trees/playground.py +++ b/leetcode/minimum_height_trees/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/minimum_path_sum/playground.py b/leetcode/minimum_path_sum/playground.py index fca327df..6924addc 100644 --- a/leetcode/minimum_path_sum/playground.py +++ b/leetcode/minimum_path_sum/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/minimum_window_substring/README.md b/leetcode/minimum_window_substring/README.md index f54b7dad..6a1557da 100644 --- a/leetcode/minimum_window_substring/README.md +++ b/leetcode/minimum_window_substring/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Hash Table, String, Sliding Window -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 76](https://leetcode.com/problems/minimum-window-substring/description/) diff --git a/leetcode/minimum_window_substring/playground.py b/leetcode/minimum_window_substring/playground.py index 89b19b04..82f301a4 100644 --- a/leetcode/minimum_window_substring/playground.py +++ b/leetcode/minimum_window_substring/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/missing_number/README.md b/leetcode/missing_number/README.md index 159e1d75..fec3c898 100644 --- a/leetcode/missing_number/README.md +++ b/leetcode/missing_number/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Hash Table, Math, Binary Search, Bit Manipulation, Sorting -**Tags:** neetcode-150, blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 268](https://leetcode.com/problems/missing-number/description/) diff --git a/leetcode/missing_number/playground.py b/leetcode/missing_number/playground.py index 5d99064e..3a4e4acd 100644 --- a/leetcode/missing_number/playground.py +++ b/leetcode/missing_number/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/missing_number/test_solution.py b/leetcode/missing_number/test_solution.py index 685eddfc..97649665 100644 --- a/leetcode/missing_number/test_solution.py +++ b/leetcode/missing_number/test_solution.py @@ -22,16 +22,8 @@ def setup_method(self): (Solution, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 10), (Solution, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 0), (Solution, [0, 1, 2, 3, 4, 6, 7, 8, 9, 10], 5), - ( - Solution, - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], - 0, - ), - ( - Solution, - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - 20, - ), + (Solution, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 0), + (Solution, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 20), (Solution, [2, 0, 1], 3), (Solution, [1, 0], 2), ( diff --git a/leetcode/multiply_strings/README.md b/leetcode/multiply_strings/README.md new file mode 100644 index 00000000..5b25bbce --- /dev/null +++ b/leetcode/multiply_strings/README.md @@ -0,0 +1,35 @@ +# Multiply Strings + +**Difficulty:** Medium +**Topics:** Math, String, Simulation +**Tags:** neetcode-150 + +**LeetCode:** [Problem 43](https://leetcode.com/problems/multiply-strings/description/) + +## Problem Description + +Given two non-negative integers `num1` and `num2` represented as strings, return the product of `num1` and `num2`, also represented as a string. + +**Note:** You must not use any built-in BigInteger library or convert the inputs to integer directly. + +## Examples + +### Example 1: + +``` +Input: num1 = "2", num2 = "3" +Output: "6" +``` + +### Example 2: + +``` +Input: num1 = "123", num2 = "456" +Output: "56088" +``` + +## Constraints + +- 1 <= num1.length, num2.length <= 200 +- `num1` and `num2` consist of digits only. +- Both `num1` and `num2` do not contain any leading zero, except the number `0` itself. diff --git a/leetcode/multiply_strings/__init__.py b/leetcode/multiply_strings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/leetcode/multiply_strings/helpers.py b/leetcode/multiply_strings/helpers.py new file mode 100644 index 00000000..1d764da0 --- /dev/null +++ b/leetcode/multiply_strings/helpers.py @@ -0,0 +1,8 @@ +def run_multiply(solution_class: type, num1: str, num2: str): + implementation = solution_class() + return implementation.multiply(num1, num2) + + +def assert_multiply(result: str, expected: str) -> bool: + assert result == expected + return True diff --git a/leetcode/multiply_strings/playground.py b/leetcode/multiply_strings/playground.py new file mode 100644 index 00000000..ad06640c --- /dev/null +++ b/leetcode/multiply_strings/playground.py @@ -0,0 +1,30 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.19.2 +# kernelspec: +# display_name: leetcode-py-py3.13 +# language: python +# name: python3 +# --- + +# %% +from helpers import assert_multiply, run_multiply +from solution import Solution + +# %% +# Example test case +num1 = "123" +num2 = "456" +expected = "56088" + +# %% +result = run_multiply(Solution, num1, num2) +result + +# %% +assert_multiply(result, expected) diff --git a/leetcode/multiply_strings/solution.py b/leetcode/multiply_strings/solution.py new file mode 100644 index 00000000..42dfa83f --- /dev/null +++ b/leetcode/multiply_strings/solution.py @@ -0,0 +1,15 @@ +class Solution: + # Time: O(m * n) + # Space: O(m + n) + def multiply(self, num1: str, num2: str) -> str: + if num1 == "0" or num2 == "0": + return "0" + m, n = len(num1), len(num2) + result = [0] * (m + n) + for i in range(m - 1, -1, -1): + for j in range(n - 1, -1, -1): + product = (ord(num1[i]) - ord("0")) * (ord(num2[j]) - ord("0")) + total = product + result[i + j + 1] + result[i + j + 1] = total % 10 + result[i + j] += total // 10 + return "".join(str(x) for x in result).lstrip("0") diff --git a/leetcode/multiply_strings/test_solution.py b/leetcode/multiply_strings/test_solution.py new file mode 100644 index 00000000..3efdc3cc --- /dev/null +++ b/leetcode/multiply_strings/test_solution.py @@ -0,0 +1,37 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_multiply, run_multiply +from .solution import Solution + + +class TestMultiplyStrings: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "num1, num2, expected", + [ + ("2", "3", "6"), + ("123", "456", "56088"), + ("0", "0", "0"), + ("0", "123", "0"), + ("123", "0", "0"), + ("1", "1", "1"), + ("9", "9", "81"), + ("99", "99", "9801"), + ("999", "999", "998001"), + ("123456789", "987654321", "121932631112635269"), + ("2", "50", "100"), + ("10", "10", "100"), + ("100", "100", "10000"), + ("5", "5", "25"), + ("123", "1", "123"), + ("1", "999", "999"), + ], + ) + def test_multiply(self, num1: str, num2: str, expected: str): + result = run_multiply(Solution, num1, num2) + assert_multiply(result, expected) diff --git a/leetcode/my_calendar_i/playground.py b/leetcode/my_calendar_i/playground.py index 260515a3..876848a4 100644 --- a/leetcode/my_calendar_i/playground.py +++ b/leetcode/my_calendar_i/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/next_permutation/playground.py b/leetcode/next_permutation/playground.py index a4c87793..19e99d81 100644 --- a/leetcode/next_permutation/playground.py +++ b/leetcode/next_permutation/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/non_overlapping_intervals/README.md b/leetcode/non_overlapping_intervals/README.md index fed8deab..412c3641 100644 --- a/leetcode/non_overlapping_intervals/README.md +++ b/leetcode/non_overlapping_intervals/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming, Greedy, Sorting -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 435](https://leetcode.com/problems/non-overlapping-intervals/description/) diff --git a/leetcode/non_overlapping_intervals/playground.py b/leetcode/non_overlapping_intervals/playground.py index 5d910717..d61744f5 100644 --- a/leetcode/non_overlapping_intervals/playground.py +++ b/leetcode/non_overlapping_intervals/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/number_of_1_bits/README.md b/leetcode/number_of_1_bits/README.md index 57de621e..92662d3f 100644 --- a/leetcode/number_of_1_bits/README.md +++ b/leetcode/number_of_1_bits/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Divide and Conquer, Bit Manipulation -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 191](https://leetcode.com/problems/number-of-1-bits/description/) diff --git a/leetcode/number_of_1_bits/playground.py b/leetcode/number_of_1_bits/playground.py index 577444e6..977cb830 100644 --- a/leetcode/number_of_1_bits/playground.py +++ b/leetcode/number_of_1_bits/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/number_of_connected_components_in_an_undirected_graph/README.md b/leetcode/number_of_connected_components_in_an_undirected_graph/README.md index f765f252..44383d17 100644 --- a/leetcode/number_of_connected_components_in_an_undirected_graph/README.md +++ b/leetcode/number_of_connected_components_in_an_undirected_graph/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Union Find, Graph -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 323](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/description/) diff --git a/leetcode/number_of_connected_components_in_an_undirected_graph/playground.py b/leetcode/number_of_connected_components_in_an_undirected_graph/playground.py index a2f4d7ff..fac53f7e 100644 --- a/leetcode/number_of_connected_components_in_an_undirected_graph/playground.py +++ b/leetcode/number_of_connected_components_in_an_undirected_graph/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/number_of_islands/README.md b/leetcode/number_of_islands/README.md index ada90642..33fc1b6c 100644 --- a/leetcode/number_of_islands/README.md +++ b/leetcode/number_of_islands/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Depth-First Search, Breadth-First Search, Union Find, Matrix -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 200](https://leetcode.com/problems/number-of-islands/description/) diff --git a/leetcode/number_of_islands/playground.py b/leetcode/number_of_islands/playground.py index 8f12ebb0..f66755a4 100644 --- a/leetcode/number_of_islands/playground.py +++ b/leetcode/number_of_islands/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/number_of_provinces/README.md b/leetcode/number_of_provinces/README.md index 164d1095..55356d62 100644 --- a/leetcode/number_of_provinces/README.md +++ b/leetcode/number_of_provinces/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Depth-First Search, Breadth-First Search, Union-Find, Graph Theory -**Tags:** grind-75, grind, algo-master-75, blind-75, neetcode-150 +**Tags:** algo-master-75 **LeetCode:** [Problem 547](https://leetcode.com/problems/number-of-provinces/description/) diff --git a/leetcode/number_of_provinces/playground.py b/leetcode/number_of_provinces/playground.py index d0ced637..29aa5187 100644 --- a/leetcode/number_of_provinces/playground.py +++ b/leetcode/number_of_provinces/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/odd_even_linked_list/playground.py b/leetcode/odd_even_linked_list/playground.py index f2c0c74d..960a999e 100644 --- a/leetcode/odd_even_linked_list/playground.py +++ b/leetcode/odd_even_linked_list/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/pacific_atlantic_water_flow/README.md b/leetcode/pacific_atlantic_water_flow/README.md index 9d5e5f77..47ff92ec 100644 --- a/leetcode/pacific_atlantic_water_flow/README.md +++ b/leetcode/pacific_atlantic_water_flow/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Depth-First Search, Breadth-First Search, Matrix -**Tags:** grind +**Tags:** blind-75, grind, neetcode-150 **LeetCode:** [Problem 417](https://leetcode.com/problems/pacific-atlantic-water-flow/description/) diff --git a/leetcode/pacific_atlantic_water_flow/playground.py b/leetcode/pacific_atlantic_water_flow/playground.py index 07ddfb6a..1b9f5d22 100644 --- a/leetcode/pacific_atlantic_water_flow/playground.py +++ b/leetcode/pacific_atlantic_water_flow/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/pacific_atlantic_water_flow/test_solution.py b/leetcode/pacific_atlantic_water_flow/test_solution.py index 92e711f6..ce7b9891 100644 --- a/leetcode/pacific_atlantic_water_flow/test_solution.py +++ b/leetcode/pacific_atlantic_water_flow/test_solution.py @@ -34,10 +34,7 @@ def setup_method(self): [[3, 3, 3], [3, 1, 3], [0, 2, 4]], [[0, 0], [0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1], [2, 2]], ), - ( - [[1, 1], [1, 1], [1, 1]], - [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]], - ), + ([[1, 1], [1, 1], [1, 1]], [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]), ( [[10, 10, 10], [10, 1, 10], [10, 10, 10]], [[0, 0], [0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1], [2, 2]], @@ -60,24 +57,10 @@ def setup_method(self): [3, 3], ], ), - ( - [[5, 4, 3], [4, 3, 2], [3, 2, 1]], - [[0, 0], [0, 1], [0, 2], [1, 0], [2, 0]], - ), + ([[5, 4, 3], [4, 3, 2], [3, 2, 1]], [[0, 0], [0, 1], [0, 2], [1, 0], [2, 0]]), ( [[1, 3, 2, 4], [6, 8, 7, 3], [5, 7, 6, 2], [4, 4, 5, 1]], - [ - [0, 3], - [1, 0], - [1, 1], - [1, 2], - [2, 0], - [2, 1], - [2, 2], - [3, 0], - [3, 1], - [3, 2], - ], + [[0, 3], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2], [3, 0], [3, 1], [3, 2]], ), ( [ diff --git a/leetcode/palindrome_partitioning/README.md b/leetcode/palindrome_partitioning/README.md index 5b5c0f53..61b057e8 100644 --- a/leetcode/palindrome_partitioning/README.md +++ b/leetcode/palindrome_partitioning/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** String, Dynamic Programming, Backtracking -**Tags:** grind-75 +**Tags:** neetcode-150 **LeetCode:** [Problem 131](https://leetcode.com/problems/palindrome-partitioning/description/) diff --git a/leetcode/palindrome_partitioning/helpers.py b/leetcode/palindrome_partitioning/helpers.py index e7ec6fbb..cce5edd7 100644 --- a/leetcode/palindrome_partitioning/helpers.py +++ b/leetcode/palindrome_partitioning/helpers.py @@ -4,11 +4,7 @@ def run_partition(solution_class: type, s: str): def assert_partition(result: list[list[str]], expected: list[list[str]]) -> bool: - # Sort inner lists and outer list for comparison - # Note: Inner lists are partitions (lists of strings), order of partitions doesn't matter - # Order of strings within a partition DOES matter (it must reconstruct s) - # But wait, the problem says "partition s", so order of substrings must match the order in s. - # So we only need to sort the outer list of partitions. + # Only sort the outer list. Inner lists maintain order since substrings must reconstruct s. result_sorted = sorted(result) expected_sorted = sorted(expected) assert result_sorted == expected_sorted diff --git a/leetcode/palindrome_partitioning/playground.py b/leetcode/palindrome_partitioning/playground.py index a89cd840..0a027202 100644 --- a/leetcode/palindrome_partitioning/playground.py +++ b/leetcode/palindrome_partitioning/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.18.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/palindromic_substrings/README.md b/leetcode/palindromic_substrings/README.md index 4cba2ef9..7cf69963 100644 --- a/leetcode/palindromic_substrings/README.md +++ b/leetcode/palindromic_substrings/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Two Pointers, String, Dynamic Programming -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 647](https://leetcode.com/problems/palindromic-substrings/description/) diff --git a/leetcode/palindromic_substrings/playground.py b/leetcode/palindromic_substrings/playground.py index 6919b485..a4975a0c 100644 --- a/leetcode/palindromic_substrings/playground.py +++ b/leetcode/palindromic_substrings/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/partition_equal_subset_sum/README.md b/leetcode/partition_equal_subset_sum/README.md index 82f48a56..f1a2d8d9 100644 --- a/leetcode/partition_equal_subset_sum/README.md +++ b/leetcode/partition_equal_subset_sum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 416](https://leetcode.com/problems/partition-equal-subset-sum/description/) diff --git a/leetcode/partition_equal_subset_sum/playground.py b/leetcode/partition_equal_subset_sum/playground.py index 9bf8361c..263717fb 100644 --- a/leetcode/partition_equal_subset_sum/playground.py +++ b/leetcode/partition_equal_subset_sum/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/partition_equal_subset_sum/test_solution.py b/leetcode/partition_equal_subset_sum/test_solution.py index 0a983dcb..2c2158be 100644 --- a/leetcode/partition_equal_subset_sum/test_solution.py +++ b/leetcode/partition_equal_subset_sum/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_can_partition, run_can_partition -from .solution import Solution, SolutionBitset +from .solution import Solution class TestPartitionEqualSubsetSum: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionBitset]) @pytest.mark.parametrize( "nums, expected", [ @@ -32,6 +31,6 @@ def setup_method(self): ([4, 4, 4, 4, 4, 4], True), ], ) - def test_can_partition(self, solution_class: type, nums: list[int], expected: bool): - result = run_can_partition(solution_class, nums) + def test_can_partition(self, nums: list[int], expected: bool): + result = run_can_partition(Solution, nums) assert_can_partition(result, expected) diff --git a/leetcode/partition_equal_subset_sum/test_solution_extra.py b/leetcode/partition_equal_subset_sum/test_solution_extra.py new file mode 100644 index 00000000..b70a8fbe --- /dev/null +++ b/leetcode/partition_equal_subset_sum/test_solution_extra.py @@ -0,0 +1,34 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_can_partition, run_can_partition +from .solution import SolutionBitset + + +class TestPartitionEqualSubsetSumExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionBitset]) + @pytest.mark.parametrize( + "nums, expected", + [ + ([1, 5, 11, 5], True), + ([1, 2, 3, 5], False), + ([1, 1], True), + ([1], False), + ([2, 2, 1, 1], True), + ([100], False), + ([1, 2, 5], False), + ([1, 3, 5, 7], True), + ([2, 2, 3, 5], False), + ([1, 2, 3, 4, 5, 6, 7], True), + ([3, 3, 3, 4, 5], True), + ([1, 1, 1, 1], True), + ([23, 13, 11, 7, 6, 5, 5], True), + ([1, 5, 3], False), + ([4, 4, 4, 4, 4, 4], True), + ], + ) + def test_can_partition(self, solution_class: type, nums: list[int], expected: bool): + result = run_can_partition(solution_class, nums) + assert_can_partition(result, expected) diff --git a/leetcode/path_sum_ii/playground.py b/leetcode/path_sum_ii/playground.py index bf208e25..c7c72bb0 100644 --- a/leetcode/path_sum_ii/playground.py +++ b/leetcode/path_sum_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/path_sum_ii/test_solution.py b/leetcode/path_sum_ii/test_solution.py index 5e4bfaca..89e5154d 100644 --- a/leetcode/path_sum_ii/test_solution.py +++ b/leetcode/path_sum_ii/test_solution.py @@ -14,22 +14,14 @@ def setup_method(self): @pytest.mark.parametrize( "root_list, target_sum, expected", [ - ( - [5, 4, 8, 11, None, 13, 4, 7, 2, None, None, 5, 1], - 22, - [[5, 4, 11, 2], [5, 8, 4, 5]], - ), + ([5, 4, 8, 11, None, 13, 4, 7, 2, None, None, 5, 1], 22, [[5, 4, 11, 2], [5, 8, 4, 5]]), ([1, 2, 3], 5, []), ([1, 2], 0, []), ([], 0, []), ([1], 1, [[1]]), ([1], 0, []), ([1, 2, 3], 4, [[1, 3]]), - ( - [5, 4, 8, 11, None, 13, 4, 7, 2, None, None, None, 1], - 22, - [[5, 4, 11, 2]], - ), + ([5, 4, 8, 11, None, 13, 4, 7, 2, None, None, None, 1], 22, [[5, 4, 11, 2]]), ([1, -2, -3, 1, 3, -2, None, -1], -1, [[1, -2, 1, -1]]), ([1, 2, 3, 4, 5], 7, [[1, 2, 4]]), ([2, 1, 3], 3, [[2, 1]]), diff --git a/leetcode/path_sum_iii/playground.py b/leetcode/path_sum_iii/playground.py index 0569b5ac..0ed85621 100644 --- a/leetcode/path_sum_iii/playground.py +++ b/leetcode/path_sum_iii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/permutation_in_string/README.md b/leetcode/permutation_in_string/README.md index 2d2f4cb4..4bd8ddc1 100644 --- a/leetcode/permutation_in_string/README.md +++ b/leetcode/permutation_in_string/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, Two Pointers, String, Sliding Window -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 567](https://leetcode.com/problems/permutation-in-string/description/) diff --git a/leetcode/permutation_in_string/playground.py b/leetcode/permutation_in_string/playground.py index 3f131d6b..c96af63e 100644 --- a/leetcode/permutation_in_string/playground.py +++ b/leetcode/permutation_in_string/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/permutations/README.md b/leetcode/permutations/README.md index 69459b50..157a3520 100644 --- a/leetcode/permutations/README.md +++ b/leetcode/permutations/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Backtracking -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 46](https://leetcode.com/problems/permutations/description/) diff --git a/leetcode/permutations/playground.py b/leetcode/permutations/playground.py index 07de7dd2..e1971543 100644 --- a/leetcode/permutations/playground.py +++ b/leetcode/permutations/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/powx_n/README.md b/leetcode/powx_n/README.md new file mode 100644 index 00000000..b14e6c93 --- /dev/null +++ b/leetcode/powx_n/README.md @@ -0,0 +1,43 @@ +# Pow(x, n) + +**Difficulty:** Medium +**Topics:** Math, Recursion +**Tags:** neetcode-150 + +**LeetCode:** [Problem 50](https://leetcode.com/problems/powx-n/description/) + +## Problem Description + +Implement [pow(x, n)](http://www.cplusplus.com/reference/valarray/pow/), which calculates `x` raised to the power `n` (i.e., xn). + +## Examples + +### Example 1: + +``` +Input: x = 2.00000, n = 10 +Output: 1024.00000 +``` + +### Example 2: + +``` +Input: x = 2.10000, n = 3 +Output: 9.26100 +``` + +### Example 3: + +``` +Input: x = 2.00000, n = -2 +Output: 0.25000 +Explanation: 2^-2 = 1/2^2 = 1/4 = 0.25 +``` + +## Constraints + +- -100.0 < x < 100.0 +- -2^31 <= n <= 2^31 - 1 +- `n` is an integer. +- Either `x` is not zero or `n > 0`. +- -10^4 <= x^n <= 10^4 diff --git a/leetcode/powx_n/__init__.py b/leetcode/powx_n/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/leetcode/powx_n/helpers.py b/leetcode/powx_n/helpers.py new file mode 100644 index 00000000..d8458fcd --- /dev/null +++ b/leetcode/powx_n/helpers.py @@ -0,0 +1,8 @@ +def run_my_pow(solution_class: type, x: float, n: int): + implementation = solution_class() + return implementation.my_pow(x, n) + + +def assert_my_pow(result: float, expected: float) -> bool: + assert abs(result - expected) < 1e-5, f"Expected {expected}, got {result}" + return True diff --git a/leetcode/powx_n/playground.py b/leetcode/powx_n/playground.py new file mode 100644 index 00000000..47081493 --- /dev/null +++ b/leetcode/powx_n/playground.py @@ -0,0 +1,30 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.19.2 +# kernelspec: +# display_name: leetcode-py-py3.13 +# language: python +# name: python3 +# --- + +# %% +from helpers import assert_my_pow, run_my_pow +from solution import Solution + +# %% +# Example test case +x = 2.0 +n = 10 +expected = 1024.0 + +# %% +result = run_my_pow(Solution, x, n) +result + +# %% +assert_my_pow(result, expected) diff --git a/leetcode/powx_n/solution.py b/leetcode/powx_n/solution.py new file mode 100644 index 00000000..9236b15c --- /dev/null +++ b/leetcode/powx_n/solution.py @@ -0,0 +1,12 @@ +class Solution: + # Time: O(log n) + # Space: O(log n) + def my_pow(self, x: float, n: int) -> float: + if n == 0: + return 1.0 + if n < 0: + return 1.0 / self.my_pow(x, -n) + if n % 2 == 0: + half = self.my_pow(x, n // 2) + return half * half + return x * self.my_pow(x, n - 1) diff --git a/leetcode/powx_n/test_solution.py b/leetcode/powx_n/test_solution.py new file mode 100644 index 00000000..879e6b95 --- /dev/null +++ b/leetcode/powx_n/test_solution.py @@ -0,0 +1,37 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_my_pow, run_my_pow +from .solution import Solution + + +class TestPowXN: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "x, n, expected", + [ + (2.0, 10, 1024.0), + (2.1, 3, 9.261), + (2.0, -2, 0.25), + (1.0, 0, 1.0), + (0.5, 2, 0.25), + (2.0, 1, 2.0), + (3.0, 3, 27.0), + (1.0, 100, 1.0), + (0.0, 1, 0.0), + (2.0, -1, 0.5), + (10.0, 0, 1.0), + (1.5, 2, 2.25), + (0.5, -2, 4.0), + (2.0, -3, 0.125), + (1.0, -1, 1.0), + (0.1, 3, 0.001), + ], + ) + def test_my_pow(self, x: float, n: int, expected: float): + result = run_my_pow(Solution, x, n) + assert_my_pow(result, expected) diff --git a/leetcode/product_of_array_except_self/README.md b/leetcode/product_of_array_except_self/README.md index 3f75f037..cfab433b 100644 --- a/leetcode/product_of_array_except_self/README.md +++ b/leetcode/product_of_array_except_self/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Prefix Sum -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 238](https://leetcode.com/problems/product-of-array-except-self/description/) diff --git a/leetcode/product_of_array_except_self/playground.py b/leetcode/product_of_array_except_self/playground.py index f8a43ad6..ab87fb99 100644 --- a/leetcode/product_of_array_except_self/playground.py +++ b/leetcode/product_of_array_except_self/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/ransom_note/README.md b/leetcode/ransom_note/README.md index 59c1c124..87ef1d75 100644 --- a/leetcode/ransom_note/README.md +++ b/leetcode/ransom_note/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Hash Table, String, Counting -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 383](https://leetcode.com/problems/ransom-note/description/) diff --git a/leetcode/ransom_note/playground.py b/leetcode/ransom_note/playground.py index 86cbb151..fadc4d53 100644 --- a/leetcode/ransom_note/playground.py +++ b/leetcode/ransom_note/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/regular_expression_matching/README.md b/leetcode/regular_expression_matching/README.md new file mode 100644 index 00000000..f5dcb402 --- /dev/null +++ b/leetcode/regular_expression_matching/README.md @@ -0,0 +1,50 @@ +# Regular Expression Matching + +**Difficulty:** Hard +**Topics:** String, Dynamic Programming, Recursion +**Tags:** neetcode-150 + +**LeetCode:** [Problem 10](https://leetcode.com/problems/regular-expression-matching/description/) + +## Problem Description + +Given an input string `s` and a pattern `p`, implement regular expression matching with support for `'.'` and `'*'` where: + +- `'.'` Matches any single character. +- `'*'` Matches zero or more of the preceding element. + +Return a boolean indicating whether the matching covers the entire input string (not partial). + +## Examples + +### Example 1: + +``` +Input: s = "aa", p = "a" +Output: false +Explanation: "a" does not match the entire string "aa". +``` + +### Example 2: + +``` +Input: s = "aa", p = "a*" +Output: true +Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa". +``` + +### Example 3: + +``` +Input: s = "ab", p = ".*" +Output: true +Explanation: ".*" means "zero or more (*) of any character (.)". +``` + +## Constraints + +- 1 <= s.length <= 20 +- 1 <= p.length <= 20 +- `s` contains only lowercase English letters. +- `p` contains only lowercase English letters, `'.'`, and `'*'`. +- It is guaranteed for each appearance of the character `'*'`, there will be a previous valid character to match. diff --git a/leetcode/regular_expression_matching/__init__.py b/leetcode/regular_expression_matching/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/leetcode/regular_expression_matching/helpers.py b/leetcode/regular_expression_matching/helpers.py new file mode 100644 index 00000000..8bf948bd --- /dev/null +++ b/leetcode/regular_expression_matching/helpers.py @@ -0,0 +1,8 @@ +def run_is_match(solution_class: type, s: str, p: str): + implementation = solution_class() + return implementation.is_match(s, p) + + +def assert_is_match(result: bool, expected: bool) -> bool: + assert result == expected + return True diff --git a/leetcode/regular_expression_matching/playground.py b/leetcode/regular_expression_matching/playground.py new file mode 100644 index 00000000..7f7a9c5b --- /dev/null +++ b/leetcode/regular_expression_matching/playground.py @@ -0,0 +1,30 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.19.2 +# kernelspec: +# display_name: leetcode-py-py3.13 +# language: python +# name: python3 +# --- + +# %% +from helpers import assert_is_match, run_is_match +from solution import Solution + +# %% +# Example test case +s = "aa" +p = "a*" +expected = True + +# %% +result = run_is_match(Solution, s, p) +result + +# %% +assert_is_match(result, expected) diff --git a/leetcode/regular_expression_matching/solution.py b/leetcode/regular_expression_matching/solution.py new file mode 100644 index 00000000..7d1586f2 --- /dev/null +++ b/leetcode/regular_expression_matching/solution.py @@ -0,0 +1,22 @@ +class Solution: + # Time: O(m * n) + # Space: O(m * n) + def is_match(self, s: str, p: str) -> bool: + m, n = len(s), len(p) + dp = [[False] * (n + 1) for _ in range(m + 1)] + dp[0][0] = True + + for j in range(2, n + 1): + if p[j - 1] == "*": + dp[0][j] = dp[0][j - 2] + + for i in range(1, m + 1): + for j in range(1, n + 1): + if p[j - 1] == s[i - 1] or p[j - 1] == ".": + dp[i][j] = dp[i - 1][j - 1] + elif p[j - 1] == "*": + dp[i][j] = dp[i][j - 2] + if p[j - 2] == s[i - 1] or p[j - 2] == ".": + dp[i][j] = dp[i][j] or dp[i - 1][j] + + return dp[m][n] diff --git a/leetcode/regular_expression_matching/test_solution.py b/leetcode/regular_expression_matching/test_solution.py new file mode 100644 index 00000000..ddaa7b7c --- /dev/null +++ b/leetcode/regular_expression_matching/test_solution.py @@ -0,0 +1,38 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_is_match, run_is_match +from .solution import Solution + + +class TestRegularExpressionMatching: + def setup_method(self): + self.solution = Solution() + + @logged_test + @pytest.mark.parametrize( + "s, p, expected", + [ + ("aa", "a", False), + ("aa", "a*", True), + ("ab", ".*", True), + ("aab", "c*a*b", True), + ("mississippi", "mis*is*p*.", False), + ("a", "ab*", True), + ("", "a*", True), + ("", ".*", True), + ("ab", ".*c", False), + ("aaa", "a*a", True), + ("aaa", "aaaa", False), + ("abc", "a.c", True), + ("abc", "a.*c", True), + ("a", ".", True), + ("abcdef", ".*", True), + ("abbbbc", "ab*c", True), + ("abbbbc", "ab*bc", True), + ], + ) + def test_is_match(self, s: str, p: str, expected: bool): + result = run_is_match(Solution, s, p) + assert_is_match(result, expected) diff --git a/leetcode/remove_nth_node_from_end_of_list/README.md b/leetcode/remove_nth_node_from_end_of_list/README.md index 68b9e4b5..ecf19516 100644 --- a/leetcode/remove_nth_node_from_end_of_list/README.md +++ b/leetcode/remove_nth_node_from_end_of_list/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Linked List, Two Pointers -**Tags:** grind +**Tags:** algo-master-75, blind-75, grind, neetcode-150 **LeetCode:** [Problem 19](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/) diff --git a/leetcode/remove_nth_node_from_end_of_list/playground.py b/leetcode/remove_nth_node_from_end_of_list/playground.py index c5287df2..8bcb8a93 100644 --- a/leetcode/remove_nth_node_from_end_of_list/playground.py +++ b/leetcode/remove_nth_node_from_end_of_list/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reorder_list/README.md b/leetcode/reorder_list/README.md index 559ea03b..847dfa03 100644 --- a/leetcode/reorder_list/README.md +++ b/leetcode/reorder_list/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Linked List, Two Pointers, Stack, Recursion -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 143](https://leetcode.com/problems/reorder-list/description/) diff --git a/leetcode/reorder_list/playground.py b/leetcode/reorder_list/playground.py index 147f4f75..c3a37881 100644 --- a/leetcode/reorder_list/playground.py +++ b/leetcode/reorder_list/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reorder_list/test_solution.py b/leetcode/reorder_list/test_solution.py index 3d76a385..bf6cea94 100644 --- a/leetcode/reorder_list/test_solution.py +++ b/leetcode/reorder_list/test_solution.py @@ -25,10 +25,7 @@ def setup_method(self): ([1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 9, 2, 8, 3, 7, 4, 6, 5]), ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 10, 2, 9, 3, 8, 4, 7, 5, 6]), ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 11, 2, 10, 3, 9, 4, 8, 5, 7, 6]), - ( - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], - [1, 12, 2, 11, 3, 10, 4, 9, 5, 8, 6, 7], - ), + ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 12, 2, 11, 3, 10, 4, 9, 5, 8, 6, 7]), ( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [1, 13, 2, 12, 3, 11, 4, 10, 5, 9, 6, 8, 7], diff --git a/leetcode/reverse_bits/README.md b/leetcode/reverse_bits/README.md index 628d89cf..99b9e945 100644 --- a/leetcode/reverse_bits/README.md +++ b/leetcode/reverse_bits/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Divide and Conquer, Bit Manipulation -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 190](https://leetcode.com/problems/reverse-bits/description/) diff --git a/leetcode/reverse_bits/playground.py b/leetcode/reverse_bits/playground.py index 5daf7a83..fc915c6e 100644 --- a/leetcode/reverse_bits/playground.py +++ b/leetcode/reverse_bits/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reverse_integer/README.md b/leetcode/reverse_integer/README.md index 21181318..37741dd0 100644 --- a/leetcode/reverse_integer/README.md +++ b/leetcode/reverse_integer/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Math -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 7](https://leetcode.com/problems/reverse-integer/description/) diff --git a/leetcode/reverse_integer/playground.py b/leetcode/reverse_integer/playground.py index ae8f2402..a1fa246f 100644 --- a/leetcode/reverse_integer/playground.py +++ b/leetcode/reverse_integer/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reverse_linked_list/README.md b/leetcode/reverse_linked_list/README.md index ae96dddf..33088070 100644 --- a/leetcode/reverse_linked_list/README.md +++ b/leetcode/reverse_linked_list/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Linked List, Recursion -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 206](https://leetcode.com/problems/reverse-linked-list/description/) diff --git a/leetcode/reverse_linked_list/playground.py b/leetcode/reverse_linked_list/playground.py index 375048c9..9cdbaf2e 100644 --- a/leetcode/reverse_linked_list/playground.py +++ b/leetcode/reverse_linked_list/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reverse_linked_list_ii/playground.py b/leetcode/reverse_linked_list_ii/playground.py index 0ee9f365..de510db2 100644 --- a/leetcode/reverse_linked_list_ii/playground.py +++ b/leetcode/reverse_linked_list_ii/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reverse_nodes_in_k_group/README.md b/leetcode/reverse_nodes_in_k_group/README.md index 97b90655..69538313 100644 --- a/leetcode/reverse_nodes_in_k_group/README.md +++ b/leetcode/reverse_nodes_in_k_group/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Linked List, Recursion -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 25](https://leetcode.com/problems/reverse-nodes-in-k-group/description/) diff --git a/leetcode/reverse_nodes_in_k_group/playground.py b/leetcode/reverse_nodes_in_k_group/playground.py index 48163d02..befc7124 100644 --- a/leetcode/reverse_nodes_in_k_group/playground.py +++ b/leetcode/reverse_nodes_in_k_group/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/reverse_words_in_a_string/playground.py b/leetcode/reverse_words_in_a_string/playground.py index 539b9bc4..4d3614ae 100644 --- a/leetcode/reverse_words_in_a_string/playground.py +++ b/leetcode/reverse_words_in_a_string/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/rotate_array/playground.py b/leetcode/rotate_array/playground.py index 130ccd59..3de2fc08 100644 --- a/leetcode/rotate_array/playground.py +++ b/leetcode/rotate_array/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/rotate_image/README.md b/leetcode/rotate_image/README.md index 6aca24e6..88e171b9 100644 --- a/leetcode/rotate_image/README.md +++ b/leetcode/rotate_image/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Math, Matrix -**Tags:** blind +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 48](https://leetcode.com/problems/rotate-image/description/) diff --git a/leetcode/rotate_image/playground.py b/leetcode/rotate_image/playground.py index 69de2e45..2c8db853 100644 --- a/leetcode/rotate_image/playground.py +++ b/leetcode/rotate_image/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/rotting_oranges/README.md b/leetcode/rotting_oranges/README.md index 36d2c82e..6ed68953 100644 --- a/leetcode/rotting_oranges/README.md +++ b/leetcode/rotting_oranges/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Breadth-First Search, Matrix -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 994](https://leetcode.com/problems/rotting-oranges/description/) diff --git a/leetcode/rotting_oranges/playground.py b/leetcode/rotting_oranges/playground.py index 7f1f44e7..7ebd23ea 100644 --- a/leetcode/rotting_oranges/playground.py +++ b/leetcode/rotting_oranges/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/same_tree/README.md b/leetcode/same_tree/README.md index 54c11bf0..c8383e90 100644 --- a/leetcode/same_tree/README.md +++ b/leetcode/same_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, Breadth-First Search, Binary Tree -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 100](https://leetcode.com/problems/same-tree/description/) diff --git a/leetcode/same_tree/playground.py b/leetcode/same_tree/playground.py index a1caea3d..4260f333 100644 --- a/leetcode/same_tree/playground.py +++ b/leetcode/same_tree/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/search_in_rotated_sorted_array/README.md b/leetcode/search_in_rotated_sorted_array/README.md index f74397c9..39656038 100644 --- a/leetcode/search_in_rotated_sorted_array/README.md +++ b/leetcode/search_in_rotated_sorted_array/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Binary Search -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 33](https://leetcode.com/problems/search-in-rotated-sorted-array/description/) diff --git a/leetcode/search_in_rotated_sorted_array/playground.py b/leetcode/search_in_rotated_sorted_array/playground.py index 1c72b5aa..5351b568 100644 --- a/leetcode/search_in_rotated_sorted_array/playground.py +++ b/leetcode/search_in_rotated_sorted_array/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/serialize_and_deserialize_binary_tree/README.md b/leetcode/serialize_and_deserialize_binary_tree/README.md index 8226e6c3..25ab3183 100644 --- a/leetcode/serialize_and_deserialize_binary_tree/README.md +++ b/leetcode/serialize_and_deserialize_binary_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** String, Tree, Depth-First Search, Breadth-First Search, Design, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 297](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/) diff --git a/leetcode/serialize_and_deserialize_binary_tree/playground.py b/leetcode/serialize_and_deserialize_binary_tree/playground.py index 06cf1afb..9a12a506 100644 --- a/leetcode/serialize_and_deserialize_binary_tree/playground.py +++ b/leetcode/serialize_and_deserialize_binary_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/set_matrix_zeroes/README.md b/leetcode/set_matrix_zeroes/README.md index 55d73c15..bf3ad3e4 100644 --- a/leetcode/set_matrix_zeroes/README.md +++ b/leetcode/set_matrix_zeroes/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Matrix -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 73](https://leetcode.com/problems/set-matrix-zeroes/description/) diff --git a/leetcode/set_matrix_zeroes/playground.py b/leetcode/set_matrix_zeroes/playground.py index e2db3ab5..e6a568dc 100644 --- a/leetcode/set_matrix_zeroes/playground.py +++ b/leetcode/set_matrix_zeroes/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/single_number_iii/playground.py b/leetcode/single_number_iii/playground.py index 9cd45df3..60b7ac0e 100644 --- a/leetcode/single_number_iii/playground.py +++ b/leetcode/single_number_iii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/sliding_window_maximum/README.md b/leetcode/sliding_window_maximum/README.md index 1d72b541..47ab834a 100644 --- a/leetcode/sliding_window_maximum/README.md +++ b/leetcode/sliding_window_maximum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Queue, Sliding Window, Heap (Priority Queue), Monotonic Queue -**Tags:** algo-master-75 +**Tags:** algo-master-75, neetcode-150 **LeetCode:** [Problem 239](https://leetcode.com/problems/sliding-window-maximum/description/) diff --git a/leetcode/sliding_window_maximum/playground.py b/leetcode/sliding_window_maximum/playground.py index 85748e59..8f03ddda 100644 --- a/leetcode/sliding_window_maximum/playground.py +++ b/leetcode/sliding_window_maximum/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/sort_colors/README.md b/leetcode/sort_colors/README.md index ada8cf04..32d39ca4 100644 --- a/leetcode/sort_colors/README.md +++ b/leetcode/sort_colors/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Two Pointers, Sorting -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75 **LeetCode:** [Problem 75](https://leetcode.com/problems/sort-colors/description/) diff --git a/leetcode/sort_colors/playground.py b/leetcode/sort_colors/playground.py index 9b2c1549..5342acf8 100644 --- a/leetcode/sort_colors/playground.py +++ b/leetcode/sort_colors/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/spiral_matrix/README.md b/leetcode/spiral_matrix/README.md index e2aab0fe..962a5392 100644 --- a/leetcode/spiral_matrix/README.md +++ b/leetcode/spiral_matrix/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Matrix, Simulation -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 54](https://leetcode.com/problems/spiral-matrix/description/) diff --git a/leetcode/spiral_matrix/playground.py b/leetcode/spiral_matrix/playground.py index 07f54ab7..7b695c45 100644 --- a/leetcode/spiral_matrix/playground.py +++ b/leetcode/spiral_matrix/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/string_to_integer_atoi/README.md b/leetcode/string_to_integer_atoi/README.md index 513a46d0..a25d5d95 100644 --- a/leetcode/string_to_integer_atoi/README.md +++ b/leetcode/string_to_integer_atoi/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** String -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 8](https://leetcode.com/problems/string-to-integer-atoi/description/) diff --git a/leetcode/string_to_integer_atoi/playground.py b/leetcode/string_to_integer_atoi/playground.py index c0656aa8..59269202 100644 --- a/leetcode/string_to_integer_atoi/playground.py +++ b/leetcode/string_to_integer_atoi/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/subarray_sum_equals_k/playground.py b/leetcode/subarray_sum_equals_k/playground.py index be58148a..119b4b76 100644 --- a/leetcode/subarray_sum_equals_k/playground.py +++ b/leetcode/subarray_sum_equals_k/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/subsets/README.md b/leetcode/subsets/README.md index a28b3e07..92afb8d8 100644 --- a/leetcode/subsets/README.md +++ b/leetcode/subsets/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Backtracking, Bit Manipulation -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 78](https://leetcode.com/problems/subsets/description/) diff --git a/leetcode/subsets/playground.py b/leetcode/subsets/playground.py index c7f57bb1..3d2f8ceb 100644 --- a/leetcode/subsets/playground.py +++ b/leetcode/subsets/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/subtree_of_another_tree/README.md b/leetcode/subtree_of_another_tree/README.md index 5e5848f8..d682e3a4 100644 --- a/leetcode/subtree_of_another_tree/README.md +++ b/leetcode/subtree_of_another_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Tree, Depth-First Search, String Matching, Binary Tree, Hash Function -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 572](https://leetcode.com/problems/subtree-of-another-tree/description/) diff --git a/leetcode/subtree_of_another_tree/playground.py b/leetcode/subtree_of_another_tree/playground.py index 222018d1..6735ef1e 100644 --- a/leetcode/subtree_of_another_tree/playground.py +++ b/leetcode/subtree_of_another_tree/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/subtree_of_another_tree/test_solution.py b/leetcode/subtree_of_another_tree/test_solution.py index e77bd9f1..83d32874 100644 --- a/leetcode/subtree_of_another_tree/test_solution.py +++ b/leetcode/subtree_of_another_tree/test_solution.py @@ -31,10 +31,7 @@ def setup_method(self): ], ) def test_is_subtree( - self, - root_list: list[int | None], - sub_root_list: list[int | None], - expected: bool, + self, root_list: list[int | None], sub_root_list: list[int | None], expected: bool ): result = run_is_subtree(Solution, root_list, sub_root_list) assert_is_subtree(result, expected) diff --git a/leetcode/sum_of_two_integers/README.md b/leetcode/sum_of_two_integers/README.md index d6359d2d..d7610516 100644 --- a/leetcode/sum_of_two_integers/README.md +++ b/leetcode/sum_of_two_integers/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Math, Bit Manipulation -**Tags:** blind-75 +**Tags:** blind-75, neetcode-150 **LeetCode:** [Problem 371](https://leetcode.com/problems/sum-of-two-integers/description/) diff --git a/leetcode/sum_of_two_integers/playground.py b/leetcode/sum_of_two_integers/playground.py index 51043f51..caab5300 100644 --- a/leetcode/sum_of_two_integers/playground.py +++ b/leetcode/sum_of_two_integers/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/swap_nodes_in_pairs/README.md b/leetcode/swap_nodes_in_pairs/README.md index a53d0b5c..dd9d413f 100644 --- a/leetcode/swap_nodes_in_pairs/README.md +++ b/leetcode/swap_nodes_in_pairs/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Linked List, Recursion -**Tags:** grind, grind-75 +**Tags:** algo-master-75, grind **LeetCode:** [Problem 24](https://leetcode.com/problems/swap-nodes-in-pairs/description/) diff --git a/leetcode/swap_nodes_in_pairs/playground.py b/leetcode/swap_nodes_in_pairs/playground.py index b3b977bf..17185e2b 100644 --- a/leetcode/swap_nodes_in_pairs/playground.py +++ b/leetcode/swap_nodes_in_pairs/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/task_scheduler/README.md b/leetcode/task_scheduler/README.md index be7b1aa1..afe0a36b 100644 --- a/leetcode/task_scheduler/README.md +++ b/leetcode/task_scheduler/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Greedy, Sorting, Heap (Priority Queue), Counting -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 621](https://leetcode.com/problems/task-scheduler/description/) diff --git a/leetcode/task_scheduler/playground.py b/leetcode/task_scheduler/playground.py index e0bcc11b..1cf3e74f 100644 --- a/leetcode/task_scheduler/playground.py +++ b/leetcode/task_scheduler/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/three_sum/README.md b/leetcode/three_sum/README.md index c031c0ef..bacc252b 100644 --- a/leetcode/three_sum/README.md +++ b/leetcode/three_sum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Two Pointers, Sorting -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 15](https://leetcode.com/problems/three-sum/description/) diff --git a/leetcode/three_sum/playground.py b/leetcode/three_sum/playground.py index 818263e0..fbb3c83f 100644 --- a/leetcode/three_sum/playground.py +++ b/leetcode/three_sum/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/time_based_key_value_store/README.md b/leetcode/time_based_key_value_store/README.md index fd462201..827cb70a 100644 --- a/leetcode/time_based_key_value_store/README.md +++ b/leetcode/time_based_key_value_store/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Hash Table, String, Binary Search, Design -**Tags:** grind-75 +**Tags:** grind, grind-75, neetcode-150 **LeetCode:** [Problem 981](https://leetcode.com/problems/time-based-key-value-store/description/) diff --git a/leetcode/time_based_key_value_store/playground.py b/leetcode/time_based_key_value_store/playground.py index ead58921..d4a021cf 100644 --- a/leetcode/time_based_key_value_store/playground.py +++ b/leetcode/time_based_key_value_store/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/top_k_frequent_elements/README.md b/leetcode/top_k_frequent_elements/README.md index f9d4b7f1..b5e98934 100644 --- a/leetcode/top_k_frequent_elements/README.md +++ b/leetcode/top_k_frequent_elements/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Divide and Conquer, Sorting, Heap (Priority Queue), Bucket Sort, Counting, Quickselect -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 347](https://leetcode.com/problems/top-k-frequent-elements/description/) diff --git a/leetcode/top_k_frequent_elements/playground.py b/leetcode/top_k_frequent_elements/playground.py index 574a8435..6400f451 100644 --- a/leetcode/top_k_frequent_elements/playground.py +++ b/leetcode/top_k_frequent_elements/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/top_k_frequent_elements/test_solution.py b/leetcode/top_k_frequent_elements/test_solution.py index 0161d02c..37f42dbc 100644 --- a/leetcode/top_k_frequent_elements/test_solution.py +++ b/leetcode/top_k_frequent_elements/test_solution.py @@ -25,12 +25,7 @@ def setup_method(self): (Solution, [1, 2, 3, 1, 2, 3, 1, 2, 3], 3, [1, 2, 3]), (Solution, [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], 4, [1, 2, 3, 4]), (Solution, [1, 1, 1, 1, 2, 2, 2, 3, 3, 4], 3, [1, 2, 3]), - ( - Solution, - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5], - 5, - [1, 2, 3, 4, 5], - ), + (Solution, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5], 5, [1, 2, 3, 4, 5]), (Solution, [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5], 3, [1, 2, 3]), ], ) diff --git a/leetcode/top_k_frequent_words/playground.py b/leetcode/top_k_frequent_words/playground.py index 9a3264ce..703ac7a7 100644 --- a/leetcode/top_k_frequent_words/playground.py +++ b/leetcode/top_k_frequent_words/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/top_k_frequent_words/test_solution.py b/leetcode/top_k_frequent_words/test_solution.py index 7779af06..2a6e2915 100644 --- a/leetcode/top_k_frequent_words/test_solution.py +++ b/leetcode/top_k_frequent_words/test_solution.py @@ -32,17 +32,9 @@ def setup_method(self): (["x", "y", "z", "x", "y", "x"], 2, ["x", "y"]), (["test"], 1, ["test"]), (["a", "b", "a", "c", "b", "a"], 3, ["a", "b", "c"]), - ( - ["python", "java", "python", "cpp", "java", "python"], - 3, - ["python", "java", "cpp"], - ), + (["python", "java", "python", "cpp", "java", "python"], 3, ["python", "java", "cpp"]), (["one", "two", "three", "one", "two", "one"], 2, ["one", "two"]), - ( - ["red", "blue", "green", "red", "blue", "red"], - 3, - ["red", "blue", "green"], - ), + (["red", "blue", "green", "red", "blue", "red"], 3, ["red", "blue", "green"]), (["same", "same", "same", "same"], 1, ["same"]), ], ) diff --git a/leetcode/trapping_rain_water/README.md b/leetcode/trapping_rain_water/README.md index fc3a3178..31195f5d 100644 --- a/leetcode/trapping_rain_water/README.md +++ b/leetcode/trapping_rain_water/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, Two Pointers, Dynamic Programming, Stack, Monotonic Stack -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 42](https://leetcode.com/problems/trapping-rain-water/description/) diff --git a/leetcode/trapping_rain_water/playground.py b/leetcode/trapping_rain_water/playground.py index 749b3030..f3e5fc67 100644 --- a/leetcode/trapping_rain_water/playground.py +++ b/leetcode/trapping_rain_water/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/two_sum/README.md b/leetcode/two_sum/README.md index 7f8a41dd..431c561a 100644 --- a/leetcode/two_sum/README.md +++ b/leetcode/two_sum/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Array, Hash Table -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 1](https://leetcode.com/problems/two-sum/description/) diff --git a/leetcode/two_sum/helpers.py b/leetcode/two_sum/helpers.py index 00f7b734..3c93aa24 100644 --- a/leetcode/two_sum/helpers.py +++ b/leetcode/two_sum/helpers.py @@ -4,5 +4,5 @@ def run_two_sum(solution_class: type, nums: list[int], target: int): def assert_two_sum(result: list[int], expected: list[int]) -> bool: - assert result == expected + assert sorted(result) == sorted(expected) return True diff --git a/leetcode/two_sum/playground.py b/leetcode/two_sum/playground.py index 79ef5d42..c90a07f6 100644 --- a/leetcode/two_sum/playground.py +++ b/leetcode/two_sum/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/two_sum/test_solution.py b/leetcode/two_sum/test_solution.py index aefbad0f..de814b7d 100644 --- a/leetcode/two_sum/test_solution.py +++ b/leetcode/two_sum/test_solution.py @@ -36,4 +36,4 @@ def setup_method(self): ) def test_two_sum(self, nums: list[int], target: int, expected: list[int]): result = run_two_sum(Solution, nums, target) - assert_two_sum(sorted(result), sorted(expected)) + assert_two_sum(result, expected) diff --git a/leetcode/unique_paths/README.md b/leetcode/unique_paths/README.md index d40c8114..59f75fe9 100644 --- a/leetcode/unique_paths/README.md +++ b/leetcode/unique_paths/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Math, Dynamic Programming, Combinatorics -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 62](https://leetcode.com/problems/unique-paths/description/) diff --git a/leetcode/unique_paths/playground.py b/leetcode/unique_paths/playground.py index e70351b2..dc7183ec 100644 --- a/leetcode/unique_paths/playground.py +++ b/leetcode/unique_paths/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/unique_paths/test_solution.py b/leetcode/unique_paths/test_solution.py index 1e9be3c7..2018fa05 100644 --- a/leetcode/unique_paths/test_solution.py +++ b/leetcode/unique_paths/test_solution.py @@ -3,12 +3,14 @@ from leetcode_py import logged_test from .helpers import assert_unique_paths, run_unique_paths -from .solution import Solution, SolutionMath +from .solution import Solution class TestUniquePaths: + def setup_method(self): + self.solution = Solution() + @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionMath]) @pytest.mark.parametrize( "m, n, expected", [ @@ -29,6 +31,6 @@ class TestUniquePaths: (10, 10, 48620), ], ) - def test_unique_paths(self, solution_class, m: int, n: int, expected: int): - result = run_unique_paths(solution_class, m, n) + def test_unique_paths(self, m: int, n: int, expected: int): + result = run_unique_paths(Solution, m, n) assert_unique_paths(result, expected) diff --git a/leetcode/unique_paths/test_solution_extra.py b/leetcode/unique_paths/test_solution_extra.py new file mode 100644 index 00000000..89ed7b05 --- /dev/null +++ b/leetcode/unique_paths/test_solution_extra.py @@ -0,0 +1,34 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_unique_paths, run_unique_paths +from .solution import SolutionMath + + +class TestUniquePathsExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionMath]) + @pytest.mark.parametrize( + "m, n, expected", + [ + (3, 7, 28), + (3, 2, 3), + (1, 1, 1), + (1, 10, 1), + (10, 1, 1), + (2, 2, 2), + (3, 3, 6), + (4, 4, 20), + (5, 5, 70), + (2, 3, 3), + (3, 4, 10), + (4, 5, 35), + (6, 3, 21), + (7, 3, 28), + (10, 10, 48620), + ], + ) + def test_unique_paths(self, solution_class: type, m: int, n: int, expected: int): + result = run_unique_paths(solution_class, m, n) + assert_unique_paths(result, expected) diff --git a/leetcode/valid_anagram/README.md b/leetcode/valid_anagram/README.md index 1d0cc68d..9a394543 100644 --- a/leetcode/valid_anagram/README.md +++ b/leetcode/valid_anagram/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Hash Table, String, Sorting -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 242](https://leetcode.com/problems/valid-anagram/description/) diff --git a/leetcode/valid_anagram/playground.py b/leetcode/valid_anagram/playground.py index 46bfe1d5..b72db969 100644 --- a/leetcode/valid_anagram/playground.py +++ b/leetcode/valid_anagram/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/valid_palindrome/README.md b/leetcode/valid_palindrome/README.md index e2444ef2..8cb352d5 100644 --- a/leetcode/valid_palindrome/README.md +++ b/leetcode/valid_palindrome/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** Two Pointers, String -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 125](https://leetcode.com/problems/valid-palindrome/description/) diff --git a/leetcode/valid_palindrome/playground.py b/leetcode/valid_palindrome/playground.py index 64924c57..362e2942 100644 --- a/leetcode/valid_palindrome/playground.py +++ b/leetcode/valid_palindrome/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/valid_parentheses/README.md b/leetcode/valid_parentheses/README.md index 05d24f0b..3a478be7 100644 --- a/leetcode/valid_parentheses/README.md +++ b/leetcode/valid_parentheses/README.md @@ -2,7 +2,7 @@ **Difficulty:** Easy **Topics:** String, Stack -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 20](https://leetcode.com/problems/valid-parentheses/description/) diff --git a/leetcode/valid_parentheses/playground.py b/leetcode/valid_parentheses/playground.py index 7c648622..d34a3232 100644 --- a/leetcode/valid_parentheses/playground.py +++ b/leetcode/valid_parentheses/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/valid_sudoku/README.md b/leetcode/valid_sudoku/README.md index b7cccfa7..a9a24299 100644 --- a/leetcode/valid_sudoku/README.md +++ b/leetcode/valid_sudoku/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, Matrix -**Tags:** grind +**Tags:** grind, neetcode-150 **LeetCode:** [Problem 36](https://leetcode.com/problems/valid-sudoku/description/) diff --git a/leetcode/valid_sudoku/playground.py b/leetcode/valid_sudoku/playground.py index 68b4e1e8..64f6b4e5 100644 --- a/leetcode/valid_sudoku/playground.py +++ b/leetcode/valid_sudoku/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/validate_binary_search_tree/README.md b/leetcode/validate_binary_search_tree/README.md index 4b8b99fa..4f8ceb31 100644 --- a/leetcode/validate_binary_search_tree/README.md +++ b/leetcode/validate_binary_search_tree/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Tree, Depth-First Search, Binary Search Tree, Binary Tree -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 98](https://leetcode.com/problems/validate-binary-search-tree/description/) diff --git a/leetcode/validate_binary_search_tree/playground.py b/leetcode/validate_binary_search_tree/playground.py index bd7fd3c3..695b7753 100644 --- a/leetcode/validate_binary_search_tree/playground.py +++ b/leetcode/validate_binary_search_tree/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/validate_binary_search_tree/test_solution.py b/leetcode/validate_binary_search_tree/test_solution.py index e71dd329..226eb5ba 100644 --- a/leetcode/validate_binary_search_tree/test_solution.py +++ b/leetcode/validate_binary_search_tree/test_solution.py @@ -3,7 +3,7 @@ from leetcode_py import logged_test from .helpers import assert_is_valid_bst, run_is_valid_bst -from .solution import Solution, SolutionBFS, SolutionDFS +from .solution import Solution class TestValidateBinarySearchTree: @@ -11,7 +11,6 @@ def setup_method(self): self.solution = Solution() @logged_test - @pytest.mark.parametrize("solution_class", [Solution, SolutionDFS, SolutionBFS]) @pytest.mark.parametrize( "root_list, expected", [ @@ -29,6 +28,6 @@ def setup_method(self): ([3, 1, 5, 0, 2, 4, 6], True), ], ) - def test_is_valid_bst(self, solution_class: type, root_list: list[int | None], expected: bool): - result = run_is_valid_bst(solution_class, root_list) + def test_is_valid_bst(self, root_list: list[int | None], expected: bool): + result = run_is_valid_bst(Solution, root_list) assert_is_valid_bst(result, expected) diff --git a/leetcode/validate_binary_search_tree/test_solution_extra.py b/leetcode/validate_binary_search_tree/test_solution_extra.py new file mode 100644 index 00000000..80a66d3d --- /dev/null +++ b/leetcode/validate_binary_search_tree/test_solution_extra.py @@ -0,0 +1,31 @@ +import pytest + +from leetcode_py import logged_test + +from .helpers import assert_is_valid_bst, run_is_valid_bst +from .solution import SolutionBFS, SolutionDFS + + +class TestValidateBinarySearchTreeExtra: + @logged_test + @pytest.mark.parametrize("solution_class", [SolutionBFS, SolutionDFS]) + @pytest.mark.parametrize( + "root_list, expected", + [ + ([2, 1, 3], True), + ([5, 1, 4, None, None, 3, 6], False), + ([1], True), + ([1, 1], False), + ([10, 5, 15, None, None, 6, 20], False), + ([2, 1, 3, None, None, None, 4], True), + ([0], True), + ([2147483647], True), + ([-2147483648], True), + ([5, 4, 6, None, None, 3, 7], False), + ([10, 5, 15, None, None, 12, 20, None, None, None, None, 6, 25], True), + ([3, 1, 5, 0, 2, 4, 6], True), + ], + ) + def test_is_valid_bst(self, solution_class: type, root_list: list[int | None], expected: bool): + result = run_is_valid_bst(solution_class, root_list) + assert_is_valid_bst(result, expected) diff --git a/leetcode/word_break/README.md b/leetcode/word_break/README.md index 7bb52066..37543be9 100644 --- a/leetcode/word_break/README.md +++ b/leetcode/word_break/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Hash Table, String, Dynamic Programming, Trie, Memoization -**Tags:** grind-75 +**Tags:** algo-master-75, blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 139](https://leetcode.com/problems/word-break/description/) diff --git a/leetcode/word_break/playground.py b/leetcode/word_break/playground.py index 4ee7af7e..3719a9f2 100644 --- a/leetcode/word_break/playground.py +++ b/leetcode/word_break/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/word_ladder/README.md b/leetcode/word_ladder/README.md index 32820d34..372dafdd 100644 --- a/leetcode/word_ladder/README.md +++ b/leetcode/word_ladder/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Hash Table, String, Breadth-First Search -**Tags:** grind-75 +**Tags:** algo-master-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 127](https://leetcode.com/problems/word-ladder/description/) diff --git a/leetcode/word_ladder/playground.py b/leetcode/word_ladder/playground.py index a1dabdcc..0f4a72cc 100644 --- a/leetcode/word_ladder/playground.py +++ b/leetcode/word_ladder/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/word_search/README.md b/leetcode/word_search/README.md index 8ceb82b3..c1833d47 100644 --- a/leetcode/word_search/README.md +++ b/leetcode/word_search/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, String, Backtracking, Depth-First Search, Matrix -**Tags:** grind-75 +**Tags:** blind-75, grind, grind-75, neetcode-150 **LeetCode:** [Problem 79](https://leetcode.com/problems/word-search/description/) diff --git a/leetcode/word_search/playground.py b/leetcode/word_search/playground.py index 5e694588..da66af53 100644 --- a/leetcode/word_search/playground.py +++ b/leetcode/word_search/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/word_search_ii/README.md b/leetcode/word_search_ii/README.md index 87bf60d7..29af07e9 100644 --- a/leetcode/word_search_ii/README.md +++ b/leetcode/word_search_ii/README.md @@ -2,7 +2,7 @@ **Difficulty:** Hard **Topics:** Array, String, Backtracking, Trie, Matrix -**Tags:** blind-75 +**Tags:** algo-master-75, blind-75, neetcode-150 **LeetCode:** [Problem 212](https://leetcode.com/problems/word-search-ii/description/) diff --git a/leetcode/word_search_ii/playground.py b/leetcode/word_search_ii/playground.py index e3a7af1c..ca3275dc 100644 --- a/leetcode/word_search_ii/playground.py +++ b/leetcode/word_search_ii/playground.py @@ -5,7 +5,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode/word_search_ii/test_solution.py b/leetcode/word_search_ii/test_solution.py index 24647143..f3c19b1f 100644 --- a/leetcode/word_search_ii/test_solution.py +++ b/leetcode/word_search_ii/test_solution.py @@ -29,11 +29,7 @@ def setup_method(self): ([["a"]], ["b"], []), ([["a", "a"], ["a", "a"]], ["aaaa"], ["aaaa"]), ([["a", "a"], ["a", "a"]], ["aa"], ["aa"]), - ( - [["a", "b"], ["c", "d"]], - ["ab", "cd", "ac", "bd"], - ["ab", "cd", "ac", "bd"], - ), + ([["a", "b"], ["c", "d"]], ["ab", "cd", "ac", "bd"], ["ab", "cd", "ac", "bd"]), ([["a", "b"], ["c", "d"]], ["abcd"], []), ( [ diff --git a/leetcode/zero_one_matrix/README.md b/leetcode/zero_one_matrix/README.md index 29b3127f..0cad9e41 100644 --- a/leetcode/zero_one_matrix/README.md +++ b/leetcode/zero_one_matrix/README.md @@ -2,7 +2,7 @@ **Difficulty:** Medium **Topics:** Array, Dynamic Programming, Breadth-First Search, Matrix -**Tags:** grind-75 +**Tags:** grind, grind-75 **LeetCode:** [Problem 542](https://leetcode.com/problems/zero-one-matrix/description/) diff --git a/leetcode/zero_one_matrix/playground.py b/leetcode/zero_one_matrix/playground.py index a727bede..a69922fa 100644 --- a/leetcode/zero_one_matrix/playground.py +++ b/leetcode/zero_one_matrix/playground.py @@ -1,12 +1,11 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent # text_representation: # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.17.3 +# jupytext_version: 1.19.2 # kernelspec: # display_name: leetcode-py-py3.13 # language: python diff --git a/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json b/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json new file mode 100644 index 00000000..5a9be026 --- /dev/null +++ b/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json @@ -0,0 +1,87 @@ +{ + "problem_name": "regular_expression_matching", + "solution_class_name": "Solution", + "problem_number": "10", + "problem_title": "Regular Expression Matching", + "difficulty": "Hard", + "topics": "String, Dynamic Programming, Recursion", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Given an input string `s` and a pattern `p`, implement regular expression matching with support for `'.'` and `'*'` where:\n\n- `'.'` Matches any single character.\n- `'*'` Matches zero or more of the preceding element.\n\nReturn a boolean indicating whether the matching covers the entire input string (not partial).", + "_readme_examples": { + "list": [ + { + "content": "```\nInput: s = \"aa\", p = \"a\"\nOutput: false\nExplanation: \"a\" does not match the entire string \"aa\".\n```" + }, + { + "content": "```\nInput: s = \"aa\", p = \"a*\"\nOutput: true\nExplanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes \"aa\".\n```" + }, + { + "content": "```\nInput: s = \"ab\", p = \".*\"\nOutput: true\nExplanation: \".*\" means \"zero or more (*) of any character (.)\".\n```" + } + ] + }, + "readme_constraints": "- 1 <= s.length <= 20\n- 1 <= p.length <= 20\n- `s` contains only lowercase English letters.\n- `p` contains only lowercase English letters, `'.'`, and `'*'`.\n- It is guaranteed for each appearance of the character `'*'`, there will be a previous valid character to match.", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "is_match", + "helpers_run_signature": "(solution_class: type, s: str, p: str)", + "helpers_run_body": " implementation = solution_class()\n return implementation.is_match(s, p)", + "helpers_assert_name": "is_match", + "helpers_assert_signature": "(result: bool, expected: bool) -> bool", + "helpers_assert_body": " assert result == expected\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_is_match, run_is_match\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "RegularExpressionMatching", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "is_match", + "signature": "(self, s: str, p: str) -> bool", + "body": " # TODO: Implement is_match\n return False" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_is_match", + "signature": "(self, s: str, p: str, expected: bool)", + "parametrize": "s, p, expected", + "test_cases": { + "list": [ + "('aa', 'a', False)", + "('aa', 'a*', True)", + "('ab', '.*', True)", + "('aab', 'c*a*b', True)", + "('mississippi', 'mis*is*p*.', False)", + "('a', 'ab*', True)", + "('', 'a*', True)", + "('', '.*', True)", + "('ab', '.*c', False)", + "('aaa', 'a*a', True)", + "('aaa', 'aaaa', False)", + "('abc', 'a.c', True)", + "('abc', 'a.*c', True)", + "('a', '.', True)", + "('abcdef', '.*', True)", + "('abbbbc', 'ab*c', True)", + "('abbbbc', 'ab*bc', True)" + ] + }, + "body": " result = run_is_match(Solution, s, p)\n assert_is_match(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_is_match, assert_is_match\nfrom solution import Solution", + "playground_setup": "# Example test case\ns = 'aa'\np = 'a*'\nexpected = True", + "playground_run": "result = run_is_match(Solution, s, p)\nresult", + "playground_assert": "assert_is_match(result, expected)" +} diff --git a/sonar-project.properties b/sonar-project.properties index ae03bf46..5ca9b223 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -17,5 +17,8 @@ sonar.python.version=3.14 sonar.python.coverage.reportPaths=coverage.xml sonar.coverage.exclusions=**/leetcode/** +# Duplication exclusions +sonar.cpd.exclusions=**/test_solution_extra.py + # Code quality settings sonar.qualitygate.wait=true diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/combination_sum_ii.json b/src/leetcode_py/cli/resources/leetcode/json/problems/combination_sum_ii.json new file mode 100644 index 00000000..50499c92 --- /dev/null +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/combination_sum_ii.json @@ -0,0 +1,79 @@ +{ + "problem_name": "combination_sum_ii", + "solution_class_name": "Solution", + "problem_number": "40", + "problem_title": "Combination Sum II", + "difficulty": "Medium", + "topics": "Array, Backtracking", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Given a collection of candidate numbers (`candidates`) and a target number (`target`), find all unique combinations in `candidates` where the candidate numbers sum to `target`.\n\nEach number in `candidates` may only be used **once** in the combination.\n\n**Note:** The solution set must not contain duplicate combinations.", + "_readme_examples": { + "list": [ + { + "content": "```\nInput: candidates = [10,1,2,7,6,1,5], target = 8\nOutput: [[1,1,6],[1,2,5],[1,7],[2,6]]\n```" + }, + { "content": "```\nInput: candidates = [2,5,2,1,2], target = 5\nOutput: [[1,2,2],[5]]\n```" } + ] + }, + "readme_constraints": "- 1 <= candidates.length <= 100\n- 1 <= candidates[i] <= 50\n- 1 <= target <= 30", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "combination_sum2", + "helpers_run_signature": "(solution_class: type, candidates: list[int], target: int)", + "helpers_run_body": " implementation = solution_class()\n result = implementation.combination_sum2(candidates, target)\n return sorted([sorted(combo) for combo in result])", + "helpers_assert_name": "combination_sum2", + "helpers_assert_signature": "(result: list[list[int]], expected: list[list[int]]) -> bool", + "helpers_assert_body": " expected_sorted = sorted([sorted(combo) for combo in expected])\n assert result == expected_sorted\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_combination_sum2, run_combination_sum2\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "CombinationSumII", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "combination_sum2", + "signature": "(self, candidates: list[int], target: int) -> list[list[int]]", + "body": " # TODO: Implement combination_sum2\n return []" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_combination_sum2", + "signature": "(self, candidates: list[int], target: int, expected: list[list[int]])", + "parametrize": "candidates, target, expected", + "test_cases": { + "list": [ + "([10, 1, 2, 7, 6, 1, 5], 8, [[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]])", + "([2, 5, 2, 1, 2], 5, [[1, 2, 2], [5]])", + "([1], 1, [[1]])", + "([1], 2, [])", + "([2], 1, [])", + "([1, 1], 2, [[1, 1]])", + "([1, 1, 1], 2, [[1, 1]])", + "([1, 1, 1, 1, 1], 3, [[1, 1, 1]])", + "([1, 2], 4, [])", + "([1, 2, 3], 3, [[1, 2], [3]])", + "([5, 3, 2, 1], 6, [[1, 2, 3], [1, 5]])", + "([1, 2, 2, 2, 5], 5, [[1, 2, 2], [5]])", + "([2, 2, 2], 4, [[2, 2]])", + "([1, 1, 2, 2], 4, [[1, 1, 2], [2, 2]])" + ] + }, + "body": " result = run_combination_sum2(Solution, candidates, target)\n assert_combination_sum2(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_combination_sum2, assert_combination_sum2\nfrom solution import Solution", + "playground_setup": "# Example test case\ncandidates = [10, 1, 2, 7, 6, 1, 5]\ntarget = 8\nexpected = [[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]]", + "playground_run": "result = run_combination_sum2(Solution, candidates, target)\nresult", + "playground_assert": "assert_combination_sum2(result, expected)" +} diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/generate_parentheses.json b/src/leetcode_py/cli/resources/leetcode/json/problems/generate_parentheses.json new file mode 100644 index 00000000..6f7244fa --- /dev/null +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/generate_parentheses.json @@ -0,0 +1,76 @@ +{ + "problem_name": "generate_parentheses", + "solution_class_name": "Solution", + "problem_number": "22", + "problem_title": "Generate Parentheses", + "difficulty": "Medium", + "topics": "String, Dynamic Programming, Backtracking", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Given `n` pairs of parentheses, write a function to generate all combinations of well-formed parentheses.", + "_readme_examples": { + "list": [ + { + "content": "```\nInput: n = 3\nOutput: [\"((()))\",\"(()())\",\"(())()\",\"()(())\",\"()()()\"]\n```" + }, + { "content": "```\nInput: n = 1\nOutput: [\"()\"]\n```" } + ] + }, + "readme_constraints": "- 1 <= n <= 8", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "generate_parenthesis", + "helpers_run_signature": "(solution_class: type, n: int)", + "helpers_run_body": " implementation = solution_class()\n return sorted(implementation.generate_parenthesis(n))", + "helpers_assert_name": "generate_parenthesis", + "helpers_assert_signature": "(result: list[str], expected: list[str]) -> bool", + "helpers_assert_body": " assert sorted(result) == sorted(expected)\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_generate_parenthesis, run_generate_parenthesis\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "GenerateParentheses", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "generate_parenthesis", + "signature": "(self, n: int) -> list[str]", + "body": " # TODO: Implement generate_parenthesis\n return []" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_generate_parenthesis", + "signature": "(self, n: int, expected: list[str])", + "parametrize": "n, expected", + "test_cases": { + "list": [ + "(1, ['()'])", + "(2, ['(())', '()()'])", + "(3, ['((()))', '(()())', '(())()', '()(())', '()()()'])", + "(4, ['(((())))', '((()()))', '((())())', '((()))()', '(()(()))', '(()()())', '(()())()', '(())(())', '(())()()', '()((()))', '()(()())', '()(())()', '()()(())', '()()()()'])", + "(0, [''])", + "(5, ['((((()))))', '(((()())))', '(((())()))', '(((()))())', '(((())))()', '((()(())))', '((()()()))', '((()())())', '((()()))()', '((())(()))', '((())()())', '((())())()', '((()))(())', '((()))()()', '(()((())))', '(()(()()))', '(()(())())', '(()(()))()', '(()()(()))', '(()()()())', '(()()())()', '(()())(())', '(()())()()', '(())((()))', '(())(()())', '(())(())()', '(())()(())', '(())()()()', '()(((())))', '()((()()))', '()((())())', '()((()))()', '()(()(()))', '()(()()())', '()(()())()', '()(())(())', '()(())()()', '()()((()))', '()()(()())', '()()(())()', '()()()(())', '()()()()()'])", + "pytest.param(1, ['()'], id='dup1')", + "pytest.param(2, ['(())', '()()'], id='dup2')", + "pytest.param(3, ['((()))', '(()())', '(())()', '()(())', '()()()'], id='dup3a')", + "pytest.param(3, ['((()))', '(()())', '(())()', '()(())', '()()()'], id='dup3b')", + "pytest.param(3, ['((()))', '(()())', '(())()', '()(())', '()()()'], id='dup3c')" + ] + }, + "body": " result = run_generate_parenthesis(Solution, n)\n assert_generate_parenthesis(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_generate_parenthesis, assert_generate_parenthesis\nfrom solution import Solution", + "playground_setup": "# Example test case\nn = 3\nexpected = ['((()))', '(()())', '(())()', '()(())', '()()()']", + "playground_run": "result = run_generate_parenthesis(Solution, n)\nresult", + "playground_assert": "assert_generate_parenthesis(result, expected)" +} diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/multiply_strings.json b/src/leetcode_py/cli/resources/leetcode/json/problems/multiply_strings.json new file mode 100644 index 00000000..e4665547 --- /dev/null +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/multiply_strings.json @@ -0,0 +1,79 @@ +{ + "problem_name": "multiply_strings", + "solution_class_name": "Solution", + "problem_number": "43", + "problem_title": "Multiply Strings", + "difficulty": "Medium", + "topics": "Math, String, Simulation", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Given two non-negative integers `num1` and `num2` represented as strings, return the product of `num1` and `num2`, also represented as a string.\n\n**Note:** You must not use any built-in BigInteger library or convert the inputs to integer directly.", + "_readme_examples": { + "list": [ + { "content": "```\nInput: num1 = \"2\", num2 = \"3\"\nOutput: \"6\"\n```" }, + { "content": "```\nInput: num1 = \"123\", num2 = \"456\"\nOutput: \"56088\"\n```" } + ] + }, + "readme_constraints": "- 1 <= num1.length, num2.length <= 200\n- `num1` and `num2` consist of digits only.\n- Both `num1` and `num2` do not contain any leading zero, except the number `0` itself.", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "multiply", + "helpers_run_signature": "(solution_class: type, num1: str, num2: str)", + "helpers_run_body": " implementation = solution_class()\n return implementation.multiply(num1, num2)", + "helpers_assert_name": "multiply", + "helpers_assert_signature": "(result: str, expected: str) -> bool", + "helpers_assert_body": " assert result == expected\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_multiply, run_multiply\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "MultiplyStrings", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "multiply", + "signature": "(self, num1: str, num2: str) -> str", + "body": " # TODO: Implement multiply\n return ''" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_multiply", + "signature": "(self, num1: str, num2: str, expected: str)", + "parametrize": "num1, num2, expected", + "test_cases": { + "list": [ + "('2', '3', '6')", + "('123', '456', '56088')", + "('0', '0', '0')", + "('0', '123', '0')", + "('123', '0', '0')", + "('1', '1', '1')", + "('9', '9', '81')", + "('99', '99', '9801')", + "('999', '999', '998001')", + "('123456789', '987654321', '121932631112635269')", + "('2', '50', '100')", + "('10', '10', '100')", + "('100', '100', '10000')", + "('5', '5', '25')", + "('123', '1', '123')", + "('1', '999', '999')" + ] + }, + "body": " result = run_multiply(Solution, num1, num2)\n assert_multiply(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_multiply, assert_multiply\nfrom solution import Solution", + "playground_setup": "# Example test case\nnum1 = '123'\nnum2 = '456'\nexpected = '56088'", + "playground_run": "result = run_multiply(Solution, num1, num2)\nresult", + "playground_assert": "assert_multiply(result, expected)" +} diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/powx_n.json b/src/leetcode_py/cli/resources/leetcode/json/problems/powx_n.json new file mode 100644 index 00000000..0d1b4c81 --- /dev/null +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/powx_n.json @@ -0,0 +1,82 @@ +{ + "problem_name": "powx_n", + "solution_class_name": "Solution", + "problem_number": "50", + "problem_title": "Pow(x, n)", + "difficulty": "Medium", + "topics": "Math, Recursion", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Implement [pow(x, n)](http://www.cplusplus.com/reference/valarray/pow/), which calculates `x` raised to the power `n` (i.e., xn).", + "_readme_examples": { + "list": [ + { "content": "```\nInput: x = 2.00000, n = 10\nOutput: 1024.00000\n```" }, + { "content": "```\nInput: x = 2.10000, n = 3\nOutput: 9.26100\n```" }, + { + "content": "```\nInput: x = 2.00000, n = -2\nOutput: 0.25000\nExplanation: 2^-2 = 1/2^2 = 1/4 = 0.25\n```" + } + ] + }, + "readme_constraints": "- -100.0 < x < 100.0\n- -2^31 <= n <= 2^31 - 1\n- `n` is an integer.\n- Either `x` is not zero or `n > 0`.\n- -10^4 <= x^n <= 10^4", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "my_pow", + "helpers_run_signature": "(solution_class: type, x: float, n: int)", + "helpers_run_body": " implementation = solution_class()\n return implementation.my_pow(x, n)", + "helpers_assert_name": "my_pow", + "helpers_assert_signature": "(result: float, expected: float) -> bool", + "helpers_assert_body": " assert abs(result - expected) < 1e-5, f'Expected {expected}, got {result}'\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_my_pow, run_my_pow\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "PowXN", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "my_pow", + "signature": "(self, x: float, n: int) -> float", + "body": " # TODO: Implement my_pow\n return 0.0" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_my_pow", + "signature": "(self, x: float, n: int, expected: float)", + "parametrize": "x, n, expected", + "test_cases": { + "list": [ + "(2.0, 10, 1024.0)", + "(2.1, 3, 9.261)", + "(2.0, -2, 0.25)", + "(1.0, 0, 1.0)", + "(0.5, 2, 0.25)", + "(2.0, 1, 2.0)", + "(3.0, 3, 27.0)", + "(1.0, 100, 1.0)", + "(0.0, 1, 0.0)", + "(2.0, -1, 0.5)", + "(10.0, 0, 1.0)", + "(1.5, 2, 2.25)", + "(0.5, -2, 4.0)", + "(2.0, -3, 0.125)", + "(1.0, -1, 1.0)", + "(0.1, 3, 0.001)" + ] + }, + "body": " result = run_my_pow(Solution, x, n)\n assert_my_pow(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_my_pow, assert_my_pow\nfrom solution import Solution", + "playground_setup": "# Example test case\nx = 2.0\nn = 10\nexpected = 1024.0", + "playground_run": "result = run_my_pow(Solution, x, n)\nresult", + "playground_assert": "assert_my_pow(result, expected)" +} diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json b/src/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json new file mode 100644 index 00000000..5a9be026 --- /dev/null +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/regular_expression_matching.json @@ -0,0 +1,87 @@ +{ + "problem_name": "regular_expression_matching", + "solution_class_name": "Solution", + "problem_number": "10", + "problem_title": "Regular Expression Matching", + "difficulty": "Hard", + "topics": "String, Dynamic Programming, Recursion", + "_tags": { "list": ["neetcode-150"] }, + "readme_description": "Given an input string `s` and a pattern `p`, implement regular expression matching with support for `'.'` and `'*'` where:\n\n- `'.'` Matches any single character.\n- `'*'` Matches zero or more of the preceding element.\n\nReturn a boolean indicating whether the matching covers the entire input string (not partial).", + "_readme_examples": { + "list": [ + { + "content": "```\nInput: s = \"aa\", p = \"a\"\nOutput: false\nExplanation: \"a\" does not match the entire string \"aa\".\n```" + }, + { + "content": "```\nInput: s = \"aa\", p = \"a*\"\nOutput: true\nExplanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes \"aa\".\n```" + }, + { + "content": "```\nInput: s = \"ab\", p = \".*\"\nOutput: true\nExplanation: \".*\" means \"zero or more (*) of any character (.)\".\n```" + } + ] + }, + "readme_constraints": "- 1 <= s.length <= 20\n- 1 <= p.length <= 20\n- `s` contains only lowercase English letters.\n- `p` contains only lowercase English letters, `'.'`, and `'*'`.\n- It is guaranteed for each appearance of the character `'*'`, there will be a previous valid character to match.", + "readme_additional": "", + "helpers_imports": "", + "helpers_content": "", + "helpers_run_name": "is_match", + "helpers_run_signature": "(solution_class: type, s: str, p: str)", + "helpers_run_body": " implementation = solution_class()\n return implementation.is_match(s, p)", + "helpers_assert_name": "is_match", + "helpers_assert_signature": "(result: bool, expected: bool) -> bool", + "helpers_assert_body": " assert result == expected\n return True", + "solution_imports": "", + "solution_contents": "", + "solution_class_content": "", + "test_imports": "import pytest\nfrom leetcode_py import logged_test\nfrom .helpers import assert_is_match, run_is_match\nfrom .solution import Solution", + "test_content": "", + "test_class_name": "RegularExpressionMatching", + "test_class_content": " def setup_method(self):\n self.solution = Solution()", + "_solution_methods": { + "list": [ + { + "name": "is_match", + "signature": "(self, s: str, p: str) -> bool", + "body": " # TODO: Implement is_match\n return False" + } + ] + }, + "_test_helper_methods": { + "list": [{ "name": "setup_method", "parameters": "", "body": "self.solution = Solution()" }] + }, + "_test_methods": { + "list": [ + { + "name": "test_is_match", + "signature": "(self, s: str, p: str, expected: bool)", + "parametrize": "s, p, expected", + "test_cases": { + "list": [ + "('aa', 'a', False)", + "('aa', 'a*', True)", + "('ab', '.*', True)", + "('aab', 'c*a*b', True)", + "('mississippi', 'mis*is*p*.', False)", + "('a', 'ab*', True)", + "('', 'a*', True)", + "('', '.*', True)", + "('ab', '.*c', False)", + "('aaa', 'a*a', True)", + "('aaa', 'aaaa', False)", + "('abc', 'a.c', True)", + "('abc', 'a.*c', True)", + "('a', '.', True)", + "('abcdef', '.*', True)", + "('abbbbc', 'ab*c', True)", + "('abbbbc', 'ab*bc', True)" + ] + }, + "body": " result = run_is_match(Solution, s, p)\n assert_is_match(result, expected)" + } + ] + }, + "playground_imports": "from helpers import run_is_match, assert_is_match\nfrom solution import Solution", + "playground_setup": "# Example test case\ns = 'aa'\np = 'a*'\nexpected = True", + "playground_run": "result = run_is_match(Solution, s, p)\nresult", + "playground_assert": "assert_is_match(result, expected)" +} diff --git a/src/leetcode_py/cli/resources/leetcode/json/problems/two_sum.json b/src/leetcode_py/cli/resources/leetcode/json/problems/two_sum.json index 89101209..71e74e2c 100644 --- a/src/leetcode_py/cli/resources/leetcode/json/problems/two_sum.json +++ b/src/leetcode_py/cli/resources/leetcode/json/problems/two_sum.json @@ -31,7 +31,7 @@ "helpers_run_body": " implementation = solution_class()\n return implementation.two_sum(nums, target)", "helpers_assert_name": "two_sum", "helpers_assert_signature": "(result: list[int], expected: list[int]) -> bool", - "helpers_assert_body": " assert result == expected\n return True", + "helpers_assert_body": " assert sorted(result) == sorted(expected)\n return True", "solution_imports": "", "solution_contents": "", "solution_class_content": "", diff --git a/src/leetcode_py/cli/resources/leetcode/json/tags.json5 b/src/leetcode_py/cli/resources/leetcode/json/tags.json5 index d9501907..a8ae66e4 100644 --- a/src/leetcode_py/cli/resources/leetcode/json/tags.json5 +++ b/src/leetcode_py/cli/resources/leetcode/json/tags.json5 @@ -204,6 +204,7 @@ "clone_graph", "coin_change", "combination_sum", + "combination_sum_ii", "construct_binary_tree_from_preorder_and_inorder_traversal", "container_with_most_water", "contains_duplicate", @@ -220,6 +221,7 @@ "find_minimum_in_rotated_sorted_array", "find_the_duplicate_number", "gas_station", + "generate_parentheses", "graph_valid_tree", "group_anagrams", "house_robber", @@ -256,6 +258,7 @@ "min_stack", "minimum_window_substring", "missing_number", + "multiply_strings", "non_overlapping_intervals", "number_of_1_bits", "number_of_connected_components_in_an_undirected_graph", @@ -266,7 +269,9 @@ "partition_equal_subset_sum", "permutation_in_string", "permutations", + "powx_n", "product_of_array_except_self", + "regular_expression_matching", "remove_nth_node_from_end_of_list", "reorder_list", "reverse_bits", diff --git a/src/leetcode_py/tools/generator.py b/src/leetcode_py/tools/generator.py index d0a1bd20..91da381c 100644 --- a/src/leetcode_py/tools/generator.py +++ b/src/leetcode_py/tools/generator.py @@ -72,6 +72,8 @@ def batch_format_and_check(directories: list[Path]) -> None: "**/solution.py:ARG002", "--per-file-ignores", "**/playground.ipynb:B018", + "--per-file-ignores", + "**/playground.py:B018", "--fix", "--exit-non-zero-on-fix", "--line-length", @@ -117,7 +119,7 @@ def merge_tags(data: dict) -> dict: existing_tags = data.get("_tags", {}).get("list", []) # Merge and deduplicate tags - all_tags = list(set(system_tags + existing_tags)) + all_tags = sorted(set(system_tags + existing_tags)) # Update data with merged tags if all_tags: diff --git a/uv.lock b/uv.lock index 966025bd..f2cdff70 100644 --- a/uv.lock +++ b/uv.lock @@ -2,8 +2,7 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", "python_full_version < '3.11'", ] @@ -98,7 +97,7 @@ wheels = [ [[package]] name = "bakefile" -version = "0.0.45" +version = "0.0.49" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautysh" }, @@ -116,9 +115,9 @@ dependencies = [ { name = "typer" }, { name = "uv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/92/201e0c7a224a2ccb29555729bf0b22300bc718d256c7ee8ac9efe644aa29/bakefile-0.0.45.tar.gz", hash = "sha256:dc2bc8794f471525c1b8d869cbd75693158dd2ccd067798311b6614207d2f699", size = 66283, upload-time = "2026-04-15T02:20:21.391Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/61/894220197a5feb87a41e8cfa145d245ce8fbcc45b0c876bb165e4a8cd21a/bakefile-0.0.49.tar.gz", hash = "sha256:80ca98ffe5deb6dcf560df4f62dd9a780e6d7ff671d01c3ecf711f4bf614c61b", size = 67343, upload-time = "2026-05-08T03:48:32.551Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/51/ec23d27ce591654d47cab5030ef94c71c99ae53c265d88fb97dba08f96d0/bakefile-0.0.45-py3-none-any.whl", hash = "sha256:5dccd69a4678e47008c2854241a75e377fa857e9cd7e4dbe6904a4d95b5d28b9", size = 97870, upload-time = "2026-04-15T02:20:22.708Z" }, + { url = "https://files.pythonhosted.org/packages/20/ac/d1cc25f35f1e1a4de589fa9df86ef2a50bfe9f0b141fb5babe1f3b7969c7/bakefile-0.0.49-py3-none-any.whl", hash = "sha256:2fa614d5b160d43353b719085b33e7980fd84e5a786b5b867c40ecd118f1b608", size = 99020, upload-time = "2026-05-08T03:48:34.088Z" }, ] [package.optional-dependencies] @@ -154,11 +153,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] @@ -402,14 +401,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.2" +version = "8.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, ] [[package]] @@ -451,115 +450,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, - { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, - { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, - { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, - { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, - { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, - { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, - { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, - { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, - { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, - { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, - { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, - { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, - { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, - { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, - { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, - { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, - { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, - { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, - { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, - { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, - { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, - { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, - { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, - { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, - { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, - { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, - { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, - { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, - { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, - { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, - { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, - { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, - { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, - { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, - { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, - { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, - { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, - { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, - { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, - { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, - { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, - { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, - { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, - { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +version = "7.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, + { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, + { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, + { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, + { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, + { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, + { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, + { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, + { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, + { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, + { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, + { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, + { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, + { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, + { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, + { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, + { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, + { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, + { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, + { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, + { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, + { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, + { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, + { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, + { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, + { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, + { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, + { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, + { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, + { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, + { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, + { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, + { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, + { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, + { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, ] [package.optional-dependencies] @@ -569,51 +568,51 @@ toml = [ [[package]] name = "cryptography" -version = "46.0.7" +version = "48.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, - { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, - { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, - { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, - { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, - { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, - { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, - { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, - { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" }, - { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" }, - { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" }, - { url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" }, - { url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" }, - { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" }, - { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" }, - { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, - { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, - { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, - { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, - { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, - { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, - { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, - { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, - { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15", size = 4219700, upload-time = "2026-04-08T01:57:40.625Z" }, - { url = "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455", size = 4385982, upload-time = "2026-04-08T01:57:42.725Z" }, - { url = "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65", size = 4219115, upload-time = "2026-04-08T01:57:44.939Z" }, - { url = "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968", size = 4385479, upload-time = "2026-04-08T01:57:46.86Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, ] [[package]] @@ -647,11 +646,11 @@ wheels = [ [[package]] name = "decorator" -version = "5.2.1" +version = "5.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/50/a39dd7ab407e93978dfa07d109b7d633e37958c89f30cbcec061b77b3ebc/decorator-5.3.0.tar.gz", hash = "sha256:95fda3122972c847cf0ff7e0ce2829bf25136f2526b627b3da85b60ca5f485c0", size = 58431, upload-time = "2026-05-17T06:59:57.258Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6f/f8d0bba4dc2a69817d74f640d504650241ebf2f9f7263426f1b953b344d4/decorator-5.3.0-py3-none-any.whl", hash = "sha256:f8c2d71ede92f073144ddd7f3e9fbbc3bd0f2f29522c9d75ee648d66553834f4", size = 11104, upload-time = "2026-05-17T06:59:54.676Z" }, ] [[package]] @@ -734,11 +733,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.28.0" +version = "3.29.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/17/6e8890271880903e3538660a21d63a6c1fea969ac71d0d6b608b78727fa9/filelock-3.28.0.tar.gz", hash = "sha256:4ed1010aae813c4ee8d9c660e4792475ee60c4a0ba76073ceaf862bd317e3ca6", size = 56474, upload-time = "2026-04-14T22:54:33.625Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/21/2f728888c45033d34a417bfcd248ea2564c9e08ab1bfd301377cf05d5586/filelock-3.28.0-py3-none-any.whl", hash = "sha256:de9af6712788e7171df1b28b15eba2446c69721433fa427a9bee07b17820a9db", size = 39189, upload-time = "2026-04-14T22:54:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" }, ] [[package]] @@ -752,20 +751,20 @@ wheels = [ [[package]] name = "identify" -version = "2.6.18" +version = "2.6.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, ] [[package]] name = "idna" -version = "3.11" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -798,8 +797,7 @@ dependencies = [ { name = "comm" }, { name = "debugpy" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "ipython", version = "9.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "matplotlib-inline" }, @@ -842,51 +840,28 @@ wheels = [ [[package]] name = "ipython" -version = "9.10.1" +version = "9.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ - { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version == '3.11.*'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version == '3.11.*'" }, - { name = "jedi", marker = "python_full_version == '3.11.*'" }, - { name = "matplotlib-inline", marker = "python_full_version == '3.11.*'" }, - { name = "pexpect", marker = "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version == '3.11.*'" }, - { name = "pygments", marker = "python_full_version == '3.11.*'" }, - { name = "stack-data", marker = "python_full_version == '3.11.*'" }, - { name = "traitlets", marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "psutil", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/25/daae0e764047b0a2480c7bbb25d48f4f509b5818636562eeac145d06dfee/ipython-9.10.1.tar.gz", hash = "sha256:e170e9b2a44312484415bdb750492699bf329233b03f2557a9692cce6466ada4", size = 4426663, upload-time = "2026-03-27T09:53:26.244Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/09/ba70f8d662d5671687da55ad2cc0064cf795b15e1eea70907532202e7c97/ipython-9.10.1-py3-none-any.whl", hash = "sha256:82d18ae9fb9164ded080c71ef92a182ee35ee7db2395f67616034bebb020a232", size = 622827, upload-time = "2026-03-27T09:53:24.566Z" }, -] - -[[package]] -name = "ipython" -version = "9.12.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.12'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.12'" }, - { name = "jedi", marker = "python_full_version >= '3.12'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.12'" }, - { name = "pexpect", marker = "python_full_version >= '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, - { name = "stack-data", marker = "python_full_version >= '3.12'" }, - { name = "traitlets", marker = "python_full_version >= '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/73/7114f80a8f9cabdb13c27732dce24af945b2923dcab80723602f7c8bc2d8/ipython-9.12.0.tar.gz", hash = "sha256:01daa83f504b693ba523b5a407246cabde4eb4513285a3c6acaff11a66735ee4", size = 4428879, upload-time = "2026-03-27T09:42:45.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/22/906c8108974c673ebef6356c506cebb6870d48cedea3c41e949e2dd556bb/ipython-9.12.0-py3-none-any.whl", hash = "sha256:0f2701e8ee86e117e37f50563205d36feaa259d2e08d4a6bc6b6d74b18ce128d", size = 625661, upload-time = "2026-03-27T09:42:42.831Z" }, + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, ] [[package]] @@ -927,26 +902,26 @@ wheels = [ [[package]] name = "jaraco-functools" -version = "4.4.0" +version = "4.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, + { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, ] [[package]] name = "jedi" -version = "0.19.2" +version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, ] [[package]] @@ -1037,7 +1012,7 @@ wheels = [ [[package]] name = "jupytext" -version = "1.19.1" +version = "1.19.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, @@ -1047,9 +1022,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/a5/80c02f307c8ce863cb33e27daf049315e9d96979e14eead700923b5ec9cc/jupytext-1.19.1.tar.gz", hash = "sha256:82587c07e299173c70ed5e8ec7e75183edf1be289ed518bab49ad0d4e3d5f433", size = 4307829, upload-time = "2026-01-25T21:35:13.276Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/2d/15624c3d9440d85a280ff13d2d23afd989802f25470ac59932f4fef6f0c6/jupytext-1.19.3.tar.gz", hash = "sha256:713c3ed4441afe0f31474d28ea2e6b61a268c04c40fd78e5ccfd7f7ac9e9f766", size = 4305350, upload-time = "2026-05-17T09:09:29.294Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl", hash = "sha256:d8975035155d034bdfde5c0c37891425314b7ea8d3a6c4b5d18c294348714cd9", size = 170478, upload-time = "2026-01-25T21:35:11.17Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ec/d9be3bd1db141e76b2f525c265f70e66edd30a51a3307d8edf0ef1909c54/jupytext-1.19.3-py3-none-any.whl", hash = "sha256:acf75492f80895ad8e664fd8db1708b617008dd0e71c341a1abc3d0d07310ed0", size = 170579, upload-time = "2026-05-17T09:09:27.478Z" }, ] [[package]] @@ -1146,14 +1121,14 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.0.0" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] [[package]] @@ -1243,26 +1218,26 @@ wheels = [ [[package]] name = "matplotlib-inline" -version = "0.2.1" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, ] [[package]] name = "mdit-py-plugins" -version = "0.5.0" +version = "0.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, ] [[package]] @@ -1305,8 +1280,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "autopep8" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "ipython", version = "9.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "tokenize-rt" }, { name = "tomli" }, ] @@ -1335,110 +1309,110 @@ wheels = [ [[package]] name = "orjson" -version = "3.11.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/90/5d81f61fe3e4270da80c71442864c091cee3003cc8984c75f413fe742a07/orjson-3.11.8-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e6693ff90018600c72fd18d3d22fa438be26076cd3c823da5f63f7bab28c11cb", size = 229663, upload-time = "2026-03-31T16:14:30.708Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ef/85e06b0eb11de6fb424120fd5788a07035bd4c5e6bb7841ae9972a0526d1/orjson-3.11.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93de06bc920854552493c81f1f729fab7213b7db4b8195355db5fda02c7d1363", size = 132321, upload-time = "2026-03-31T16:14:32.317Z" }, - { url = "https://files.pythonhosted.org/packages/86/71/089338ee51b3132f050db0864a7df9bdd5e94c2a03820ab8a91e8f655618/orjson-3.11.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe0b8c83e0f36247fc9431ce5425a5d95f9b3a689133d494831bdbd6f0bceb13", size = 130658, upload-time = "2026-03-31T16:14:33.935Z" }, - { url = "https://files.pythonhosted.org/packages/10/0d/f39d8802345d0ad65f7fd4374b29b9b59f98656dc30f21ca5c773265b2f0/orjson-3.11.8-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d823831105c01f6c8029faf297633dbeb30271892bd430e9c24ceae3734744", size = 135708, upload-time = "2026-03-31T16:14:35.224Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b5/40aae576b3473511696dcffea84fde638b2b64774eb4dcb8b2c262729f8a/orjson-3.11.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60c0423f15abb6cf78f56dff00168a1b582f7a1c23f114036e2bfc697814d5f", size = 147047, upload-time = "2026-03-31T16:14:36.489Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f0/778a84458d1fdaa634b2e572e51ce0b354232f580b2327e1f00a8d88c38c/orjson-3.11.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01928d0476b216ad2201823b0a74000440360cef4fed1912d297b8d84718f277", size = 133072, upload-time = "2026-03-31T16:14:37.715Z" }, - { url = "https://files.pythonhosted.org/packages/bf/d3/1bbf2fc3ffcc4b829ade554b574af68cec898c9b5ad6420a923c75a073d3/orjson-3.11.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4a639049c44d36a6d1ae0f4a94b271605c745aee5647fa8ffaabcdc01b69a6", size = 133867, upload-time = "2026-03-31T16:14:39.356Z" }, - { url = "https://files.pythonhosted.org/packages/08/94/6413da22edc99a69a8d0c2e83bf42973b8aa94d83ef52a6d39ac85da00bc/orjson-3.11.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3222adff1e1ff0dce93c16146b93063a7793de6c43d52309ae321234cdaf0f4d", size = 142268, upload-time = "2026-03-31T16:14:40.972Z" }, - { url = "https://files.pythonhosted.org/packages/4a/5f/aa5dbaa6136d7ba55f5461ac2e885efc6e6349424a428927fd46d68f4396/orjson-3.11.8-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3223665349bbfb68da234acd9846955b1a0808cbe5520ff634bf253a4407009b", size = 424008, upload-time = "2026-03-31T16:14:42.637Z" }, - { url = "https://files.pythonhosted.org/packages/fa/aa/2c1962d108c7fe5e27aa03a354b378caf56d8eafdef15fd83dec081ce45a/orjson-3.11.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:61c9d357a59465736022d5d9ba06687afb7611dfb581a9d2129b77a6fcf78e59", size = 147942, upload-time = "2026-03-31T16:14:44.256Z" }, - { url = "https://files.pythonhosted.org/packages/47/d1/65f404f4c47eb1b0b4476f03ec838cac0c4aa933920ff81e5dda4dee14e7/orjson-3.11.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58fb9b17b4472c7b1dcf1a54583629e62e23779b2331052f09a9249edf81675b", size = 136640, upload-time = "2026-03-31T16:14:45.884Z" }, - { url = "https://files.pythonhosted.org/packages/90/5f/7b784aea98bdb125a2f2da7c27d6c2d2f6d943d96ef0278bae596d563f85/orjson-3.11.8-cp310-cp310-win32.whl", hash = "sha256:b43dc2a391981d36c42fa57747a49dae793ef1d2e43898b197925b5534abd10a", size = 132066, upload-time = "2026-03-31T16:14:47.397Z" }, - { url = "https://files.pythonhosted.org/packages/92/ec/2e284af8d6c9478df5ef938917743f61d68f4c70d17f1b6e82f7e3b8dba1/orjson-3.11.8-cp310-cp310-win_amd64.whl", hash = "sha256:c98121237fea2f679480765abd566f7713185897f35c9e6c2add7e3a9900eb61", size = 127609, upload-time = "2026-03-31T16:14:48.78Z" }, - { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, - { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, - { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, - { url = "https://files.pythonhosted.org/packages/08/4a/2025a60ff3f5c8522060cda46612d9b1efa653de66ed2908591d8d82f22d/orjson-3.11.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eda5b8b6be91d3f26efb7dc6e5e68ee805bc5617f65a328587b35255f138bf4", size = 130483, upload-time = "2026-03-31T16:14:54.605Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3c/b9cde05bdc7b2385c66014e0620627da638d3d04e4954416ab48c31196c5/orjson-3.11.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8db7bfb6fe03581bbab54d7c4124a6dd6a7f4273a38f7267197890f094675f", size = 135481, upload-time = "2026-03-31T16:14:55.901Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f2/a8238e7734de7cb589fed319857a8025d509c89dc52fdcc88f39c6d03d5a/orjson-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8b5231de76c528a46b57010bbd83fb51e056aa0220a372fd5065e978406f1c", size = 146819, upload-time = "2026-03-31T16:14:57.548Z" }, - { url = "https://files.pythonhosted.org/packages/db/10/dbf1e2a3cafea673b1b4350e371877b759060d6018a998643b7040e5de48/orjson-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58a4a208a6fbfdb7a7327b8f201c6014f189f721fd55d047cafc4157af1bc62a", size = 132846, upload-time = "2026-03-31T16:14:58.91Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, - { url = "https://files.pythonhosted.org/packages/5c/cc/2f78ea241d52b717d2efc38878615fe80425bf2beb6e68c984dde257a766/orjson-3.11.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ff51f9d657d1afb6f410cb435792ce4e1fe427aab23d2fcd727a2876e21d4cb6", size = 423845, upload-time = "2026-03-31T16:15:03.703Z" }, - { url = "https://files.pythonhosted.org/packages/70/07/c17dcf05dd8045457538428a983bf1f1127928df5bf328cb24d2b7cddacb/orjson-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6dbe9a97bdb4d8d9d5367b52a7c32549bba70b2739c58ef74a6964a6d05ae054", size = 147729, upload-time = "2026-03-31T16:15:05.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, - { url = "https://files.pythonhosted.org/packages/b2/35/4d3cc3a3d616035beb51b24a09bb872942dc452cf2df0c1d11ab35046d9f/orjson-3.11.8-cp311-cp311-win32.whl", hash = "sha256:0e32f7154299f42ae66f13488963269e5eccb8d588a65bc839ed986919fc9fac", size = 131870, upload-time = "2026-03-31T16:15:08.678Z" }, - { url = "https://files.pythonhosted.org/packages/13/26/9fe70f81d16b702f8c3a775e8731b50ad91d22dacd14c7599b60a0941cd1/orjson-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:25e0c672a2e32348d2eb33057b41e754091f2835f87222e4675b796b92264f06", size = 127440, upload-time = "2026-03-31T16:15:09.994Z" }, - { url = "https://files.pythonhosted.org/packages/e8/c6/b038339f4145efd2859c1ca53097a52c0bb9cbdd24f947ebe146da1ad067/orjson-3.11.8-cp311-cp311-win_arm64.whl", hash = "sha256:9185589c1f2a944c17e26c9925dcdbc2df061cc4a145395c57f0c51f9b5dbfcd", size = 127399, upload-time = "2026-03-31T16:15:11.412Z" }, - { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, - { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, - { url = "https://files.pythonhosted.org/packages/52/4b/5500f76f0eece84226e0689cb48dcde081104c2fa6e2483d17ca13685ffb/orjson-3.11.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54153d21520a71a4c82a0dbb4523e468941d549d221dc173de0f019678cf3813", size = 130368, upload-time = "2026-03-31T16:15:17.066Z" }, - { url = "https://files.pythonhosted.org/packages/da/4e/58b927e08fbe9840e6c920d9e299b051ea667463b1f39a56e668669f8508/orjson-3.11.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:469ac2125611b7c5741a0b3798cd9e5786cbad6345f9f400c77212be89563bec", size = 135540, upload-time = "2026-03-31T16:15:18.404Z" }, - { url = "https://files.pythonhosted.org/packages/56/7c/ba7cb871cba1bcd5cd02ee34f98d894c6cea96353ad87466e5aef2429c60/orjson-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14778ffd0f6896aa613951a7fbf4690229aa7a543cb2bfbe9f358e08aafa9546", size = 146877, upload-time = "2026-03-31T16:15:19.833Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/eb9c25fc1386696c6a342cd361c306452c75e0b55e86ad602dd4827a7fd7/orjson-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea56a955056a6d6c550cf18b3348656a9d9a4f02e2d0c02cabf3c73f1055d506", size = 132837, upload-time = "2026-03-31T16:15:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cf/eb284847487821a5d415e54149a6449ba9bfc5872ce63ab7be41b8ec401c/orjson-3.11.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3f262401086a3960586af06c054609365e98407151f5ea24a62893a40d80dbbb", size = 423742, upload-time = "2026-03-31T16:15:26.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/09/e12423d327071c851c13e76936f144a96adacfc037394dec35ac3fc8d1e8/orjson-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e8c6218b614badf8e229b697865df4301afa74b791b6c9ade01d19a9953a942", size = 147806, upload-time = "2026-03-31T16:15:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, - { url = "https://files.pythonhosted.org/packages/be/c9/135194a02ab76b04ed9a10f68624b7ebd238bbe55548878b11ff15a0f352/orjson-3.11.8-cp312-cp312-win32.whl", hash = "sha256:e0950ed1bcb9893f4293fd5c5a7ee10934fbf82c4101c70be360db23ce24b7d2", size = 131966, upload-time = "2026-03-31T16:15:31.687Z" }, - { url = "https://files.pythonhosted.org/packages/ed/9a/9796f8fbe3cf30ce9cb696748dbb535e5c87be4bf4fe2e9ca498ef1fa8cf/orjson-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:3cf17c141617b88ced4536b2135c552490f07799f6ad565948ea07bef0dcb9a6", size = 127441, upload-time = "2026-03-31T16:15:33.333Z" }, - { url = "https://files.pythonhosted.org/packages/cc/47/5aaf54524a7a4a0dd09dd778f3fa65dd2108290615b652e23d944152bc8e/orjson-3.11.8-cp312-cp312-win_arm64.whl", hash = "sha256:48854463b0572cc87dac7d981aa72ed8bf6deedc0511853dc76b8bbd5482d36d", size = 127364, upload-time = "2026-03-31T16:15:34.748Z" }, - { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, - { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, - { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, - { url = "https://files.pythonhosted.org/packages/dd/cc/faee30cd8f00421999e40ef0eba7332e3a625ce91a58200a2f52c7fef235/orjson-3.11.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:436c4922968a619fb7fef1ccd4b8b3a76c13b67d607073914d675026e911a65c", size = 130361, upload-time = "2026-03-31T16:15:41.274Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/a6c55896197f97b6d4b4e7c7fd77e7235517c34f5d6ad5aadd43c54c6d7c/orjson-3.11.8-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ab359aff0436d80bfe8a23b46b5fea69f1e18aaf1760a709b4787f1318b317f", size = 135521, upload-time = "2026-03-31T16:15:42.758Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7c/ca3a3525aa32ff636ebb1778e77e3587b016ab2edb1b618b36ba96f8f2c0/orjson-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89b6d0b3a8d81e1929d3ab3d92bbc225688bd80a770c49432543928fe09ac55", size = 146862, upload-time = "2026-03-31T16:15:44.341Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0c/18a9d7f18b5edd37344d1fd5be17e94dc652c67826ab749c6e5948a78112/orjson-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c009e7a2ca9ad0ed1376ce20dd692146a5d9fe4310848904b6b4fee5c5c137", size = 132847, upload-time = "2026-03-31T16:15:46.368Z" }, - { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, - { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, - { url = "https://files.pythonhosted.org/packages/02/5e/c551387ddf2d7106d9039369862245c85738b828844d13b99ccb8d61fd06/orjson-3.11.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:55120759e61309af7fcf9e961c6f6af3dde5921cdb3ee863ef63fd9db126cae6", size = 423722, upload-time = "2026-03-31T16:15:51.176Z" }, - { url = "https://files.pythonhosted.org/packages/00/a3/ecfe62434096f8a794d4976728cb59bcfc4a643977f21c2040545d37eb4c/orjson-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:98bdc6cb889d19bed01de46e67574a2eab61f5cc6b768ed50e8ac68e9d6ffab6", size = 147801, upload-time = "2026-03-31T16:15:52.939Z" }, - { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, - { url = "https://files.pythonhosted.org/packages/01/d6/6dde4f31842d87099238f1f07b459d24edc1a774d20687187443ab044191/orjson-3.11.8-cp313-cp313-win32.whl", hash = "sha256:01c4e5a6695dc09098f2e6468a251bc4671c50922d4d745aff1a0a33a0cf5b8d", size = 131956, upload-time = "2026-03-31T16:15:56.081Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f9/4e494a56e013db957fb77186b818b916d4695b8fa2aa612364974160e91b/orjson-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:c154a35dd1330707450bb4d4e7dd1f17fa6f42267a40c1e8a1daa5e13719b4b8", size = 127410, upload-time = "2026-03-31T16:15:57.54Z" }, - { url = "https://files.pythonhosted.org/packages/57/7f/803203d00d6edb6e9e7eef421d4e1adbb5ea973e40b3533f3cfd9aeb374e/orjson-3.11.8-cp313-cp313-win_arm64.whl", hash = "sha256:4861bde57f4d253ab041e374f44023460e60e71efaa121f3c5f0ed457c3a701e", size = 127338, upload-time = "2026-03-31T16:15:59.106Z" }, - { url = "https://files.pythonhosted.org/packages/6d/35/b01910c3d6b85dc882442afe5060cbf719c7d1fc85749294beda23d17873/orjson-3.11.8-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ec795530a73c269a55130498842aaa762e4a939f6ce481a7e986eeaa790e9da4", size = 229171, upload-time = "2026-03-31T16:16:00.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/56/c9ec97bd11240abef39b9e5d99a15462809c45f677420fd148a6c5e6295e/orjson-3.11.8-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c492a0e011c0f9066e9ceaa896fbc5b068c54d365fea5f3444b697ee01bc8625", size = 128746, upload-time = "2026-03-31T16:16:02.673Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e4/66d4f30a90de45e2f0cbd9623588e8ae71eef7679dbe2ae954ed6d66a41f/orjson-3.11.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:883206d55b1bd5f5679ad5e6ddd3d1a5e3cac5190482927fdb8c78fb699193b5", size = 131867, upload-time = "2026-03-31T16:16:04.342Z" }, - { url = "https://files.pythonhosted.org/packages/19/30/2a645fc9286b928675e43fa2a3a16fb7b6764aa78cc719dc82141e00f30b/orjson-3.11.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5774c1fdcc98b2259800b683b19599c133baeb11d60033e2095fd9d4667b82db", size = 124664, upload-time = "2026-03-31T16:16:05.837Z" }, - { url = "https://files.pythonhosted.org/packages/db/44/77b9a86d84a28d52ba3316d77737f6514e17118119ade3f91b639e859029/orjson-3.11.8-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7381c83dd3d4a6347e6635950aa448f54e7b8406a27c7ecb4a37e9f1ae08b", size = 129701, upload-time = "2026-03-31T16:16:07.407Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ea/eff3d9bfe47e9bc6969c9181c58d9f71237f923f9c86a2d2f490cd898c82/orjson-3.11.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14439063aebcb92401c11afc68ee4e407258d2752e62d748b6942dad20d2a70d", size = 141202, upload-time = "2026-03-31T16:16:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/90d4b4c60c84d62068d0cf9e4d8f0a4e05e76971d133ac0c60d818d4db20/orjson-3.11.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa72e71977bff96567b0f500fc5bfd2fdf915f34052c782a4c6ebbdaa97aa858", size = 127194, upload-time = "2026-03-31T16:16:11.02Z" }, - { url = "https://files.pythonhosted.org/packages/8d/c7/ea9e08d1f0ba981adffb629811148b44774d935171e7b3d780ae43c4c254/orjson-3.11.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7679bc2f01bb0d219758f1a5f87bb7c8a81c0a186824a393b366876b4948e14f", size = 133639, upload-time = "2026-03-31T16:16:13.434Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8c/ddbbfd6ba59453c8fc7fe1d0e5983895864e264c37481b2a791db635f046/orjson-3.11.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:14f7b8fcb35ef403b42fa5ecfa4ed032332a91f3dc7368fbce4184d59e1eae0d", size = 141914, upload-time = "2026-03-31T16:16:14.955Z" }, - { url = "https://files.pythonhosted.org/packages/4e/31/dbfbefec9df060d34ef4962cd0afcb6fa7a9ec65884cb78f04a7859526c3/orjson-3.11.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c2bdf7b2facc80b5e34f48a2d557727d5c5c57a8a450de122ae81fa26a81c1bc", size = 423800, upload-time = "2026-03-31T16:16:16.594Z" }, - { url = "https://files.pythonhosted.org/packages/87/cf/f74e9ae9803d4ab46b163494adba636c6d7ea955af5cc23b8aaa94cfd528/orjson-3.11.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ccd7ba1b0605813a0715171d39ec4c314cb97a9c85893c2c5c0c3a3729df38bf", size = 147837, upload-time = "2026-03-31T16:16:18.585Z" }, - { url = "https://files.pythonhosted.org/packages/64/e6/9214f017b5db85e84e68602792f742e5dc5249e963503d1b356bee611e01/orjson-3.11.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbc8c9c02463fef4d3c53a9ba3336d05496ec8e1f1c53326a1e4acc11f5c600", size = 136441, upload-time = "2026-03-31T16:16:20.151Z" }, - { url = "https://files.pythonhosted.org/packages/24/dd/3590348818f58f837a75fb969b04cdf187ae197e14d60b5e5a794a38b79d/orjson-3.11.8-cp314-cp314-win32.whl", hash = "sha256:0b57f67710a8cd459e4e54eb96d5f77f3624eba0c661ba19a525807e42eccade", size = 131983, upload-time = "2026-03-31T16:16:21.823Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0f/b6cb692116e05d058f31ceee819c70f097fa9167c82f67fabe7516289abc/orjson-3.11.8-cp314-cp314-win_amd64.whl", hash = "sha256:735e2262363dcbe05c35e3a8869898022af78f89dde9e256924dc02e99fe69ca", size = 127396, upload-time = "2026-03-31T16:16:23.685Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d1/facb5b5051fabb0ef9d26c6544d87ef19a939a9a001198655d0d891062dd/orjson-3.11.8-cp314-cp314-win_arm64.whl", hash = "sha256:6ccdea2c213cf9f3d9490cbd5d427693c870753df41e6cb375bd79bcbafc8817", size = 127330, upload-time = "2026-03-31T16:16:25.496Z" }, +version = "3.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5d/b95ca542a001135cc250a49370f282f578c8f4e46cc8617d73775297eea8/orjson-3.11.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:135869ef917b8704ea0a94e01620e0c05021c15c52036e4663baffe75e72f8ce", size = 228986, upload-time = "2026-05-06T15:09:14.765Z" }, + { url = "https://files.pythonhosted.org/packages/80/01/be33fbff646e22f93398429ea645f20d2097aea1a6cdc1e6628e70125f83/orjson-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115ab5f5f4a0f203cc2a5f0fb09aee503a3f771aa08392949ab5ca230c4fbdbd", size = 132558, upload-time = "2026-05-06T15:09:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/4e/61/73d49333bba660a075daccca10970dc6409ce1cf42ae4046646a19468aad/orjson-3.11.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4da3c38a2083ca4aaf9c2a36776cce3e9328e6647b10d118948f3cfb4913ffe4", size = 128213, upload-time = "2026-05-06T15:09:18.719Z" }, + { url = "https://files.pythonhosted.org/packages/1f/7d/30e844b3dac3f74aed66b1f984daf9db3c98c0328c03d965a9e8dc06449e/orjson-3.11.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53b50b0e14084b8f7e29c5ce84c5af0f1160169b30d8a6914231d97d2fe297d4", size = 135430, upload-time = "2026-05-06T15:09:20.257Z" }, + { url = "https://files.pythonhosted.org/packages/16/64/bd815f5c610b3facc204f26ba94e87a9eb49b0d83de3d5fc1eee2402d91b/orjson-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:231742b4a11dad8d5380a435962c57e91b7c37b79be858f4ef1c0df1a259897e", size = 146178, upload-time = "2026-05-06T15:09:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/c7/35/e744fd36c79b339d27beb06068b5a08a8882ef5418804d0ce545a31f718d/orjson-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34fd2317602587321faab75ab76c623a0117e80841a6413654f04e47f339a8fb", size = 133068, upload-time = "2026-05-06T15:09:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/d54152b67b63a0b3e556cfc549d6ce84f74d7f425ddeadc6c8a74d913da7/orjson-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f3db16e69b667b132e0f305a833d5497da302d801508cbb051ed9a9819da47", size = 134217, upload-time = "2026-05-06T15:09:24.847Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ee/66154baf69f71c7164a268a5e888908aec5a0819d13c81d5e2755a257758/orjson-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0b34789fa0da61cf7bef0546b09c738fb195331e017e477096d129e9105ab03d", size = 141917, upload-time = "2026-05-06T15:09:26.647Z" }, + { url = "https://files.pythonhosted.org/packages/09/d3/c5824260ca8b9d7ba82648d042a3f8f4815d18c15bb98a1f30edd1bb2d83/orjson-3.11.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:87e4d4ab280b0c87424d47695bec2182caf8cfc17879ea78dab76680194abc13", size = 415356, upload-time = "2026-05-06T15:09:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/64/cb/509c2e816fe4df641d93dc92f6a89adc8df3ada8ebdee2bd44aba3264c3c/orjson-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ace6c58523302d3b97b6ac5c38a5298a54b473762b6be82726b4265c41029f92", size = 148112, upload-time = "2026-05-06T15:09:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/db/b5/3ceae56d2e4962979eedb023ba6a46a4bb65f333960379be0ca470686220/orjson-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:97d0d932803c1b164fde11cb542a9efcb1e0f63b184537cca65887147906ff48", size = 137112, upload-time = "2026-05-06T15:09:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7a/81fa3f2c7bef79b04cf2ab7838e5ac74b1f12511ceab979759b0275d6bb4/orjson-3.11.9-cp310-cp310-win32.whl", hash = "sha256:b3afcf569c15577a9fe64627292daa3e6b3a70f4fb77a5df246a87ec21681b94", size = 131706, upload-time = "2026-05-06T15:09:32.707Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d8/b64600f9083c7f151ad39717a5877fccbeb0ef6d7efcb55f971ce00b6bee/orjson-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:8697ab6a080a5c46edaad50e2bc5bd8c7ca5c66442d24104fa44ec74910a8244", size = 127282, upload-time = "2026-05-06T15:09:33.955Z" }, + { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" }, + { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/9e/85/0ef63bcf1337f44031ce9b91b1919563f62a37527b3ea4368bb15a22e5d7/orjson-3.11.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:277fefe9d76ee17eb14debf399e3533d4d63b5f677a4d3719eb763536af1f4bd", size = 135188, upload-time = "2026-05-06T15:09:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" }, + { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" }, + { url = "https://files.pythonhosted.org/packages/9b/61/863bddf0da6e9e586765414debd54b4e58db05f560902b6d00658cb88636/orjson-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:16969c9d369c98eb084889c6e4d2d39b77c7eb38ceccf8da2a9fff62ae908980", size = 147913, upload-time = "2026-05-06T15:09:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bd/70b6ab193594d7abb875320c0a7c8335e846f28968c432c31042409c3c8d/orjson-3.11.9-cp311-cp311-win32.whl", hash = "sha256:14ed654580c1ed2bc217352ec82f91b047aef82951aa71c7f64e0dcb03c0e180", size = 131533, upload-time = "2026-05-06T15:09:52.637Z" }, + { url = "https://files.pythonhosted.org/packages/3f/17/1a1a228183d62d1b77e2c30d210f47dd4768b310ebe1607c63e3c0e3a71e/orjson-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:57ea77fb70a448ce87d18fca050193202a3da5e54598f6501ca5476fb66cfe02", size = 127106, upload-time = "2026-05-06T15:09:54.204Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/285de5fa296d09681ee9c546cd4a8aeb773b701cf343dc125994f4d52953/orjson-3.11.9-cp311-cp311-win_arm64.whl", hash = "sha256:19b72ed11572a2ee51a67a903afbe5af504f84ed6f529c0fe44b0ab3fb5cc697", size = 126848, upload-time = "2026-05-06T15:09:55.551Z" }, + { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/31/6a/6cf69385a58208024fcb8c014e2141b8ce838aba6492b589f8acfff97fab/orjson-3.11.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2d3dc759490128c5c1711a53eeaa8ee1d437fd0038ffd2b6008abf46db3f882", size = 135213, upload-time = "2026-05-06T15:10:03.515Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" }, + { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" }, + { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" }, + { url = "https://files.pythonhosted.org/packages/3a/dc/7446c538590d55f455647e5f3c61fc33f7108714e7afcffa6a2a033f8350/orjson-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cde1a448023ba7d5bb4c01c5afb48894380b5e4956e0627266526587ef4e535f", size = 148025, upload-time = "2026-05-06T15:10:12.842Z" }, + { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" }, + { url = "https://files.pythonhosted.org/packages/06/69/850264ccf6d80f6b174620d30a87f65c9b1490aba33fe6b62798e618cad3/orjson-3.11.9-cp312-cp312-win32.whl", hash = "sha256:2d057a602cdd19a0ad680417527c45b6961a095081c0f46fe0e03e304aac6470", size = 131606, upload-time = "2026-05-06T15:10:15.791Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/973a43fc9c55e20f2051e9830997649f669be0cb3ca52192087c0143f118/orjson-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:59e403b1cc5a676da8eaf31f6254801b7341b3e29efa85f92b48d272637e77be", size = 127101, upload-time = "2026-05-06T15:10:17.129Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ae/495470f0e4a18f73fa10b7f6b84b464ec4cc5291c4e0c7c2a6c400bef006/orjson-3.11.9-cp312-cp312-win_arm64.whl", hash = "sha256:9af678d6488357948f1f84c6cd1c1d397c014e1ae2f98ae082a44eb48f602624", size = 126736, upload-time = "2026-05-06T15:10:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, + { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, + { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, + { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, + { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, + { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, + { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, + { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, + { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, + { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, + { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, + { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, + { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" }, + { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" }, + { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" }, ] [[package]] name = "packaging" -version = "26.1" +version = "26.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] [[package]] name = "parso" -version = "0.8.6" +version = "0.8.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, ] [[package]] name = "pathspec" -version = "1.0.4" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] @@ -1473,7 +1447,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.5.1" +version = "4.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1482,9 +1456,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", hash = "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", size = 198525, upload-time = "2026-04-21T20:31:41.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, + { url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", hash = "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b", size = 226472, upload-time = "2026-04-21T20:31:40.092Z" }, ] [[package]] @@ -1565,7 +1539,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.0" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1573,139 +1547,139 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/6b/69fd5c7194b21ebde0f8637e2a4ddc766ada29d472bfa6a5ca533d79549a/pydantic-2.13.0.tar.gz", hash = "sha256:b89b575b6e670ebf6e7448c01b41b244f471edd276cd0b6fe02e7e7aca320070", size = 843468, upload-time = "2026-04-13T10:51:35.571Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/d7/c3a52c61f5b7be648e919005820fbac33028c6149994cd64453f49951c17/pydantic-2.13.0-py3-none-any.whl", hash = "sha256:ab0078b90da5f3e2fd2e71e3d9b457ddcb35d0350854fbda93b451e28d56baaf", size = 471872, upload-time = "2026-04-13T10:51:33.343Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.0" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/0a/9414cddf82eda3976b14048cc0fa8f5b5d1aecb0b22e1dcd2dbfe0e139b1/pydantic_core-2.46.0.tar.gz", hash = "sha256:82d2498c96be47b47e903e1378d1d0f770097ec56ea953322f39936a7cf34977", size = 471441, upload-time = "2026-04-13T09:06:33.813Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/17/fd3ba2f035ac7b3a1ae0c55e5c0f6eb5275e87ad80a9b277cb2e70317e2c/pydantic_core-2.46.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d449eae37d6b066d8a8be0e3a7d7041712d6e9152869e7d03c203795aae44ed", size = 2122942, upload-time = "2026-04-13T09:04:32.413Z" }, - { url = "https://files.pythonhosted.org/packages/01/b5/214cb10e4050f430f383a21496087c1e51d583eec3c884b0e5f55c34eb69/pydantic_core-2.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4f7bfc1ffee4ddc03c2db472c7607a238dbbf76f7f64104fc6a623d47fb8e310", size = 1949068, upload-time = "2026-04-13T09:05:28.803Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ab/8ab4ec2a879eead4bb51c3e9af65583e16cc504867e808909cd4f991a5ae/pydantic_core-2.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a30f5d1d4e1c958b44b5c777a0d1adcd930429f35101e4780281ffbe11103925", size = 1974362, upload-time = "2026-04-13T09:05:26.894Z" }, - { url = "https://files.pythonhosted.org/packages/8f/dd/dc8ef47e18ddcab169af68b3c11648e1ef85c56aa18e2f96312cc5442404/pydantic_core-2.46.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f68e12d2de32ac6313a7d3854f346d71731288184fbbfc9004e368714244d2cd", size = 2043754, upload-time = "2026-04-13T09:04:54.637Z" }, - { url = "https://files.pythonhosted.org/packages/7f/52/69195c8f6549d2b1b9ce0efbb9bf169b47dcb9a60f81ff53a67cb22d8fc7/pydantic_core-2.46.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d1a058fb5aff8a1a221e7d8a0cf5b0133d069b2f293cb05f174c61bc7cdac34", size = 2230099, upload-time = "2026-04-13T09:04:44.37Z" }, - { url = "https://files.pythonhosted.org/packages/2a/41/48c8e7709604a4230f86f77bc17e1eb575e0894831f2c3beaecb3e8f7583/pydantic_core-2.46.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd01128431f355e309267283e37e23704f24558e9059d930e213a377b1be919", size = 2293730, upload-time = "2026-04-13T09:04:27.583Z" }, - { url = "https://files.pythonhosted.org/packages/08/ab/f3bc576d37eb3036f7b1b2721ab0f89e4684fab48e1de1d0eca0dfef7469/pydantic_core-2.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7747a50d9f75fe264b9e2091a2f462a7dd400add8723a87a75240106b6f4d949", size = 2095380, upload-time = "2026-04-13T09:04:45.929Z" }, - { url = "https://files.pythonhosted.org/packages/fe/69/0f6e5bd9c5594b41deb91029ad0b16ffe5a270dd412033dd1135a40bbfa3/pydantic_core-2.46.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:1d9b841e9c82a9cdf397a720bb8a4f2d6da6780204e1eb07c2d90c4b5b791b0d", size = 2140115, upload-time = "2026-04-13T09:07:00.944Z" }, - { url = "https://files.pythonhosted.org/packages/28/7c/79cfc18d352797b84a7c5b27171d6557121843729bc637a90550d08370fd/pydantic_core-2.46.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61d0f5951b7b86ec24e24fe0c5a2cce7c360830026dfbe004954e8fac9918b95", size = 2183044, upload-time = "2026-04-13T09:03:58.106Z" }, - { url = "https://files.pythonhosted.org/packages/59/bc/701b17bf7fd375e59e03838cffe8f6893498503b7d412d577ffd92dab56c/pydantic_core-2.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aec0be48d2555ceac04905ffb8f2bb7e55a56644858891196191827b6fc656b7", size = 2185277, upload-time = "2026-04-13T09:05:52.482Z" }, - { url = "https://files.pythonhosted.org/packages/c3/43/ad927b8861ab787b4189ddb2dd70ebcdc20c5a4baf52df94934d6f87d730/pydantic_core-2.46.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:2c1ec2ced44a8a479d71a14f5be35461360acd388987873a8e0a02f7f81c8ec2", size = 2329998, upload-time = "2026-04-13T09:05:54.803Z" }, - { url = "https://files.pythonhosted.org/packages/47/33/ad11d56b97ea986f991da998d551a7513d19c06ed05a529e86520430e10e/pydantic_core-2.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5e157a25eed281f5e40119078e3dbf698c28b3d88ff0176eea3dd37191447b8d", size = 2369004, upload-time = "2026-04-13T09:05:14.052Z" }, - { url = "https://files.pythonhosted.org/packages/16/d1/a9a28a122f1227dc13fdd361d77a3f2df4aee64e4ac5693d7ce74a8ecfa4/pydantic_core-2.46.0-cp310-cp310-win32.whl", hash = "sha256:311929d9bfdb9fdbaf28beb39d88a1e36ca6dc5424ceca6d3bf81c9e1da2313c", size = 1982879, upload-time = "2026-04-13T09:05:19.277Z" }, - { url = "https://files.pythonhosted.org/packages/94/9a/52988a743cf7a9d84861e380c6a5496589aebbc3592d9ecdecb13c6bd0a2/pydantic_core-2.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:60edfb53b13fbe7be9bb51447016b7bcd8772beb8ca216873be33e9d11b2c8e8", size = 2068907, upload-time = "2026-04-13T09:03:59.541Z" }, - { url = "https://files.pythonhosted.org/packages/ce/43/9bc38d43a6a48794209e4eb6d61e9c68395f69b7949f66842854b0cd1344/pydantic_core-2.46.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0027da787ae711f7fbd5a76cb0bb8df526acba6c10c1e44581de1b838db10b7b", size = 2121004, upload-time = "2026-04-13T09:05:17.531Z" }, - { url = "https://files.pythonhosted.org/packages/8c/1d/f43342b7107939b305b5e4efeef7d54e267a5ef51515570a5c1d77726efb/pydantic_core-2.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:63e288fc18d7eaeef5f16c73e65c4fd0ad95b25e7e21d8a5da144977b35eb997", size = 1947505, upload-time = "2026-04-13T09:04:48.975Z" }, - { url = "https://files.pythonhosted.org/packages/4a/cd/ccf48cbbcaf0d99ba65969459ebfbf7037600b2cfdcca3062084dd83a008/pydantic_core-2.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:080a3bdc6807089a1fe1fbc076519cea287f1a964725731d80b49d8ecffaa217", size = 1973301, upload-time = "2026-04-13T09:05:42.149Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ff/a7bb1e7a762fb1f40ad5ef4e6a92c012864a017b7b1fdfb71cf91faa8b73/pydantic_core-2.46.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c065f1c3e54c3e79d909927a8cb48ccbc17b68733552161eba3e0628c38e5d19", size = 2042208, upload-time = "2026-04-13T09:05:32.591Z" }, - { url = "https://files.pythonhosted.org/packages/ea/64/d3f11c6f6ace71526f3b03646df95eaab3f21edd13e00daae3f20f4e5a09/pydantic_core-2.46.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2db58ab46cfe602d4255381cce515585998c3b6699d5b1f909f519bc44a5aa", size = 2229046, upload-time = "2026-04-13T09:04:18.59Z" }, - { url = "https://files.pythonhosted.org/packages/d0/64/93db9a63cce71630c58b376d63de498aa93cb341c72cd5f189b5c08f5c28/pydantic_core-2.46.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c660974890ec1e4c65cff93f5670a5f451039f65463e9f9c03ad49746b49fc78", size = 2292138, upload-time = "2026-04-13T09:04:13.816Z" }, - { url = "https://files.pythonhosted.org/packages/e9/96/936fccce22f1f2ae8b2b694de651c2c929847be5f701c927a0bb3b1eb679/pydantic_core-2.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3be91482a8db77377c902cca87697388a4fb68addeb3e943ac74f425201a099", size = 2093333, upload-time = "2026-04-13T09:05:15.729Z" }, - { url = "https://files.pythonhosted.org/packages/75/76/c325e7fda69d589e26e772272044fe704c7e525c47d0d32a74f8345ac657/pydantic_core-2.46.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:1c72de82115233112d70d07f26a48cf6996eb86f7e143423ec1a182148455a9d", size = 2138802, upload-time = "2026-04-13T09:03:51.142Z" }, - { url = "https://files.pythonhosted.org/packages/c0/6f/ccaa2ff7d53a017b66841e2d38edd1f38d19ae1a2d0c5efee17f2d432229/pydantic_core-2.46.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7904e58768cd79304b992868d7710bfc85dc6c7ed6163f0f68dbc1dcd72dc231", size = 2181358, upload-time = "2026-04-13T09:04:30.737Z" }, - { url = "https://files.pythonhosted.org/packages/6c/71/0c4b6303e92d63edcb81f5301695cdf70bb351775b4733eea65acdac8384/pydantic_core-2.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1af8d88718005f57bb4768f92f4ff16bf31a747d39dfc919b22211b84e72c053", size = 2183985, upload-time = "2026-04-13T09:04:06.792Z" }, - { url = "https://files.pythonhosted.org/packages/71/eb/f6bf255de38a4393aaa10bff224e882b630576bc26ebfb401e42bb965092/pydantic_core-2.46.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:a5b891301b02770a5852253f4b97f8bd192e5710067bc129e20d43db5403ede2", size = 2328559, upload-time = "2026-04-13T09:06:14.143Z" }, - { url = "https://files.pythonhosted.org/packages/f2/71/93895a1545f50823a24b21d7761c2bd1b1afea7a6ddc019787caec237361/pydantic_core-2.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:48b671fe59031fd9754c7384ac05b3ed47a0cccb7d4db0ec56121f0e6a541b90", size = 2367466, upload-time = "2026-04-13T09:05:59.613Z" }, - { url = "https://files.pythonhosted.org/packages/78/39/62331b3e71f41fb13d486621e2aec49900ba56567fb3a0ae5999fded0005/pydantic_core-2.46.0-cp311-cp311-win32.whl", hash = "sha256:0a52b7262b6cc67033823e9549a41bb77580ac299dc964baae4e9c182b2e335c", size = 1981367, upload-time = "2026-04-13T09:07:37.563Z" }, - { url = "https://files.pythonhosted.org/packages/9f/51/caac70958420e2d6115962f550676df59647c11f96a44c2fcb61662fcd16/pydantic_core-2.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:4103fea1beeef6b3a9fed8515f27d4fa30c929a1973655adf8f454dc49ee0662", size = 2065942, upload-time = "2026-04-13T09:06:37.873Z" }, - { url = "https://files.pythonhosted.org/packages/b2/cf/576b2a4eb5500a1a5da485613b1ea8bc0d7279b27e0426801574b284ae65/pydantic_core-2.46.0-cp311-cp311-win_arm64.whl", hash = "sha256:3137cd88938adb8e567c5e938e486adc7e518ffc96b4ae1ec268e6a4275704d7", size = 2052532, upload-time = "2026-04-13T09:06:03.697Z" }, - { url = "https://files.pythonhosted.org/packages/a7/d2/206c72ad47071559142a35f71efc29eb16448a4a5ae9487230ab8e4e292b/pydantic_core-2.46.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:66ccedb02c934622612448489824955838a221b3a35875458970521ef17b2f9c", size = 2117060, upload-time = "2026-04-13T09:04:47.443Z" }, - { url = "https://files.pythonhosted.org/packages/17/2c/7a53b33f91c8b77e696b1a6aa3bed609bf9374bdc0f8dcda681bc7d922b8/pydantic_core-2.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a44f27f4d2788ef9876ec47a43739b118c5904d74f418f53398f6ced3bbcacf2", size = 1951802, upload-time = "2026-04-13T09:05:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/fc/20/90e548c1f6d38800ef11c915881525770ce270d8e5e887563ff046a08674/pydantic_core-2.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26a1032bcce6ca4b4670eb3f7d8195bd0a8b8f255f1307823e217ca3cfa7c27", size = 1976621, upload-time = "2026-04-13T09:04:03.909Z" }, - { url = "https://files.pythonhosted.org/packages/20/3c/9c5810ca70b60c623488cdd80f7e9ee1a0812df81e97098b64788719860f/pydantic_core-2.46.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b8d1412f725060527e56675904b17a2d421dddcf861eecf7c75b9dda47921a4", size = 2056721, upload-time = "2026-04-13T09:04:40.992Z" }, - { url = "https://files.pythonhosted.org/packages/1a/a3/d6e5f4cdec84278431c75540f90838c9d0a4dfe9402a8f3902073660ff28/pydantic_core-2.46.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc3d1569edd859cabaa476cabce9eecd05049a7966af7b4a33b541bfd4ca1104", size = 2239634, upload-time = "2026-04-13T09:03:52.478Z" }, - { url = "https://files.pythonhosted.org/packages/46/42/ef58aacf330d8de6e309d62469aa1f80e945eaf665929b4037ac1bfcebc1/pydantic_core-2.46.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:38108976f2d8afaa8f5067fd1390a8c9f5cc580175407cda636e76bc76e88054", size = 2315739, upload-time = "2026-04-13T09:05:04.971Z" }, - { url = "https://files.pythonhosted.org/packages/8b/86/c63b12fafa2d86a515bfd1840b39c23a49302f02b653161bf9c3a0566c50/pydantic_core-2.46.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5a06d8ed01dad5575056b5187e5959b336793c6047920a3441ee5b03533836", size = 2098169, upload-time = "2026-04-13T09:07:27.151Z" }, - { url = "https://files.pythonhosted.org/packages/76/19/b5b33a2f6be4755b21a20434293c4364be255f4c1a108f125d101d4cc4ee/pydantic_core-2.46.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:04017ace142da9ce27cafd423a480872571b5c7e80382aec22f7d715ca8eb870", size = 2170830, upload-time = "2026-04-13T09:04:39.448Z" }, - { url = "https://files.pythonhosted.org/packages/99/ae/7559f99a29b7d440012ddb4da897359304988a881efaca912fd2f655652e/pydantic_core-2.46.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2629ad992ed1b1c012e6067f5ffafd3336fcb9b54569449fabb85621f1444ed3", size = 2203901, upload-time = "2026-04-13T09:04:01.048Z" }, - { url = "https://files.pythonhosted.org/packages/dd/0e/b0ef945a39aeb4ac58da316813e1106b7fbdfbf20ac141c1c27904355ac5/pydantic_core-2.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3068b1e7bd986aebc88f6859f8353e72072538dcf92a7fb9cf511a0f61c5e729", size = 2191789, upload-time = "2026-04-13T09:06:39.915Z" }, - { url = "https://files.pythonhosted.org/packages/90/f4/830484e07188c1236b013995818888ab93bab8fd88aa9689b1d8fd22220d/pydantic_core-2.46.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:1e366916ff69ff700aa9326601634e688581bc24c5b6b4f8738d809ec7d72611", size = 2344423, upload-time = "2026-04-13T09:05:12.252Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ba/e455c18cbdc333177af754e740be4fe9d1de173d65bbe534daf88da02ac0/pydantic_core-2.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:485a23e8f4618a1b8e23ac744180acde283fffe617f96923d25507d5cade62ec", size = 2384037, upload-time = "2026-04-13T09:06:24.503Z" }, - { url = "https://files.pythonhosted.org/packages/78/1f/b35d20d73144a41e78de0ae398e60fdd8bed91667daa1a5a92ab958551ba/pydantic_core-2.46.0-cp312-cp312-win32.whl", hash = "sha256:520940e1b702fe3b33525d0351777f25e9924f1818ca7956447dabacf2d339fd", size = 1967068, upload-time = "2026-04-13T09:05:23.374Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/4b6252e9606e8295647b848233cc4137ee0a04ebba8f0f9fb2977655b38c/pydantic_core-2.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:90d2048e0339fa365e5a66aefe760ddd3b3d0a45501e088bc5bc7f4ed9ff9571", size = 2071008, upload-time = "2026-04-13T09:05:21.392Z" }, - { url = "https://files.pythonhosted.org/packages/39/95/d08eb508d4d5560ccbd226ee5971e5ef9b749aba9b413c0c4ed6e406d4f6/pydantic_core-2.46.0-cp312-cp312-win_arm64.whl", hash = "sha256:a70247649b7dffe36648e8f34be5ce8c5fa0a27ff07b071ea780c20a738c05ce", size = 2036634, upload-time = "2026-04-13T09:05:48.299Z" }, - { url = "https://files.pythonhosted.org/packages/df/05/ab3b0742bad1d51822f1af0c4232208408902bdcfc47601f3b812e09e6c2/pydantic_core-2.46.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a05900c37264c070c683c650cbca8f83d7cbb549719e645fcd81a24592eac788", size = 2116814, upload-time = "2026-04-13T09:04:12.41Z" }, - { url = "https://files.pythonhosted.org/packages/98/08/30b43d9569d69094a0899a199711c43aa58fce6ce80f6a8f7693673eb995/pydantic_core-2.46.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de8e482fd4f1e3f36c50c6aac46d044462615d8f12cfafc6bebeaa0909eea22", size = 1951867, upload-time = "2026-04-13T09:04:02.364Z" }, - { url = "https://files.pythonhosted.org/packages/db/a0/bf9a1ba34537c2ed3872a48195291138fdec8fe26c4009776f00d63cf0c8/pydantic_core-2.46.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c525ecf8a4cdf198327b65030a7d081867ad8e60acb01a7214fff95cf9832d47", size = 1977040, upload-time = "2026-04-13T09:06:16.088Z" }, - { url = "https://files.pythonhosted.org/packages/71/70/0ba03c20e1e118219fc18c5417b008b7e880f0e3fb38560ec4465984d471/pydantic_core-2.46.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f14581aeb12e61542ce73b9bfef2bca5439d65d9ab3efe1a4d8e346b61838f9b", size = 2055284, upload-time = "2026-04-13T09:05:25.125Z" }, - { url = "https://files.pythonhosted.org/packages/58/cf/1e320acefbde7fb7158a9e5def55e0adf9a4634636098ce28dc6b978e0d3/pydantic_core-2.46.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c108067f2f7e190d0dbd81247d789ec41f9ea50ccd9265a3a46710796ac60530", size = 2238896, upload-time = "2026-04-13T09:05:01.345Z" }, - { url = "https://files.pythonhosted.org/packages/df/f5/ea8ba209756abe9eba891bb0ef3772b4c59a894eb9ad86cd5bd0dd4e3e52/pydantic_core-2.46.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ac10967e9a7bb1b96697374513f9a1a90a59e2fb41566b5e00ee45392beac59", size = 2314353, upload-time = "2026-04-13T09:06:07.942Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f8/5885350203b72e96438eee7f94de0d8f0442f4627237ca8ef75de34db1cd/pydantic_core-2.46.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7897078fe8a13b73623c0955dfb2b3d2c9acb7177aac25144758c9e5a5265aaa", size = 2098522, upload-time = "2026-04-13T09:04:23.239Z" }, - { url = "https://files.pythonhosted.org/packages/bf/88/5930b0e828e371db5a556dd3189565417ddc3d8316bb001058168aadcf5f/pydantic_core-2.46.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:e69ce405510a419a082a78faed65bb4249cfb51232293cc675645c12f7379bf7", size = 2168757, upload-time = "2026-04-13T09:07:12.46Z" }, - { url = "https://files.pythonhosted.org/packages/da/75/63d563d3035a0548e721c38b5b69fd5626fdd51da0f09ff4467503915b82/pydantic_core-2.46.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd28d13eea0d8cf351dc1fe274b5070cc8e1cca2644381dee5f99de629e77cf3", size = 2202518, upload-time = "2026-04-13T09:05:44.418Z" }, - { url = "https://files.pythonhosted.org/packages/a7/53/1958eacbfddc41aadf5ae86dd85041bf054b675f34a2fa76385935f96070/pydantic_core-2.46.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ee1547a6b8243e73dd10f585555e5a263395e55ce6dea618a078570a1e889aef", size = 2190148, upload-time = "2026-04-13T09:06:56.151Z" }, - { url = "https://files.pythonhosted.org/packages/c7/17/098cc6d3595e4623186f2bc6604a6195eb182e126702a90517236391e9ce/pydantic_core-2.46.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c3dc68dcf62db22a18ddfc3ad4960038f72b75908edc48ae014d7ac8b391d57a", size = 2342925, upload-time = "2026-04-13T09:04:17.286Z" }, - { url = "https://files.pythonhosted.org/packages/71/a7/abdb924620b1ac535c690b36ad5b8871f376104090f8842c08625cecf1d3/pydantic_core-2.46.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:004a2081c881abfcc6854a4623da6a09090a0d7c1398a6ae7133ca1256cee70b", size = 2383167, upload-time = "2026-04-13T09:04:52.643Z" }, - { url = "https://files.pythonhosted.org/packages/d7/c9/2ddd10f50e4b7350d2574629a0f53d8d4eb6573f9c19a6b43e6b1487a31d/pydantic_core-2.46.0-cp313-cp313-win32.whl", hash = "sha256:59d24ec8d5eaabad93097525a69d0f00f2667cb353eb6cda578b1cfff203ceef", size = 1965660, upload-time = "2026-04-13T09:06:05.877Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e7/1efc38ed6f2680c032bcefa0e3ebd496a8c77e92dfdb86b07d0f2fc632b1/pydantic_core-2.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:71186dad5ac325c64d68fe0e654e15fd79802e7cc42bc6f0ff822d5ad8b1ab25", size = 2069563, upload-time = "2026-04-13T09:07:14.738Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1e/a325b4989e742bf7e72ed35fa124bc611fd76539c9f8cd2a9a7854473533/pydantic_core-2.46.0-cp313-cp313-win_arm64.whl", hash = "sha256:8e4503f3213f723842c9a3b53955c88a9cfbd0b288cbd1c1ae933aebeec4a1b4", size = 2034966, upload-time = "2026-04-13T09:04:21.629Z" }, - { url = "https://files.pythonhosted.org/packages/36/3b/914891d384cdbf9a6f464eb13713baa22ea1e453d4da80fb7da522079370/pydantic_core-2.46.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:4fc801c290342350ffc82d77872054a934b2e24163727263362170c1db5416ca", size = 2113349, upload-time = "2026-04-13T09:04:59.407Z" }, - { url = "https://files.pythonhosted.org/packages/35/95/3a0c6f65e231709fb3463e32943c69d10285cb50203a2130a4732053a06d/pydantic_core-2.46.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0a36f2cc88170cc177930afcc633a8c15907ea68b59ac16bd180c2999d714940", size = 1949170, upload-time = "2026-04-13T09:06:09.935Z" }, - { url = "https://files.pythonhosted.org/packages/d1/63/d845c36a608469fe7bee226edeff0984c33dbfe7aecd755b0e7ab5a275c4/pydantic_core-2.46.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3912e0c568a1f99d4d6d3e41def40179d61424c0ca1c8c87c4877d7f6fd7fb", size = 1977914, upload-time = "2026-04-13T09:04:56.16Z" }, - { url = "https://files.pythonhosted.org/packages/08/6f/f2e7a7f85931fb31671f5378d1c7fc70606e4b36d59b1b48e1bd1ef5d916/pydantic_core-2.46.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3534c3415ed1a19ab23096b628916a827f7858ec8db49ad5d7d1e44dc13c0d7b", size = 2050538, upload-time = "2026-04-13T09:05:06.789Z" }, - { url = "https://files.pythonhosted.org/packages/8c/97/f4aa7181dd9a16dd9059a99fc48fdab0c2aab68307283a5c04cf56de68c4/pydantic_core-2.46.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21067396fc285609323a4db2f63a87570044abe0acddfcca8b135fc7948e3db7", size = 2236294, upload-time = "2026-04-13T09:07:03.2Z" }, - { url = "https://files.pythonhosted.org/packages/24/c1/6a5042fc32765c87101b500f394702890af04239c318b6002cfd627b710d/pydantic_core-2.46.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2afd85b7be186e2fe7cdbb09a3d964bcc2042f65bbcc64ad800b3c7915032655", size = 2312954, upload-time = "2026-04-13T09:06:11.919Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e4/566101a561492ce8454f0844ca29c3b675a6b3a7b3ff577db85ed05c8c50/pydantic_core-2.46.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67e2c2e171b78db8154da602de72ffdc473c6ee51de8a9d80c0f1cd4051abfc7", size = 2102533, upload-time = "2026-04-13T09:06:58.664Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ac/adc11ee1646a5c4dd9abb09a00e7909e6dc25beddc0b1310ca734bb9b48e/pydantic_core-2.46.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c16ae1f3170267b1a37e16dba5c297bdf60c8b5657b147909ca8774ce7366644", size = 2169447, upload-time = "2026-04-13T09:04:11.143Z" }, - { url = "https://files.pythonhosted.org/packages/26/73/408e686b45b82d28ac19e8229e07282254dbee6a5d24c5c7cf3cf3716613/pydantic_core-2.46.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:133b69e1c1ba34d3702eed73f19f7f966928f9aa16663b55c2ebce0893cca42e", size = 2200672, upload-time = "2026-04-13T09:03:54.056Z" }, - { url = "https://files.pythonhosted.org/packages/0a/3b/807d5b035ec891b57b9079ce881f48263936c37bd0d154a056e7fd152afb/pydantic_core-2.46.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:15ed8e5bde505133d96b41702f31f06829c46b05488211a5b1c7877e11de5eb5", size = 2188293, upload-time = "2026-04-13T09:07:07.614Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ed/719b307516285099d1196c52769fdbe676fd677da007b9c349ae70b7226d/pydantic_core-2.46.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:8cfc29a1c66a7f0fcb36262e92f353dd0b9c4061d558fceb022e698a801cb8ae", size = 2335023, upload-time = "2026-04-13T09:04:05.176Z" }, - { url = "https://files.pythonhosted.org/packages/8d/90/8718e4ae98c4e8a7325afdc079be82be1e131d7a47cb6c098844a9531ffe/pydantic_core-2.46.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e1155708540f13845bf68d5ac511a55c76cfe2e057ed12b4bf3adac1581fc5c2", size = 2377155, upload-time = "2026-04-13T09:06:18.081Z" }, - { url = "https://files.pythonhosted.org/packages/dd/dc/7172789283b963f81da2fc92b186e22de55687019079f71c4d570822502b/pydantic_core-2.46.0-cp314-cp314-win32.whl", hash = "sha256:de5635a48df6b2eef161d10ea1bc2626153197333662ba4cd700ee7ec1aba7f5", size = 1963078, upload-time = "2026-04-13T09:05:30.615Z" }, - { url = "https://files.pythonhosted.org/packages/e0/69/03a7ea4b6264def3a44eabf577528bcec2f49468c5698b2044dea54dc07e/pydantic_core-2.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:f07a5af60c5e7cf53dd1ff734228bd72d0dc9938e64a75b5bb308ca350d9681e", size = 2068439, upload-time = "2026-04-13T09:04:57.729Z" }, - { url = "https://files.pythonhosted.org/packages/f5/eb/1c3afcfdee2ab6634b802ab0a0f1966df4c8b630028ec56a1cb0a710dc58/pydantic_core-2.46.0-cp314-cp314-win_arm64.whl", hash = "sha256:e7a77eca3c7d5108ff509db20aae6f80d47c7ed7516d8b96c387aacc42f3ce0f", size = 2026470, upload-time = "2026-04-13T09:05:08.654Z" }, - { url = "https://files.pythonhosted.org/packages/5c/30/1177dde61b200785c4739665e3aa03a9d4b2c25d2d0408b07d585e633965/pydantic_core-2.46.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5e7cdd4398bee1aaeafe049ac366b0f887451d9ae418fd8785219c13fea2f928", size = 2107447, upload-time = "2026-04-13T09:05:46.314Z" }, - { url = "https://files.pythonhosted.org/packages/b1/60/4e0f61f99bdabbbc309d364a2791e1ba31e778a4935bc43391a7bdec0744/pydantic_core-2.46.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5c2c92d82808e27cef3f7ab3ed63d657d0c755e0dbe5b8a58342e37bdf09bd2e", size = 1926927, upload-time = "2026-04-13T09:06:20.371Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d0/67f89a8269152c1d6eaa81f04e75a507372ebd8ca7382855a065222caa80/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bab80af91cd7014b45d1089303b5f844a9d91d7da60eabf3d5f9694b32a6655", size = 1966613, upload-time = "2026-04-13T09:07:05.389Z" }, - { url = "https://files.pythonhosted.org/packages/cd/07/8dfdc3edc78f29a80fb31f366c50203ec904cff6a4c923599bf50ac0d0ff/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e49ffdb714bc990f00b39d1ad1d683033875b5af15582f60c1f34ad3eeccfaa", size = 2032902, upload-time = "2026-04-13T09:06:42.47Z" }, - { url = "https://files.pythonhosted.org/packages/b0/2a/111c5e8fe24f99c46bcad7d3a82a8f6dbc738066e2c72c04c71f827d8c78/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca877240e8dbdeef3a66f751dc41e5a74893767d510c22a22fc5c0199844f0ce", size = 2244456, upload-time = "2026-04-13T09:05:36.484Z" }, - { url = "https://files.pythonhosted.org/packages/6b/7c/cfc5d11c15a63ece26e148572c77cfbb2c7f08d315a7b63ef0fe0711d753/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87e6843f89ecd2f596d7294e33196c61343186255b9880c4f1b725fde8b0e20d", size = 2294535, upload-time = "2026-04-13T09:06:01.689Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2c/f0d744e3dab7bd026a3f4670a97a295157cff923a2666d30a15a70a7e3d0/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e20bc5add1dd9bc3b9a3600d40632e679376569098345500799a6ad7c5d46c72", size = 2104621, upload-time = "2026-04-13T09:04:34.388Z" }, - { url = "https://files.pythonhosted.org/packages/a7/64/e7cc4698dc024264d214b51d5a47a2404221b12060dd537d76f831b2120a/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:ee6ff79a5f0289d64a9d6696a3ce1f98f925b803dd538335a118231e26d6d827", size = 2130718, upload-time = "2026-04-13T09:04:26.23Z" }, - { url = "https://files.pythonhosted.org/packages/0b/a8/224e655fec21f7d4441438ad2ecaccb33b5a3876ce7bb2098c74a49efc14/pydantic_core-2.46.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52d35cfb58c26323101c7065508d7bb69bb56338cda9ea47a7b32be581af055d", size = 2180738, upload-time = "2026-04-13T09:05:50.253Z" }, - { url = "https://files.pythonhosted.org/packages/32/7b/b3025618ed4c4e4cbaa9882731c19625db6669896b621760ea95bc1125ef/pydantic_core-2.46.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d14cc5a6f260fa78e124061eebc5769af6534fc837e9a62a47f09a2c341fa4ea", size = 2171222, upload-time = "2026-04-13T09:07:29.929Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e3/68170aa1d891920af09c1f2f34df61dc5ff3a746400027155523e3400e89/pydantic_core-2.46.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:4f7ff859d663b6635f6307a10803d07f0d09487e16c3d36b1744af51dbf948b2", size = 2320040, upload-time = "2026-04-13T09:06:35.732Z" }, - { url = "https://files.pythonhosted.org/packages/67/1b/5e65807001b84972476300c1f49aea2b4971b7e9fffb5c2654877dadd274/pydantic_core-2.46.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:8ef749be6ed0d69dba31902aaa8255a9bb269ae50c93888c4df242d8bb7acd9e", size = 2377062, upload-time = "2026-04-13T09:07:39.945Z" }, - { url = "https://files.pythonhosted.org/packages/75/03/48caa9dd5f28f7662bd52bff454d9a451f6b7e5e4af95e289e5e170749c9/pydantic_core-2.46.0-cp314-cp314t-win32.whl", hash = "sha256:d93ca72870133f86360e4bb0c78cd4e6ba2a0f9f3738a6486909ffc031463b32", size = 1951028, upload-time = "2026-04-13T09:04:20.224Z" }, - { url = "https://files.pythonhosted.org/packages/87/ed/e97ff55fe28c0e6e3cba641d622b15e071370b70e5f07c496b07b65db7c9/pydantic_core-2.46.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6ebb2668afd657e2127cb40f2ceb627dd78e74e9dfde14d9bf6cdd532a29ff59", size = 2048519, upload-time = "2026-04-13T09:05:10.464Z" }, - { url = "https://files.pythonhosted.org/packages/b6/51/e0db8267a287994546925f252e329eeae4121b1e77e76353418da5a3adf0/pydantic_core-2.46.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4864f5bbb7993845baf9209bae1669a8a76769296a018cb569ebda9dcb4241f5", size = 2026791, upload-time = "2026-04-13T09:04:37.724Z" }, - { url = "https://files.pythonhosted.org/packages/2d/f1/6731c2d6caf03efe822101edb4783eb3f212f34b7b005a34f039f67e76e1/pydantic_core-2.46.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:ce2e38e27de73ff6a0312a9e3304c398577c418d90bbde97f0ba1ee3ab7ac39f", size = 2121259, upload-time = "2026-04-13T09:07:34.845Z" }, - { url = "https://files.pythonhosted.org/packages/72/fd/ac34d4c92e739e37a040be9e7ea84d116afec5f983a7db856c27135fba77/pydantic_core-2.46.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:f0d34ba062396de0be7421e6e69c9a6821bf6dc73a0ab9959a48a5a6a1e24754", size = 1945798, upload-time = "2026-04-13T09:04:24.729Z" }, - { url = "https://files.pythonhosted.org/packages/b6/a4/f413a522c4047c46b109be6805a3095d35e5a4882fd5b4fdc0909693dfc0/pydantic_core-2.46.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4c0a12147b4026dd68789fb9f22f1a8769e457f9562783c181880848bbd6412", size = 1986062, upload-time = "2026-04-13T09:05:57.177Z" }, - { url = "https://files.pythonhosted.org/packages/91/2e/9760025ea8b0f49903c0ceebdfc2d8ef839da872426f2b03cae9de036a7c/pydantic_core-2.46.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a99896d9db56df901ab4a63cd6a36348a569cff8e05f049db35f4016a817a3d9", size = 2145344, upload-time = "2026-04-13T09:03:56.924Z" }, - { url = "https://files.pythonhosted.org/packages/74/0c/106ed5cc50393d90523f09adcc50d05e42e748eb107dc06aea971137f02d/pydantic_core-2.46.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:bc0e2fefe384152d7da85b5c2fe8ce2bf24752f68a58e3f3ea42e28a29dfdeb2", size = 2104968, upload-time = "2026-04-13T09:06:26.967Z" }, - { url = "https://files.pythonhosted.org/packages/f5/71/b494cef3165e3413ee9bbbb5a9eedc9af0ea7b88d8638beef6c2061b110e/pydantic_core-2.46.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:a2ab0e785548be1b4362a62c4004f9217598b7ee465f1f420fc2123e2a5b5b02", size = 1940442, upload-time = "2026-04-13T09:06:29.332Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3e/a4d578c8216c443e26a1124f8c1e07c0654264ce5651143d3883d85ff140/pydantic_core-2.46.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d45aecb18b8cba1c68eeb17c2bb2d38627ceed04c5b30b882fc9134e01f187", size = 1999672, upload-time = "2026-04-13T09:04:42.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c1/9114560468685525a21770138382fd0cb849aaf351ff2c7b97f760d121e0/pydantic_core-2.46.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5078f6c377b002428e984259ac327ef8902aacae6c14b7de740dd4869a491501", size = 2154533, upload-time = "2026-04-13T09:04:50.868Z" }, - { url = "https://files.pythonhosted.org/packages/09/ed/fbd8127e4a19c4fdbb2f4983cf72c7b3534086df640c813c5c0ec4218177/pydantic_core-2.46.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:be3e04979ba4d68183f247202c7f4f483f35df57690b3f875c06340a1579b47c", size = 2119951, upload-time = "2026-04-13T09:04:35.923Z" }, - { url = "https://files.pythonhosted.org/packages/ec/77/df8711ebb45910412f90d75198430fa1120f5618336b71fa00303601c5a4/pydantic_core-2.46.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b1eae8d7d9b8c2a90b34d3d9014804dca534f7f40180197062634499412ea14e", size = 1953812, upload-time = "2026-04-13T09:05:40.293Z" }, - { url = "https://files.pythonhosted.org/packages/12/fe/14b35df69112bd812d6818a395eeab22eeaa2befc6f85bc54ed648430186/pydantic_core-2.46.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a95a2773680dd4b6b999d4eccdd1b577fd71c31739fb4849f6ada47eabb9c56", size = 2139585, upload-time = "2026-04-13T09:06:46.94Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f0/4fea4c14ebbdeb87e5f6edd2620735fcbd384865f06707fe229c021ce041/pydantic_core-2.46.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25988c3159bb097e06abfdf7b21b1fcaf90f187c74ca6c7bb842c1f72ce74fa8", size = 2179154, upload-time = "2026-04-13T09:04:15.639Z" }, - { url = "https://files.pythonhosted.org/packages/5c/36/6329aa79ba32b73560e6e453164fb29702b115fd3b2b650e796e1dc27862/pydantic_core-2.46.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:747d89bd691854c719a3381ba46b6124ef916ae85364c79e11db9c84995d8d03", size = 2182917, upload-time = "2026-04-13T09:07:24.483Z" }, - { url = "https://files.pythonhosted.org/packages/92/61/edbf7aea71052d410347846a2ea43394f74651bf6822b8fad8703ca00575/pydantic_core-2.46.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:909a7327b83ca93b372f7d48df0ebc7a975a5191eb0b6e024f503f4902c24124", size = 2327716, upload-time = "2026-04-13T09:06:31.681Z" }, - { url = "https://files.pythonhosted.org/packages/a4/11/aa5089b941e85294b1d5d526840b18f0d4464f842d43d8999ce50ef881c1/pydantic_core-2.46.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2f7e6a3752378a69fadf3f5ee8bc5fa082f623703eec0f4e854b12c548322de0", size = 2365925, upload-time = "2026-04-13T09:05:38.338Z" }, - { url = "https://files.pythonhosted.org/packages/0c/75/e187b0ea247f71f2009d156df88b7d8449c52a38810c9a1bd55dd4871206/pydantic_core-2.46.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ef47ee0a3ac4c2bb25a083b3acafb171f65be4a0ac1e84edef79dd0016e25eaa", size = 2193856, upload-time = "2026-04-13T09:05:03.114Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] [[package]] name = "pydantic-settings" -version = "2.13.1" +version = "2.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, ] [[package]] @@ -1763,15 +1737,15 @@ wheels = [ [[package]] name = "python-discovery" -version = "1.2.2" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/ef/3bae0e537cfe91e8431efcba4434463d2c5a65f5a89edd47c6cf2f03c55f/python_discovery-1.2.2.tar.gz", hash = "sha256:876e9c57139eb757cb5878cbdd9ae5379e5d96266c99ef731119e04fffe533bb", size = 58872, upload-time = "2026-04-07T17:28:49.249Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/60/e88788207d81e46362cfbef0d4aaf4c0f49efc3c12d4c3fa3f542c34ebec/python_discovery-1.3.1.tar.gz", hash = "sha256:62f6db28064c9613e7ca76cb3f00c38c839a07c31c00dfe7ed0986493d2150a6", size = 68011, upload-time = "2026-05-12T20:53:36.336Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/db/795879cc3ddfe338599bddea6388cc5100b088db0a4caf6e6c1af1c27e04/python_discovery-1.2.2-py3-none-any.whl", hash = "sha256:e1ae95d9af875e78f15e19aed0c6137ab1bb49c200f21f5061786490c9585c7a", size = 31894, upload-time = "2026-04-07T17:28:48.09Z" }, + { url = "https://files.pythonhosted.org/packages/b7/6f/a05a317a66fee0aad270011461f1a63a453ed12471249f172f7d2e2bc7b4/python_discovery-1.3.1-py3-none-any.whl", hash = "sha256:ed188687ebb3b82c01a17cd5ac62fc94d9f6487a7f1a0f9dfe89753fec91039c", size = 33185, upload-time = "2026-05-12T20:53:34.969Z" }, ] [[package]] @@ -1957,7 +1931,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.1" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1965,9 +1939,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -2119,27 +2093,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/d9/aa3f7d59a10ef6b14fe3431706f854dbf03c5976be614a9796d36326810c/ruff-0.15.10.tar.gz", hash = "sha256:d1f86e67ebfdef88e00faefa1552b5e510e1d35f3be7d423dc7e84e63788c94e", size = 4631728, upload-time = "2026-04-09T14:06:09.884Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/00/a1c2fdc9939b2c03691edbda290afcd297f1f389196172826b03d6b6a595/ruff-0.15.10-py3-none-linux_armv6l.whl", hash = "sha256:0744e31482f8f7d0d10a11fcbf897af272fefdfcb10f5af907b18c2813ff4d5f", size = 10563362, upload-time = "2026-04-09T14:06:21.189Z" }, - { url = "https://files.pythonhosted.org/packages/5c/15/006990029aea0bebe9d33c73c3e28c80c391ebdba408d1b08496f00d422d/ruff-0.15.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b1e7c16ea0ff5a53b7c2df52d947e685973049be1cdfe2b59a9c43601897b22e", size = 10951122, upload-time = "2026-04-09T14:06:02.236Z" }, - { url = "https://files.pythonhosted.org/packages/f2/c0/4ac978fe874d0618c7da647862afe697b281c2806f13ce904ad652fa87e4/ruff-0.15.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:93cc06a19e5155b4441dd72808fdf84290d84ad8a39ca3b0f994363ade4cebb1", size = 10314005, upload-time = "2026-04-09T14:06:00.026Z" }, - { url = "https://files.pythonhosted.org/packages/da/73/c209138a5c98c0d321266372fc4e33ad43d506d7e5dd817dd89b60a8548f/ruff-0.15.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83e1dd04312997c99ea6965df66a14fb4f03ba978564574ffc68b0d61fd3989e", size = 10643450, upload-time = "2026-04-09T14:05:42.137Z" }, - { url = "https://files.pythonhosted.org/packages/ec/76/0deec355d8ec10709653635b1f90856735302cb8e149acfdf6f82a5feb70/ruff-0.15.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8154d43684e4333360fedd11aaa40b1b08a4e37d8ffa9d95fee6fa5b37b6fab1", size = 10379597, upload-time = "2026-04-09T14:05:49.984Z" }, - { url = "https://files.pythonhosted.org/packages/dc/be/86bba8fc8798c081e28a4b3bb6d143ccad3fd5f6f024f02002b8f08a9fa3/ruff-0.15.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ab88715f3a6deb6bde6c227f3a123410bec7b855c3ae331b4c006189e895cef", size = 11146645, upload-time = "2026-04-09T14:06:12.246Z" }, - { url = "https://files.pythonhosted.org/packages/a8/89/140025e65911b281c57be1d385ba1d932c2366ca88ae6663685aed8d4881/ruff-0.15.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a768ff5969b4f44c349d48edf4ab4f91eddb27fd9d77799598e130fb628aa158", size = 12030289, upload-time = "2026-04-09T14:06:04.776Z" }, - { url = "https://files.pythonhosted.org/packages/88/de/ddacca9545a5e01332567db01d44bd8cf725f2db3b3d61a80550b48308ea/ruff-0.15.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ee3ef42dab7078bda5ff6a1bcba8539e9857deb447132ad5566a038674540d0", size = 11496266, upload-time = "2026-04-09T14:05:55.485Z" }, - { url = "https://files.pythonhosted.org/packages/bc/bb/7ddb00a83760ff4a83c4e2fc231fd63937cc7317c10c82f583302e0f6586/ruff-0.15.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51cb8cc943e891ba99989dd92d61e29b1d231e14811db9be6440ecf25d5c1609", size = 11256418, upload-time = "2026-04-09T14:05:57.69Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8d/55de0d35aacf6cd50b6ee91ee0f291672080021896543776f4170fc5c454/ruff-0.15.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e59c9bdc056a320fb9ea1700a8d591718b8faf78af065484e801258d3a76bc3f", size = 11288416, upload-time = "2026-04-09T14:05:44.695Z" }, - { url = "https://files.pythonhosted.org/packages/68/cf/9438b1a27426ec46a80e0a718093c7f958ef72f43eb3111862949ead3cc1/ruff-0.15.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:136c00ca2f47b0018b073f28cb5c1506642a830ea941a60354b0e8bc8076b151", size = 10621053, upload-time = "2026-04-09T14:05:52.782Z" }, - { url = "https://files.pythonhosted.org/packages/4c/50/e29be6e2c135e9cd4cb15fbade49d6a2717e009dff3766dd080fcb82e251/ruff-0.15.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8b80a2f3c9c8a950d6237f2ca12b206bccff626139be9fa005f14feb881a1ae8", size = 10378302, upload-time = "2026-04-09T14:06:14.361Z" }, - { url = "https://files.pythonhosted.org/packages/18/2f/e0b36a6f99c51bb89f3a30239bc7bf97e87a37ae80aa2d6542d6e5150364/ruff-0.15.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e3e53c588164dc025b671c9df2462429d60357ea91af7e92e9d56c565a9f1b07", size = 10850074, upload-time = "2026-04-09T14:06:16.581Z" }, - { url = "https://files.pythonhosted.org/packages/11/08/874da392558ce087a0f9b709dc6ec0d60cbc694c1c772dab8d5f31efe8cb/ruff-0.15.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b0c52744cf9f143a393e284125d2576140b68264a93c6716464e129a3e9adb48", size = 11358051, upload-time = "2026-04-09T14:06:18.948Z" }, - { url = "https://files.pythonhosted.org/packages/e4/46/602938f030adfa043e67112b73821024dc79f3ab4df5474c25fa4c1d2d14/ruff-0.15.10-py3-none-win32.whl", hash = "sha256:d4272e87e801e9a27a2e8df7b21011c909d9ddd82f4f3281d269b6ba19789ca5", size = 10588964, upload-time = "2026-04-09T14:06:07.14Z" }, - { url = "https://files.pythonhosted.org/packages/25/b6/261225b875d7a13b33a6d02508c39c28450b2041bb01d0f7f1a83d569512/ruff-0.15.10-py3-none-win_amd64.whl", hash = "sha256:28cb32d53203242d403d819fd6983152489b12e4a3ae44993543d6fe62ab42ed", size = 11745044, upload-time = "2026-04-09T14:05:39.473Z" }, - { url = "https://files.pythonhosted.org/packages/58/ed/dea90a65b7d9e69888890fb14c90d7f51bf0c1e82ad800aeb0160e4bacfd/ruff-0.15.10-py3-none-win_arm64.whl", hash = "sha256:601d1610a9e1f1c2165a4f561eeaa2e2ea1e97f3287c5aa258d3dab8b57c6188", size = 11035607, upload-time = "2026-04-09T14:05:47.593Z" }, +version = "0.15.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, + { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, + { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, + { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, + { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, + { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, + { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, + { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, + { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, + { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, ] [[package]] @@ -2282,11 +2256,11 @@ wheels = [ [[package]] name = "tomlkit" -version = "0.14.0" +version = "0.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/af/14b24e41977adb296d6bd1fb59402cf7d60ce364f90c890bd2ec65c43b5a/tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064", size = 187167, upload-time = "2026-01-13T01:14:53.304Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/11/87d6d29fb5d237229d67973a6c9e06e048f01cf4994dee194ab0ea841814/tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", size = 39310, upload-time = "2026-01-13T01:14:51.965Z" }, + { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, ] [[package]] @@ -2308,40 +2282,41 @@ wheels = [ [[package]] name = "traitlets" -version = "5.14.3" +version = "5.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" }, ] [[package]] name = "ty" -version = "0.0.30" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/21/3ee32f163038ac2663c7bea47a07d06bf4cc7c09d95b96db194bda1b70cb/ty-0.0.30.tar.gz", hash = "sha256:c982207640e7d75331b81031ebfb884ab858ed26ab16d7c086ac4942e2771846", size = 5518350, upload-time = "2026-04-14T13:53:35.462Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/24/7aa94d02a9257ed96e64e4e99b527f28390febd8424107b4f8a70763ace9/ty-0.0.30-py3-none-linux_armv6l.whl", hash = "sha256:1be31a24a2a177571c3276854bf01b2b1a77dba6e754507089c25bb1825ce5f6", size = 10801835, upload-time = "2026-04-14T13:53:21.477Z" }, - { url = "https://files.pythonhosted.org/packages/ec/97/2410ebc85cfcdf3bbd0e5958c6cd0b88085b1a184374ecfa755f84d6c8b2/ty-0.0.30-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:019f1d0d5d5265a1e634a51fd49374df43dafae14de98c2a0d349beb8233550b", size = 10582386, upload-time = "2026-04-14T13:53:07.472Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d2/a2649eb6841ebf946ac827e778b7e78b5ef63c3758bf2b9da13d927a53da/ty-0.0.30-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe3012af4d0714e7353fd3cf6d2d02d5b0f0fe6f1cb8beb2366ed9f621c2c349", size = 10031621, upload-time = "2026-04-14T13:53:01.523Z" }, - { url = "https://files.pythonhosted.org/packages/6e/8e/40a66ccd5d5d51adf0469b9fbe4f1f79f928a880b34b8a6c7c934e8a883a/ty-0.0.30-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1e90b4ebf6310c7734344739e0950f4cede5a33b1e51a12a0c0fc8a975866ed", size = 10537511, upload-time = "2026-04-14T13:53:04.538Z" }, - { url = "https://files.pythonhosted.org/packages/25/31/5dea2987601ef1c8c58b04f2173971e7fe51f7902ab93a66d09e0f12115a/ty-0.0.30-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd83a0d82cbc32c2ae521e7fa101fb5fe5b566adb1364996582535700572a9ec", size = 10603406, upload-time = "2026-04-14T13:53:47.564Z" }, - { url = "https://files.pythonhosted.org/packages/b9/a4/5a7585b6b219a2edc00255af0b16a8475f88fe43c5cdbe499daecb67f100/ty-0.0.30-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:672a29271c13247096d0b2766e69cb35b1583882dd6e7b24065927e2491ffe6d", size = 11109133, upload-time = "2026-04-14T13:53:24.463Z" }, - { url = "https://files.pythonhosted.org/packages/b9/83/b402dc4bd99b6f3eb0bce04e557889a164e099976a7fc71a6b07c923241b/ty-0.0.30-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91ff236adbb90281c05f7e160664820be50f42d3a9d8f1d0a648f006864114fa", size = 11663362, upload-time = "2026-04-14T13:53:18.505Z" }, - { url = "https://files.pythonhosted.org/packages/65/1b/8157f03acc15421083c194b11a61a78d10e3dfa7e4a0177809fc9acc3881/ty-0.0.30-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ec99bd5d5430c52fb64038483deb070f12c7ae78ffd6d6841d31719daedf1d7", size = 11304786, upload-time = "2026-04-14T13:53:30.076Z" }, - { url = "https://files.pythonhosted.org/packages/d9/c3/f89a9a42b47da108ed758ae9d065d10bf2acc2ea88e3d200b95511096b7b/ty-0.0.30-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4b328ee332ec6276afc863ea7cf6d8167d9dd8d9f3d1c2e738ef39932511ac4", size = 11173426, upload-time = "2026-04-14T13:53:10.262Z" }, - { url = "https://files.pythonhosted.org/packages/81/37/fa38ee0259dc49579e1871b23ab1ff27331a78460566cdc13045a237595d/ty-0.0.30-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fd0d664d6530890a8e872accd96895410773e7a4c6d20c244fb7a5f541ff359b", size = 10517157, upload-time = "2026-04-14T13:53:15.739Z" }, - { url = "https://files.pythonhosted.org/packages/2e/79/28032481141eb6ce3274f62b9ff9b1d73d59df6b28080c8fe3c6bdef700e/ty-0.0.30-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:314004166a7a5e39e169c7da0b9e78f3315382f53db8698fd98346cee3bb0784", size = 10613222, upload-time = "2026-04-14T13:53:13.269Z" }, - { url = "https://files.pythonhosted.org/packages/45/a0/989fca4c74095defd7d3ba5afc68a5aa4e2ca428fedfca5df526701c730b/ty-0.0.30-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d969ebf9d8b08e93e638c56e6fb5a8dacd2a24f43e3519479d245ddde69f968e", size = 10789624, upload-time = "2026-04-14T13:53:42.156Z" }, - { url = "https://files.pythonhosted.org/packages/5c/74/3e74aba392ba2eeae5d86568ee282d9d6b2b6642445e3d9837c88d73c282/ty-0.0.30-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:66922c8c4381a016f90ec4b811748e7bb12da892f4c273640710da721caea7fb", size = 11260273, upload-time = "2026-04-14T13:53:44.974Z" }, - { url = "https://files.pythonhosted.org/packages/24/0e/e94a0e5e5a1850a2ba61c5efcfa594cfc2d23c026bf431cce33003d036a0/ty-0.0.30-py3-none-win32.whl", hash = "sha256:b7b2ecf80c872d7d9928b372e99233bdda7cabe639edd06b6232c3161a7dfa40", size = 10145096, upload-time = "2026-04-14T13:53:39.335Z" }, - { url = "https://files.pythonhosted.org/packages/50/d3/09c8df72ad37f7f4d9d79fe04a08bfa649d9f141d137e624fc23c7c3d7fe/ty-0.0.30-py3-none-win_amd64.whl", hash = "sha256:f29834e3d96c447f2adcf9eeb55b3f92005c91f52597c4c46d844188ec67ec72", size = 11156009, upload-time = "2026-04-14T13:53:32.847Z" }, - { url = "https://files.pythonhosted.org/packages/e6/17/a5c049c36e2fef9c593a1862f275af963b66045378f10b6908c6f10f6f4a/ty-0.0.30-py3-none-win_arm64.whl", hash = "sha256:d9be1d258dab615b447d20fa58633f0ae163af01bfa781a50457defec20642fd", size = 10552887, upload-time = "2026-04-14T13:53:27.455Z" }, +version = "0.0.37" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/c3/60bc4829e0c1a8ff80b592067e1185a7b5ea64608acb0c676c44d5137d52/ty-0.0.37.tar.gz", hash = "sha256:f873f69627bd7f4ef8d57f716c63e5c63d7d1b7327ab3de185c7287a75223011", size = 5655422, upload-time = "2026-05-16T05:57:21.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/fe/180dd6914f9db33ad0200fbeaa429dd1fb0a4e6d98320dc1775f100a91af/ty-0.0.37-py3-none-linux_armv6l.whl", hash = "sha256:66cf7310189856e15f690559ddf37735476d2644db917d92f7cef13e5c834adf", size = 11246028, upload-time = "2026-05-16T05:57:41.744Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a2/fa0cfd31467ad99b2db8c81ee9e2b4574589974a3eb9723be825e15b300c/ty-0.0.37-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2048f3c44ee6c7dde6e0ca064f99c6cada8f6de8ccdcfad2d856a429f8a4ac82", size = 11001460, upload-time = "2026-05-16T05:57:35.27Z" }, + { url = "https://files.pythonhosted.org/packages/10/3f/db60ba9be8b95a464ece0ba103e534047c34b49fee12f5e101f83f8d66db/ty-0.0.37-py3-none-macosx_11_0_arm64.whl", hash = "sha256:32c7b9b5b626aacdec334b44a2698e5f7b80df55bf7338267084d00d4b9546b3", size = 10446549, upload-time = "2026-05-16T05:57:37.252Z" }, + { url = "https://files.pythonhosted.org/packages/56/6f/11dd7174b20ebcb37a3d3b68f60b3940e37e4356e0accd03e2d7f9f70690/ty-0.0.37-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9fba1bebccf1e656bc5e3787acc5a191c491041ee4d12fe8fe2eff64e7b190d", size = 10961016, upload-time = "2026-05-16T05:57:16.394Z" }, + { url = "https://files.pythonhosted.org/packages/65/dd/3c17ce2860c525817c42c82d7075391b1f5615d36c03aa2d26647a224e8a/ty-0.0.37-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f987c5fb59aa5017ee8e8c5b57a07390f584e58e572255acd0fa44b3e0b238df", size = 11022093, upload-time = "2026-05-16T05:57:32.741Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a8/e7a40b0b57660921dd3482d219add963973b52ae8507abd88f48439704b5/ty-0.0.37-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4168f53146e7a3f52560ff433f238352591c9b1a9ed09397fbb776ddef4f89c", size = 11486333, upload-time = "2026-05-16T05:57:18.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/2c406b98244bc1ad42afdd35f466bcef88664210957dcbb5172254ff2462/ty-0.0.37-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e487eafdb80a48223ce68a01f9287528216ffe0126d1629ff11e4f7c1dd3cf", size = 12093526, upload-time = "2026-05-16T05:57:04.456Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3c/5c492a38e1b21a26370727dd4b77a53f05262e53e3be232047f22e7fa1b3/ty-0.0.37-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b49f388d063668676daaa7eef57385089d1b844279c0185bd84d4dbc3bcede6", size = 11725957, upload-time = "2026-05-16T05:57:23.356Z" }, + { url = "https://files.pythonhosted.org/packages/b2/00/8a3d9ba265cd0582342c14e4980cc0351aaaa45c6305712d398c9e2446c7/ty-0.0.37-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b96bfc1cc725d9d859abef4e3aa32a6da0f7472eaaafae2d9a6cffd729c7c61", size = 11610336, upload-time = "2026-05-16T05:57:27.888Z" }, + { url = "https://files.pythonhosted.org/packages/91/4b/6ee172935cb842f5c1553b0d37215b45e9dde05a4c74fdb47fd271907122/ty-0.0.37-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:c55f39b519107cf234b794718793e11793c055e89028a282a309f690def48117", size = 11797856, upload-time = "2026-05-16T05:57:11.109Z" }, + { url = "https://files.pythonhosted.org/packages/34/ef/75a7425bf9fe74483404ff11a8cbe3aa307354e0801697d6063384157776/ty-0.0.37-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c79204350de060a077bff7f027a1d53e216cad147d826ec9862be0af2f9c3c1e", size = 10941848, upload-time = "2026-05-16T05:57:30.653Z" }, + { url = "https://files.pythonhosted.org/packages/e0/2c/7ea9dccd55961375067f99ed00fb8eabb491f6a06d0e5f09c797d2b900a6/ty-0.0.37-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:49a21b4dcb2cd94cd0298c96dfb71a2dd25f08bf7e6eefd0c33c519d058908c6", size = 11058248, upload-time = "2026-05-16T05:57:01.785Z" }, + { url = "https://files.pythonhosted.org/packages/98/d7/848fde96c6610b2b1fd75823d44d8977a4525c4397f27332f054ccd6cf9c/ty-0.0.37-py3-none-musllinux_1_2_i686.whl", hash = "sha256:119332095c5974fe1dabfe4fd00c6759eeec5b99f7d7a80b2833feee5a58abdb", size = 11168423, upload-time = "2026-05-16T05:57:39.297Z" }, + { url = "https://files.pythonhosted.org/packages/29/11/c1613ac4b64357b9067df68bac97bcb458cc426cd468a2782847238c539b/ty-0.0.37-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ac5dc593675414f68862c2f71cc04912b0e5ec5520a9c49fc71ed79205b95c33", size = 11698565, upload-time = "2026-05-16T05:57:14.206Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ac/961205863903881996adb5a6f9cfe570c132882922ac226540346f15df20/ty-0.0.37-py3-none-win32.whl", hash = "sha256:33b57e4095179f06c2ae01c334833645cad94bf7d7467e073cdc3aaabea565d3", size = 10518308, upload-time = "2026-05-16T05:57:25.824Z" }, + { url = "https://files.pythonhosted.org/packages/39/cd/f308edd0cd86e402fe3a1b5c54e0a0dfa0177d80c1557c4849510bb2a147/ty-0.0.37-py3-none-win_amd64.whl", hash = "sha256:3b159351e99cf6eed7aacfb69ae8437725d15599ac4f21c8b2e909b300498b6c", size = 11607159, upload-time = "2026-05-16T05:57:06.76Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ed/5ec4b501479bc5dad55467e2fe72e797cb9c178468c0d1a514536872ebc5/ty-0.0.37-py3-none-win_arm64.whl", hash = "sha256:6c3c2b997f68c71e14242b96d48cba3c086439556af02bb4613aa458950d5c23", size = 10958817, upload-time = "2026-05-16T05:57:08.907Z" }, ] [[package]] name = "typer" -version = "0.24.1" +version = "0.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -2349,9 +2324,9 @@ dependencies = [ { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, ] [[package]] @@ -2377,51 +2352,51 @@ wheels = [ [[package]] name = "tzdata" -version = "2026.1" +version = "2026.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, ] [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] name = "uv" -version = "0.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dd/f3/8aceeab67ea69805293ab290e7ca8cc1b61a064d28b8a35c76d8eba063dd/uv-0.11.6.tar.gz", hash = "sha256:e3b21b7e80024c95ff339fcd147ac6fc3dd98d3613c9d45d3a1f4fd1057f127b", size = 4073298, upload-time = "2026-04-09T12:09:01.738Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/fe/4b61a3d5ad9d02e8a4405026ccd43593d7044598e0fa47d892d4dafe44c9/uv-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:ada04dcf89ddea5b69d27ac9cdc5ef575a82f90a209a1392e930de504b2321d6", size = 23780079, upload-time = "2026-04-09T12:08:56.609Z" }, - { url = "https://files.pythonhosted.org/packages/52/db/d27519a9e1a5ffee9d71af1a811ad0e19ce7ab9ae815453bef39dd479389/uv-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5be013888420f96879c6e0d3081e7bcf51b539b034a01777041934457dfbedf3", size = 23214721, upload-time = "2026-04-09T12:09:32.228Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8f/4399fa8b882bd7e0efffc829f73ab24d117d490a93e6bc7104a50282b854/uv-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ffa5dc1cbb52bdce3b8447e83d1601a57ad4da6b523d77d4b47366db8b1ceb18", size = 21750109, upload-time = "2026-04-09T12:09:24.357Z" }, - { url = "https://files.pythonhosted.org/packages/32/07/5a12944c31c3dda253632da7a363edddb869ed47839d4d92a2dc5f546c93/uv-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:bfb107b4dade1d2c9e572992b06992d51dd5f2136eb8ceee9e62dd124289e825", size = 23551146, upload-time = "2026-04-09T12:09:10.439Z" }, - { url = "https://files.pythonhosted.org/packages/79/5b/2ec8b0af80acd1016ed596baf205ddc77b19ece288473b01926c4a9cf6db/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:9e2fe7ce12161d8016b7deb1eaad7905a76ff7afec13383333ca75e0c4b5425d", size = 23331192, upload-time = "2026-04-09T12:09:34.792Z" }, - { url = "https://files.pythonhosted.org/packages/62/7d/eea35935f2112b21c296a3e42645f3e4b1aa8bcd34dcf13345fbd55134b7/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ed9c6f70c25e8dfeedddf4eddaf14d353f5e6b0eb43da9a14d3a1033d51d915", size = 23337686, upload-time = "2026-04-09T12:09:18.522Z" }, - { url = "https://files.pythonhosted.org/packages/21/47/2584f5ab618f6ebe9bdefb2f765f2ca8540e9d739667606a916b35449eec/uv-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d68a013e609cebf82077cbeeb0809ed5e205257814273bfd31e02fc0353bbfc2", size = 25008139, upload-time = "2026-04-09T12:09:03.983Z" }, - { url = "https://files.pythonhosted.org/packages/95/81/497ae5c1d36355b56b97dc59f550c7e89d0291c163a3f203c6f341dff195/uv-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93f736dddca03dae732c6fdea177328d3bc4bf137c75248f3d433c57416a4311", size = 25712458, upload-time = "2026-04-09T12:09:07.598Z" }, - { url = "https://files.pythonhosted.org/packages/3c/1c/74083238e4fab2672b63575b9008f1ea418b02a714bcfcf017f4f6a309b6/uv-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96a66abe53fced0e3389008b8d2eff8278cfa8bb545d75631ae8ceb9c929aba", size = 24915507, upload-time = "2026-04-09T12:08:50.892Z" }, - { url = "https://files.pythonhosted.org/packages/5a/ee/e14fe10ba455a823ed18233f12de6699a601890905420b5c504abf115116/uv-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b096311b2743b228df911a19532b3f18fa420bf9530547aecd6a8e04bbfaccd", size = 24971011, upload-time = "2026-04-09T12:08:54.016Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/7b9c83eaadf98e343317ff6384a7227a4855afd02cdaf9696bcc71ee6155/uv-0.11.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:904d537b4a6e798015b4a64ff5622023bd4601b43b6cd1e5f423d63471f5e948", size = 23640234, upload-time = "2026-04-09T12:09:15.735Z" }, - { url = "https://files.pythonhosted.org/packages/d6/51/75ccdd23e76ff1703b70eb82881cd5b4d2a954c9679f8ef7e0136ef2cfab/uv-0.11.6-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:4ed8150c26b5e319381d75ae2ce6aba1e9c65888f4850f4e3b3fa839953c90a5", size = 24452664, upload-time = "2026-04-09T12:09:26.875Z" }, - { url = "https://files.pythonhosted.org/packages/4d/86/ace80fe47d8d48b5e3b5aee0b6eb1a49deaacc2313782870250b3faa36f5/uv-0.11.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1c9218c8d4ac35ca6e617fb0951cc0ab2d907c91a6aea2617de0a5494cf162c0", size = 24494599, upload-time = "2026-04-09T12:09:37.368Z" }, - { url = "https://files.pythonhosted.org/packages/05/2d/4b642669b56648194f026de79bc992cbfc3ac2318b0a8d435f3c284934e8/uv-0.11.6-py3-none-musllinux_1_1_i686.whl", hash = "sha256:9e211c83cc890c569b86a4183fcf5f8b6f0c7adc33a839b699a98d30f1310d3a", size = 24159150, upload-time = "2026-04-09T12:09:13.17Z" }, - { url = "https://files.pythonhosted.org/packages/ae/24/7eecd76fe983a74fed1fc700a14882e70c4e857f1d562a9f2303d4286c12/uv-0.11.6-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d2a1d2089afdf117ad19a4c1dd36b8189c00ae1ad4135d3bfbfced82342595cf", size = 25164324, upload-time = "2026-04-09T12:08:59.56Z" }, - { url = "https://files.pythonhosted.org/packages/27/e0/bbd4ba7c2e5067bbba617d87d306ec146889edaeeaa2081d3e122178ca08/uv-0.11.6-py3-none-win32.whl", hash = "sha256:6e8344f38fa29f85dcfd3e62dc35a700d2448f8e90381077ef393438dcd5012e", size = 22865693, upload-time = "2026-04-09T12:09:21.415Z" }, - { url = "https://files.pythonhosted.org/packages/a5/33/1983ce113c538a856f2d620d16e39691962ecceef091a84086c5785e32e5/uv-0.11.6-py3-none-win_amd64.whl", hash = "sha256:a28bea69c1186303d1200f155c7a28c449f8a4431e458fcf89360cc7ef546e40", size = 25371258, upload-time = "2026-04-09T12:09:40.52Z" }, - { url = "https://files.pythonhosted.org/packages/35/01/be0873f44b9c9bc250fcbf263367fcfc1f59feab996355bcb6b52fff080d/uv-0.11.6-py3-none-win_arm64.whl", hash = "sha256:a78f6d64b9950e24061bc7ec7f15ff8089ad7f5a976e7b65fcadce58fe02f613", size = 23869585, upload-time = "2026-04-09T12:09:29.425Z" }, +version = "0.11.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/a3/be4a946c7c2fc4094c020c8f7d8bd0a739bad55ebe4e2817d6e2b1bc6bff/uv-0.11.14.tar.gz", hash = "sha256:0ea006a117b586b2681b6dfd9703a540d2ad2a136ec0f48d272767e599cc3dfb", size = 4130699, upload-time = "2026-05-12T18:00:37.321Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/15/9b2138b16eb1fa8c2cd84b1037ad10c38b3acc36ce96c6d27000bfb7e716/uv-0.11.14-py3-none-linux_armv6l.whl", hash = "sha256:78411a883f230a710af19f2ac6e6f0ba8eae90f0e5af4605f923fd367539fff4", size = 23545199, upload-time = "2026-05-12T18:01:34.526Z" }, + { url = "https://files.pythonhosted.org/packages/75/81/c678e8b9a8e624f9c338c66cd57dd9cfc6b5a0501ad3c87fd0cc0bf8850a/uv-0.11.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:078f2e63da89c8fcf6d578f02156045c5990c57d76464aab3f3f798d3fff95cd", size = 22957064, upload-time = "2026-05-12T18:00:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ad/95fbd15b23f26f36d0cfb0ddf159b9602a1b1c0feced60a7f98385e919f1/uv-0.11.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dcdad43d52c130e3159e84ab1844e04d819d2c4a2495a687d27f80d560a3650e", size = 21678307, upload-time = "2026-05-12T18:00:57.132Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cb/b3da1c4d95d6dd507896bca16dbd643118013b2b151f5f35a08d3391728c/uv-0.11.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:9923da7c63d70de9fe71829503d7e7ebfd6304e804d7232aad5f716e190db25b", size = 23353409, upload-time = "2026-05-12T18:01:27.512Z" }, + { url = "https://files.pythonhosted.org/packages/51/ad/78c6b8d6bcc04c5043b50631e9b413422a03a0bd7c4a997748f8e9cbac25/uv-0.11.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:3b0759ca504e48dcd4fafb1a61ef69aeb24c5a60fbf5f504a7873c8db1b24718", size = 23103964, upload-time = "2026-05-12T18:01:31.094Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7d/acb66e09bc54a74e4288e996d841af04d88588fd6bdbfbab2468ab7169a7/uv-0.11.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78b51b117549ee4db7197ea5ece0848cecd443e464fb9dff9f254cdc1e4ed96f", size = 23104638, upload-time = "2026-05-12T18:01:10.093Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/8497be61accdb8e56d02e11edd3ac471466259420e0bd9c05c1966df134a/uv-0.11.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1ddbe8a2ab160affc179e9c3a40913b23a08cdf55254e1f3829cc22a51a0d8d", size = 24625888, upload-time = "2026-05-12T18:01:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/95/91/f730799fd20a45777b255e20cf9f648a4e4e0979bf65e87a8633197cf7d9/uv-0.11.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3005a2db1e8d72e125630d4f22ac4ceddb2c033e1f9b94b7f3ea38ebac46dd6", size = 25445231, upload-time = "2026-05-12T18:00:40.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/106463fc27e63e402aec2e791774dac2db5bd5e1c36cdcf38125aa97ab1c/uv-0.11.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5c8f9ea36274ef2f9d24f0522085e280844172e901d9213f66a21b212266706", size = 24571961, upload-time = "2026-05-12T18:00:43.713Z" }, + { url = "https://files.pythonhosted.org/packages/12/4d/163fe746b97bd1129627e8b1f943e17583ddc143eaab532d56a799a9ba5a/uv-0.11.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:379e64b236cf55f762a8308d7efe4365d5296ba29f3a4868761bc45b4e915a71", size = 24718523, upload-time = "2026-05-12T18:01:06.587Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/7a3673494a0cf70267559166398f9c50c4925ff20122f99a28d6c5a80d83/uv-0.11.14-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:29c12a562441fc2d604e6920c558cacce74a55f889468708683a79b35a6e18a1", size = 23454821, upload-time = "2026-05-12T18:00:51.166Z" }, + { url = "https://files.pythonhosted.org/packages/bb/43/6358394a567d865f3a5ce27b1e0d939549911e36d9b59f0c545a167f92f7/uv-0.11.14-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:e84069681c0334e07cbc7f114eb09d7fe1335e1db0297a66dbca80a1b393fe6d", size = 24087843, upload-time = "2026-05-12T18:00:47.272Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f6/7d0ae1e1f52b85057ca24d8876d6a4cc87b541ea6aca627fe36594c06099/uv-0.11.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b15bf7c146e38d7c938d3a207115d5fdd8ef764fe1f866c225b1bed27e88da1e", size = 24147611, upload-time = "2026-05-12T18:01:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a2/511ad0c5da5697fd990b99569425b62b81cbc3458c35acc845211b55d6b5/uv-0.11.14-py3-none-musllinux_1_1_i686.whl", hash = "sha256:ddda5c5e41097814adac535c74851bae55e8097b9afc79aeae7fcffd8d86c06d", size = 23920348, upload-time = "2026-05-12T18:01:24.033Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b6/7084e3401b1f1020f215a125136eec1ed2bd541e10a5fea1625515579599/uv-0.11.14-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:e54326703f1eca83a6fd73275e0f398b16b7d3f81531bf58899c2869bc403f6c", size = 24928981, upload-time = "2026-05-12T18:01:13.961Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6a/7e81729fe729889c8cc63bbf64291734359bd7f6ba84852dc0504453511d/uv-0.11.14-py3-none-win32.whl", hash = "sha256:b384d873d0d18552c7524226125efd3965d921b7134c2f476c333771beb733e1", size = 22573503, upload-time = "2026-05-12T18:00:34.36Z" }, + { url = "https://files.pythonhosted.org/packages/94/5d/f8905f9af5cd46af2a688b2246dbb5a4d95b8557eeffd7f241e037659d9e/uv-0.11.14-py3-none-win_amd64.whl", hash = "sha256:f0a8b58b38e984241bca5d7a5a47bf9ffe1ca2ab392a640887db8a04c4a9ec95", size = 25175590, upload-time = "2026-05-12T18:01:00.38Z" }, + { url = "https://files.pythonhosted.org/packages/04/cb/7333d08d944f3018eb89242cd5e646e7b37faa1b567faeaf9254a8b59d53/uv-0.11.14-py3-none-win_arm64.whl", hash = "sha256:6a13e7e064563050c6606b3fd77091d427cdbdc5938b6f134baf8d8ec79bfdb7", size = 23594775, upload-time = "2026-05-12T18:01:03.55Z" }, ] [[package]] name = "virtualenv" -version = "21.2.4" +version = "21.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -2430,18 +2405,18 @@ dependencies = [ { name = "python-discovery" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/98/3a7e644e19cb26133488caff231be390579860bbbb3da35913c49a1d0a46/virtualenv-21.2.4.tar.gz", hash = "sha256:b294ef68192638004d72524ce7ef303e9d0cf5a44c95ce2e54a7500a6381cada", size = 5850742, upload-time = "2026-04-14T22:15:31.438Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/ba/1f6e8c957e4932be060dcdc482d339c12e0216351478add3645cdaa53c05/virtualenv-21.3.3.tar.gz", hash = "sha256:f5bda277e553b1c2b3c1a8debfc30496e1288cc93ce6b7b71b3280047e317328", size = 7613784, upload-time = "2026-05-13T18:01:30.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/8d/edd0bd910ff803c308ee9a6b7778621af0d10252219ad9f19ef4d4982a61/virtualenv-21.2.4-py3-none-any.whl", hash = "sha256:29d21e941795206138d0f22f4e45ff7050e5da6c6472299fb7103318763861ac", size = 5831232, upload-time = "2026-04-14T22:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/f4/34/a9dbe051de88a63eb7408ea66630bac38e72f7f6077d4be58737106860d9/virtualenv-21.3.3-py3-none-any.whl", hash = "sha256:7d5987d8369e098e41406efb780a3d4ca79280097293899e351a6407ee153ab3", size = 7594554, upload-time = "2026-05-13T18:01:27.815Z" }, ] [[package]] name = "wcwidth" -version = "0.6.0" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, ] [[package]] @@ -2455,15 +2430,15 @@ wheels = [ [[package]] name = "zerv-version" -version = "0.8.13" +version = "0.8.15" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/15/2ce4083088ce51a7764ecfa6f92c937391827dd53d603475f5c1fe069020/zerv_version-0.8.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6e4d960d5e08874731ff9154d8d5fb5ead3db21fe4029acd34966ff59aeeaf44", size = 2092587, upload-time = "2026-04-15T04:00:51.593Z" }, - { url = "https://files.pythonhosted.org/packages/c9/70/202063d15b5b2311fb268f18492b4ca8a4b6ba9ee056c48242151c017a5e/zerv_version-0.8.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8fbef64fcd9f0f77e0ae671287b4651fe72acd821c13b5064d94a8673a60eedb", size = 1991838, upload-time = "2026-04-15T03:58:41.447Z" }, - { url = "https://files.pythonhosted.org/packages/19/46/66f08ee83ba3d88dddef9421ccc6b5e8b4c28ce560d8d0bd252fd060d6b8/zerv_version-0.8.13-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:b918d6fc814fc785ac160e840c5bb5d29e3888a0f345412193eefa1677bf61d5", size = 2028066, upload-time = "2026-04-15T03:58:48.77Z" }, - { url = "https://files.pythonhosted.org/packages/02/db/6582726c2e2e4cdd083f2cacb90d0cfff86b520513d6e26bdba8447cc623/zerv_version-0.8.13-py3-none-manylinux_2_39_x86_64.whl", hash = "sha256:cb4dabc251c08796bf2737843ab7abb46c9d491dab025a7e75c54c4b8e95b9fc", size = 2180932, upload-time = "2026-04-15T03:58:26.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/6c/ebb5e9737327738eced867f03a06f67b2d26d27eb04febf3656643375996/zerv_version-0.8.13-py3-none-win_amd64.whl", hash = "sha256:af4f4fae52aafab9e93c4298bdc818b27da61ea0d55f856e9e38e75b66e0aa1e", size = 2077771, upload-time = "2026-04-15T04:01:29.058Z" }, - { url = "https://files.pythonhosted.org/packages/4d/62/0c73f76f02ff7c2468f3f56f13030c7c79a85cdb84fbc18f2a1b73c367d0/zerv_version-0.8.13-py3-none-win_arm64.whl", hash = "sha256:e5bb6235f244bf4e29f2f2f110716cb9ec1be27d55d36297390903c10f62893e", size = 1956095, upload-time = "2026-04-15T04:01:55.648Z" }, + { url = "https://files.pythonhosted.org/packages/94/7b/f1067b8805e0c18f1c12aea5b9c49cb7967b7ddfe2d24f0a11cd2fe53258/zerv_version-0.8.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0b9d245e584a4997f517486d97324a14025b94c3bdd04b277827270d0894a41c", size = 2097671, upload-time = "2026-05-05T07:23:10.599Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0e/1c0abb685f7c7f9f54fbb71c1d80c3ef58fc6be3f443fe17a34b2f521a92/zerv_version-0.8.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0a28b46d9e73e76a9e56977a7fbf42a4a0e9bef2a86d9addbf90aa8d4adc9aed", size = 1996336, upload-time = "2026-05-05T07:24:03.295Z" }, + { url = "https://files.pythonhosted.org/packages/83/ba/58ea7e7d1803ea2c6e0671cbb42d2976379f2aa3e368a8eab365ec08a7c3/zerv_version-0.8.15-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:f5fcd42e5900511f60cafdc6c8d09c0dcd71bcd92d74f7a55f47b3557f3a8941", size = 2043232, upload-time = "2026-05-05T07:23:28.605Z" }, + { url = "https://files.pythonhosted.org/packages/c1/74/4e173e27e9450c3bad5feed851288229fc57ea0f5d8811ffe3d076755e66/zerv_version-0.8.15-py3-none-manylinux_2_39_x86_64.whl", hash = "sha256:b1e14ea01e880fc2c6021192486a7793e129780f7256c47646913f6324e16292", size = 2185563, upload-time = "2026-05-05T07:24:46.794Z" }, + { url = "https://files.pythonhosted.org/packages/6d/83/83583461cff6c3b45f2a1af01ca2a3d965d85c1bcf5240434cb2c21bd87d/zerv_version-0.8.15-py3-none-win_amd64.whl", hash = "sha256:d9c8df8e691c6575b2ea607b647f426e201dc2dbac061a4dcc64607122878082", size = 2089080, upload-time = "2026-05-05T07:25:34.127Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/3233bfdff88ec0e3fbabd58229a4d50d3f971ff182a11decaa5fdf56fbe1/zerv_version-0.8.15-py3-none-win_arm64.whl", hash = "sha256:848f7ae9104e13c63b49f42d877b590f1587da6745c7426416e772ac4bdc6125", size = 1980199, upload-time = "2026-05-05T07:26:36.306Z" }, ] [[package]]