diff --git a/.env.public b/.env.public index 9ac2189f3..dcc3e25bf 100644 --- a/.env.public +++ b/.env.public @@ -4,6 +4,7 @@ COUCHDB_USERNAME=admin COUCHDB_PASSWORD=password IOT_DBNAME=chiller WO_DBNAME=workorder +TRANSFORMER_DBNAME=transformer # ── IBM WatsonX (plan-execute runner) ──────────────────────────────────────── WATSONX_APIKEY= diff --git a/.gitignore b/.gitignore index a775beb4f..a9eb29851 100644 --- a/.gitignore +++ b/.gitignore @@ -201,6 +201,10 @@ mcp/couchdb/sample_data/bulk_docs.json .env mcp/servers/tsfm/artifacts/tsfm_models/ src/tmp/ +src/scenarios/tmp/ + +# ignore generated scenario outputs and manual scenario analyses +generated/ # Observability artifacts (OTLP-JSON traces + per-run trajectory JSON). traces/ diff --git a/pyproject.toml b/pyproject.toml index 89c2ee43b..a256c9f2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ description = "Add your description here" readme = "INSTRUCTIONS.md" requires-python = ">=3.12" dependencies = [ + "certifi>=2024.8.30", "couchdb3>=2.0.2", "fastmcp>=2.14.5", "mcp[cli]>=1.26.0", @@ -29,6 +30,9 @@ dependencies = [ "langchain-openai>=1.1.0", "python-dotenv>=1.0", "scipy>=1.10.0", + "scikit-learn>=1.8.0", + "datasets>=4.8.4", + "pypdf>=6.9.2", ] [project.scripts] diff --git a/src/couchdb/couchdb_setup.sh b/src/couchdb/couchdb_setup.sh index 20c5c48c4..32999f646 100644 --- a/src/couchdb/couchdb_setup.sh +++ b/src/couchdb/couchdb_setup.sh @@ -49,5 +49,18 @@ else echo "⚠️ $VIBRATION_FILE not found, skipping vibration data." fi +# Load transformer sample data (Transformer_01) into a dedicated database +TRANSFORMER_FILE="/sample_data/iot/bulk_docs_transformer.json" +if [ -f "$TRANSFORMER_FILE" ]; then + echo "Loading transformer data..." + COUCHDB_URL="http://localhost:5984" \ + python3 /couchdb/init_asset_data.py \ + --data-file "$TRANSFORMER_FILE" \ + --db "${TRANSFORMER_DBNAME:-transformer}" \ + --drop +else + echo "⚠️ $TRANSFORMER_FILE not found, skipping transformer data." +fi + echo "✅ All databases initialised." tail -f /dev/null diff --git a/src/couchdb/docker-compose.yaml b/src/couchdb/docker-compose.yaml index 9ff1443bb..49119b95a 100644 --- a/src/couchdb/docker-compose.yaml +++ b/src/couchdb/docker-compose.yaml @@ -7,6 +7,7 @@ services: IOT_DBNAME: chiller WO_DBNAME: workorder VIBRATION_DBNAME: vibration + TRANSFORMER_DBNAME: transformer ports: - "5984:5984" volumes: diff --git a/src/couchdb/sample_data/iot/bulk_docs_transformer.json b/src/couchdb/sample_data/iot/bulk_docs_transformer.json new file mode 100644 index 000000000..871fb1dae --- /dev/null +++ b/src/couchdb/sample_data/iot/bulk_docs_transformer.json @@ -0,0 +1,172 @@ +[ + { + "asset_id": "Transformer 1", + "timestamp": "2024-01-15T00:00:00.000000", + "hydrogen": 2845, + "oxygen": 5860, + "nitrogen": 27842, + "methane": 7406, + "co": 32, + "co2": 1344, + "ethylene": 16684, + "ethane": 5467, + "acetylene": 7, + "dbds": 19, + "power_factor": 1, + "interfacial_v": 45, + "dielectric_rigidity": 55, + "water_content": 0, + "vl1": 110, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 105, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 80, + "oti": 85, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer 1", + "timestamp": "2024-01-16T00:00:00.000000", + "hydrogen": 2950, + "oxygen": 5700, + "nitrogen": 28000, + "methane": 7200, + "co": 30, + "co2": 1300, + "ethylene": 16500, + "ethane": 5400, + "acetylene": 6, + "dbds": 18, + "power_factor": 1.2, + "interfacial_v": 44, + "dielectric_rigidity": 53, + "water_content": 1, + "vl1": 112, + "vl2": 114, + "vl3": 109, + "il1": 102, + "il2": 103, + "il3": 96, + "vl12": 226, + "vl23": 221, + "vl31": 219, + "inut": 6, + "rated_mva": 100, + "wti": 82, + "oti": 87, + "ati": 79, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer 1", + "timestamp": "2024-01-17T00:00:00.000000", + "hydrogen": 2800, + "oxygen": 5900, + "nitrogen": 27700, + "methane": 7300, + "co": 35, + "co2": 1350, + "ethylene": 16700, + "ethane": 5500, + "acetylene": 8, + "dbds": 20, + "power_factor": 0.9, + "interfacial_v": 46, + "dielectric_rigidity": 56, + "water_content": 0, + "vl1": 109, + "vl2": 116, + "vl3": 107, + "il1": 101, + "il2": 104, + "il3": 94, + "vl12": 224, + "vl23": 219, + "vl31": 217, + "inut": 5, + "rated_mva": 100, + "wti": 79, + "oti": 84, + "ati": 77, + "oti_a": 1, + "oti_t": 1 + }, + { + "asset_id": "Transformer 1", + "timestamp": "2024-01-18T00:00:00.000000", + "hydrogen": 2900, + "oxygen": 5800, + "nitrogen": 27950, + "methane": 7350, + "co": 33, + "co2": 1325, + "ethylene": 16600, + "ethane": 5450, + "acetylene": 7, + "dbds": 19, + "power_factor": 1.1, + "interfacial_v": 45, + "dielectric_rigidity": 54, + "water_content": 1, + "vl1": 111, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 106, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 81, + "oti": 86, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer 1", + "timestamp": "2024-01-19T00:00:00.000000", + "hydrogen": 2850, + "oxygen": 5850, + "nitrogen": 27850, + "methane": 7400, + "co": 32, + "co2": 1340, + "ethylene": 16650, + "ethane": 5470, + "acetylene": 7, + "dbds": 19, + "power_factor": 1, + "interfacial_v": 45, + "dielectric_rigidity": 55, + "water_content": 0, + "vl1": 110, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 105, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 80, + "oti": 85, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + } +] \ No newline at end of file diff --git a/src/llm/base.py b/src/llm/base.py index a6b085141..bb892dc2d 100644 --- a/src/llm/base.py +++ b/src/llm/base.py @@ -8,34 +8,44 @@ @dataclass(frozen=True) class LLMResult: - """Return type for :meth:`LLMBackend.generate_with_usage`. + """Return type for :meth:`LLMBackend.generate` / :meth:`generate_with_usage`. - ``input_tokens`` / ``output_tokens`` are ``0`` when the backend can't - report usage (e.g. mocks in unit tests). + ``input_tokens`` / ``output_tokens`` / ``total_tokens`` are ``0`` when the + backend can't report usage (e.g. mocks in unit tests). ``total_tokens`` + should reflect the provider total when available; otherwise callers may use + ``input_tokens + output_tokens``. """ - text: str input_tokens: int = 0 output_tokens: int = 0 + total_tokens: int = 0 class LLMBackend(ABC): """Abstract interface for LLM backends.""" @abstractmethod - def generate(self, prompt: str, temperature: float = 0.0) -> str: - """Generate text given a prompt.""" + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> LLMResult: + """Generate text given a prompt; includes usage when the backend provides it.""" ... def generate_with_usage( - self, prompt: str, temperature: float = 0.0 + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, ) -> LLMResult: """Generate text and report token usage. - Default impl delegates to :meth:`generate` and reports zero usage — - backends that can surface counts (e.g. LiteLLM) should override. + Default impl delegates to :meth:`generate` (same fields as usage-aware + backends). """ - return LLMResult(text=self.generate(prompt, temperature)) + return self.generate(prompt, temperature, max_tokens) @property def model_id(self) -> str: diff --git a/src/llm/litellm.py b/src/llm/litellm.py index 85067c7c1..3e12bffde 100644 --- a/src/llm/litellm.py +++ b/src/llm/litellm.py @@ -14,10 +14,12 @@ from __future__ import annotations +import logging import os from .base import LLMBackend, LLMResult +_log = logging.getLogger(__name__) _WATSONX_PREFIX = "watsonx/" @@ -33,11 +35,19 @@ class LiteLLMBackend(LLMBackend): def __init__(self, model_id: str) -> None: self._model_id = model_id - def generate(self, prompt: str, temperature: float = 0.0) -> str: - return self.generate_with_usage(prompt, temperature).text + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> LLMResult: + return self.generate_with_usage(prompt, temperature, max_tokens) def generate_with_usage( - self, prompt: str, temperature: float = 0.0 + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, ) -> LLMResult: import litellm @@ -45,7 +55,10 @@ def generate_with_usage( "model": self._model_id, "messages": [{"role": "user", "content": prompt}], "temperature": temperature, - "max_tokens": 2048, + "max_tokens": max_tokens or 2048, + # Explicit non-streaming: avoids union defaults and reduces Pydantic + # serializer warnings (Choices vs StreamingChoices) on model_dump. + "stream": False, } if self._model_id.startswith(_WATSONX_PREFIX): @@ -59,8 +72,16 @@ def generate_with_usage( response = litellm.completion(**kwargs) usage = getattr(response, "usage", None) + prompt_n = int(getattr(usage, "prompt_tokens", 0) or 0) + completion_n = int(getattr(usage, "completion_tokens", 0) or 0) + raw_total = getattr(usage, "total_tokens", None) if usage else None + total_n = int(raw_total) if raw_total is not None else prompt_n + completion_n + text = response.choices[0].message.content + if text is None: + text = "" return LLMResult( - text=response.choices[0].message.content, - input_tokens=int(getattr(usage, "prompt_tokens", 0) or 0), - output_tokens=int(getattr(usage, "completion_tokens", 0) or 0), + text=text, + input_tokens=prompt_n, + output_tokens=completion_n, + total_tokens=total_n, ) diff --git a/src/scenarios/README.md b/src/scenarios/README.md new file mode 100644 index 000000000..77ae57f19 --- /dev/null +++ b/src/scenarios/README.md @@ -0,0 +1,206 @@ +# Scenario Generator + +The scenario generator builds AssetOpsBench prompts for an asset class (for example, `"Motor"` or `"Transformer"`). +Output is a JSON array of validated scenarios with canonical lane types: +`iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. + +The pipeline supports two generation modes: + +- `closed_form`: the request is fully answerable from text in the prompt itself. +- `open_form`: the request is grounded in live identifiers discovered from IoT/vibration/FMSR sources. + +## Module-level Architecture + +```mermaid +flowchart LR + I["Input
asset_name + scenario_budget + flags"] + + subgraph P1["(1) Asset Profiling"] + G["Grounding Discovery
IoT + Vibration + FMSR"] + R["Research Retrieval
ArXiv or Semantic Scholar"] + D["Digest Synthesizer
Per-paper then merge"] + AP["AssetProfile Builder"] + G --> AP + R --> D --> AP + end + + subgraph P2["(2) Planning"] + B["Budget Allocator
coverage-aware quotas"] + end + + subgraph P3["(3) Scenario Generation"] + F["Focus Generators
IoT/FMSR/TSFM/WO/Vibration"] + V["Validate + Repair
LLM pass + deterministic checks"] + M["Multiagent Composer"] + N["Negative Track (optional)"] + F --> V --> M --> N + end + + O["Outputs
scenarios.json
negative_scenarios.json (optional)"] + + I --> P1 --> P2 --> P3 --> O +``` + + + +## End-to-end Flow + +1. **Grounding (optional for open-form)** + If `--data-in-couchdb` is set, the system discovers asset instances, sensors, time ranges, and failure mappings. This step defines which concrete identifiers are allowed in open-form prompts. +2. **Evidence and digest** + If `--research-digest PATH` exists, it is loaded directly. Otherwise, bounded academic retrieval runs, then a two-step digest synthesis (per-paper extraction + merge). This keeps profile synthesis evidence-backed. +3. **Asset profile construction** + The profile merges grounded data, research digest content, and tool descriptions. This is the single structured context used by all downstream generators. +4. **Budget allocation** + Scenarios are allocated across focus lanes. `multiagent` is capped at 75% of total budget to preserve lane diversity. +5. **Generation and validation** + Per-focus scenarios are generated, repaired, and deterministically validated for schema, grounding, and uniqueness requirements. +6. **Multiagent composition** + Multiagent scenarios are generated from validated single-focus candidates to build cross-tool workflows. +7. **Negative scenario generation (optional)** + Controlled by `--num-negative-scenarios`; generated strictly after multiagent composition and not counted against `--num-scenarios`. + +## Operational Configuration + +### Required `.env` keys for grounded runs + +When `--data-in-couchdb` is enabled, these environment variables must point to real, populated databases for the selected asset family: + +- `IOT_DBNAME` +- `WO_DBNAME` +- `VIBRATION_DBNAME` + +If these values are missing, empty, or mismatched to the asset class, open-form grounding quality degrades (and falls back to closed-form when IoT inventory is empty). + +### Retriever configuration + +- `--retriever arxiv` requires no additional key. +- `--retriever semantic_scholar` should use `SEMANTIC_SCHOLAR_API_KEY` (optional but recommended for better rate limits). + +### Runtime constants and limits + +- Output root is fixed to `generated/scenarios/` (`DEFAULT_GENERATED_SCENARIOS_DIR`). +- `multiagent` allocation cap is `75%` of requested total (`_multiagent_budget_cap`). +- Validation/retry loops are bounded (`_MAX_SCENARIO_ATTEMPTS`). +- Canonical lane ordering follows `FOCUS_ORDER` in constraints. + +## CLI + +Run from repository root: + +```bash +uv run python -m scenarios.generator "" [options] +``` + +### Key arguments + + +| Flag | Default | Description | +| -------------------------------------- | --------------- | ------------------------------------------------------- | +| `asset_name` | required | Asset class name | +| `--num-scenarios N` | `50` | Number of validated scenarios | +| `--num-negative-scenarios N` | `2` | Number of negative scenarios (`0` disables) | +| `--model-id MODEL` | project default | LiteLLM model override | +| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic backend | +| `--research-digest PATH` | unset | Use precomputed digest, skip retrieval+digest synthesis | +| `--data-in-couchdb` | off | Enable grounded open-form discovery | +| `--show-workflow` | off | Print phase-level progress | +| `--log` | off | Write prompts/artifacts under run `logs/` | + + +### Retrieval notes + +- With `--retriever semantic_scholar`, set `SEMANTIC_SCHOLAR_API_KEY` (env var) for higher rate limits. +- If `--research-digest PATH` is provided and the file is missing, the run exits with an error. + +### Open-form data requirements + +For grounded runs, set `IOT_DBNAME`, `WO_DBNAME`, and `VIBRATION_DBNAME` to live CouchDB databases for the selected asset class. +If IoT inventory is empty, generation falls back to `closed_form`. + +### CLI examples + +```bash +# 1) Closed-form baseline: generate 20 validated scenarios. +uv run python -m scenarios.generator "Transformer" --num-scenarios 20 + +# 2) Grounded open-form run: discover live identifiers from CouchDB and generate 30 scenarios. +uv run python -m scenarios.generator "Motor" --data-in-couchdb --num-scenarios 30 + +# 3) Grounded run with workflow output: print phase-by-phase progress in the console. +uv run python -m scenarios.generator "Transformer" --data-in-couchdb --show-workflow + +# 4) Grounded run with persisted logs: write prompts and artifacts under generated/.../logs/. +uv run python -m scenarios.generator "Transformer" --data-in-couchdb --show-workflow --log + +# 5) Semantic Scholar backend: use Semantic Scholar for academic retrieval. +uv run python -m scenarios.generator "Transformer" --retriever semantic_scholar --data-in-couchdb + +# 6) Reuse a precomputed digest: skip retrieval and digest synthesis. +uv run python -m scenarios.generator "Transformer" --research-digest ./my_digest.md + +# 7) Disable negative track: produce only scenarios.json. +uv run python -m scenarios.generator "Hydrolic Pump" --num-negative-scenarios 0 + +# 8) Evaluation run: generate 80 positive scenarios and 10 negative scenarios. +uv run python -m scenarios.generator "Transformer" --num-scenarios 80 --num-negative-scenarios 10 --data-in-couchdb --log +``` + +## Outputs + +Each run writes: + +- `generated/scenarios/_scenarios_/scenarios.json` +- optional `negative_scenarios.json` in the same directory + +Scenario object schema: + +```json +{ + "id": "transformer_scenario_01", + "type": "fmsr", + "text": "...", + "category": "Diagnostic Assessment", + "characteristic_form": "..." +} +``` + +## Logs (when `--log` is enabled) + +Artifacts are written under: +`generated/scenarios/_scenarios_/logs/` + +Main folders: + +- `01_grounding/` +- `02_retrieval/` (`paper_search`, `paper_digest`) +- `03_asset_profile/` +- `04_budget/` +- `05_generation//` +- `06_negative_generation//` (if enabled) + +## Source Layout + +```text +scenarios/ +├── generator/ # CLI + orchestration +├── grounding.py # IoT/vibration/FMSR grounding + cache +├── retrieval/ # metadata search, PDF handling, digest synthesis +├── constraints/ # validation and repair constraints +├── prompts/ # prompt templates by stage +├── huggingface/ # few-shot corpora +├── local/ # local few-shot supplements +├── failure_mapping/# cached FMSR mappings +├── models.py +├── utils.py +└── text.py +``` + +## Asset-class Mapping Guidance + +For reliable grounded FMSR behavior on new asset classes: + +- add a curated key in `src/servers/fmsr/failure_modes.yaml`, and/or +- add an alias in `src/servers/fmsr/main.py` (`_ASSET_FAILURE_MODE_ALIASES`) + +Without this, the system may rely on less deterministic fallback behavior. \ No newline at end of file diff --git a/src/scenarios/__init__.py b/src/scenarios/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/scenarios/constraints/__init__.py b/src/scenarios/constraints/__init__.py new file mode 100644 index 000000000..3445fe1d7 --- /dev/null +++ b/src/scenarios/constraints/__init__.py @@ -0,0 +1,41 @@ +"""Scenario focus policies and deterministic validation.""" + +from .policies import ( + FOCUS_ORDER, + FocusPolicy, + SCENARIO_POLICIES, + format_accepted_scenarios_for_prompt, + format_categories_for_prompt, + format_forbidden_patterns_for_prompt, + format_hardness_guidance_for_prompt, + format_mode_requirements, + format_requirements_for_prompt, + get_scenario_policy, +) +from .validation import ( + ScenarioValidationFailure, + failure_payload, + validate_negative_scenario, + validate_negative_scenario_batch, + validate_scenario, + validate_scenario_batch, +) + +__all__ = [ + "FOCUS_ORDER", + "FocusPolicy", + "SCENARIO_POLICIES", + "ScenarioValidationFailure", + "failure_payload", + "format_accepted_scenarios_for_prompt", + "format_categories_for_prompt", + "format_forbidden_patterns_for_prompt", + "format_hardness_guidance_for_prompt", + "format_mode_requirements", + "format_requirements_for_prompt", + "get_scenario_policy", + "validate_negative_scenario", + "validate_negative_scenario_batch", + "validate_scenario", + "validate_scenario_batch", +] diff --git a/src/scenarios/constraints/policies.py b/src/scenarios/constraints/policies.py new file mode 100644 index 000000000..0ea1bcc17 --- /dev/null +++ b/src/scenarios/constraints/policies.py @@ -0,0 +1,209 @@ +"""Scenario focus policies and prompt-formatting helpers.""" + +from __future__ import annotations + +from collections.abc import Iterable +from dataclasses import dataclass +import json + +from ..models import AssetProfile + + +def _format_bullet_list(items: Iterable[str]) -> str: + return "\n".join(f"- {item}" for item in items) + + +FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT = ( + "Do not put MCP tool names, function names, or parenthetical examples like " + '"e.g. get_failure_modes tool" in the scenario text; put those only in characteristic_form.' +) + +FOCUS_ORDER: tuple[str, ...] = ("iot", "fmsr", "tsfm", "wo", "vibration", "multiagent") + + +@dataclass(frozen=True) +class FocusPolicy: + categories: tuple[str, ...] + prompt_requirements: tuple[str, ...] + forbidden_patterns: tuple[str, ...] + hardness_guidance: tuple[str, ...] + + def format_categories(self) -> str: + return _format_bullet_list(self.categories) + + def format_requirements(self) -> str: + return _format_bullet_list(self.prompt_requirements) + + def format_forbidden_patterns(self) -> str: + return _format_bullet_list(self.forbidden_patterns) + + def format_hardness_guidance(self) -> str: + return _format_bullet_list(self.hardness_guidance) + + +SCENARIO_POLICIES: dict[str, FocusPolicy] = { + "iot": FocusPolicy( + categories=("Data Query", "Knowledge Query"), + prompt_requirements=( + "Keep the primary burden on telemetry retrieval, asset discovery, sensor discovery, or historical observations.", + "Supporting FMSR, TSFM, vibration, or WO steps are allowed, but IoT must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid turning a primary IoT scenario into a generic asset essay with no telemetry task.", + ), + hardness_guidance=( + "Make hard IoT scenarios combine telemetry retrieval with at least one follow-up comparison, prioritization, or summary request.", + "Use fallback clauses for missing or conflicting channels, such as asking for an alternate signal or a secondary comparison if a sensor is unavailable.", + ), + ), + "fmsr": FocusPolicy( + categories=("Knowledge Query", "Diagnostic Assessment", "Recommendation"), + prompt_requirements=( + "Keep the primary burden on failure modes, failure-to-sensor reasoning, DGA interpretation, or engineering assessment.", + "Supporting IoT, TSFM, vibration, or WO steps are allowed, but FMSR must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid generic telemetry listing tasks with no failure, reliability, or engineering reasoning.", + ), + hardness_guidance=( + "Make hard FMSR scenarios combine a diagnosis or failure-mode assessment with a ranked explanation, confidence framing, or recommended next check.", + "Use fallback clauses for incomplete evidence, such as asking what to conclude if one reading is missing or two fault signatures disagree.", + ), + ), + "tsfm": FocusPolicy( + categories=( + "Inference Query", + "Anomaly Detection Query", + "Tuning Query", + "Complex Query", + ), + prompt_requirements=( + "Keep the primary burden on time-series forecasting, anomaly detection, model evaluation, or tuning.", + "Supporting IoT, vibration, FMSR, or WO steps are allowed, but TSFM must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid plain asset discovery or failure-list questions with no time-series analysis task.", + ), + hardness_guidance=( + "Make hard TSFM scenarios combine a forecast, anomaly check, or model comparison with at least one decision-oriented follow-up such as escalation, confidence, or threshold interpretation.", + "Use fallback clauses for missing channels, alternate horizons, or alternate baselines when the preferred signal or window is unavailable.", + ), + ), + "wo": FocusPolicy( + categories=("Decision Support", "Prediction", "Knowledge Query"), + prompt_requirements=( + "Keep the primary burden on maintenance planning, alerts, events, work-order analysis, or maintenance decisions.", + "Supporting IoT, FMSR, TSFM, or vibration steps are allowed, but WO must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid plain sensor-list or standalone forecasting tasks with no maintenance decision component.", + ), + hardness_guidance=( + "Make hard WO scenarios combine review of alerts/events/history with a scheduling, bundling, or prioritization decision.", + "Use fallback clauses such as recommending a plan only if no similar corrective work order already exists, otherwise comparing with the existing plan.", + ), + ), + "vibration": FocusPolicy( + categories=( + "Diagnostic Assessment", + "Bearing Analysis", + "Severity Assessment", + "Knowledge Query", + ), + prompt_requirements=( + "Keep the primary burden on vibration diagnostics, spectra, bearing reasoning, or severity assessment.", + "Supporting IoT, FMSR, TSFM, or WO steps are allowed, but vibration must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid generic telemetry prompts that do not require vibration-specific tools or reasoning.", + ), + hardness_guidance=( + "Make hard vibration scenarios combine a spectrum or severity assessment with a likely fault interpretation and an operating/maintenance recommendation.", + "Use fallback clauses for alternate machine context, such as what to do if the RPM, bearing model, or severity zone is uncertain.", + ), + ), + "multiagent": FocusPolicy( + categories=("Knowledge Query", "Workflow Coordination"), + prompt_requirements=( + "Every multiagent scenario should require at least two distinct namespaces from iot, fmsr, tsfm, wo, and vibration.", + "The characteristic_form should mention a realistic coordinated workflow, not just a list of tool calls.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid collapsing multiagent scenarios into a single-focus task.", + ), + hardness_guidance=( + "Make hard multiagent scenarios require at least two distinct intermediate findings before a final decision, with one step informing the next.", + "Use fallback clauses when those findings disagree, such as escalating only if both diagnostics and planning signals point to risk, otherwise recommending additional checks.", + ), + ), +} + + +def get_scenario_policy(focus: str) -> FocusPolicy: + key = focus.lower() + if key not in SCENARIO_POLICIES: + raise KeyError(f"Unknown scenario policy for focus '{focus}'") + return SCENARIO_POLICIES[key] + + +def format_categories_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_categories() + + +def format_requirements_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_requirements() + + +def format_forbidden_patterns_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_forbidden_patterns() + + +def format_hardness_guidance_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_hardness_guidance() + + +def format_accepted_scenarios_for_prompt( + scenarios: Iterable[dict], limit: int = 12 +) -> str: + texts: list[str] = [] + for scenario in scenarios: + text = str(scenario.get("text", "")).strip() + if text: + texts.append(text) + if len(texts) >= limit: + break + return json.dumps(texts, indent=2) if texts else "[]" + + +def format_mode_requirements( + profile: AssetProfile, + focus: str, + generation_mode: str, +) -> str: + if generation_mode == "open_form": + asset_ids = profile.grounded_asset_ids(focus) + sensors = profile.grounded_sensor_names(focus) + timestamps = profile.grounded_timestamps(focus) + lines = [ + "Use only grounded identifiers from the Asset Profile.", + f"Allowed sites: {', '.join(profile.grounded_sites()) or '(none)'}", + f"Allowed asset ids: {', '.join(asset_ids) or '(none)'}", + f"Allowed sensors: {', '.join(sensors[:20]) or '(none)'}", + f"Allowed timestamps: {', '.join(timestamps[:12]) or '(none)'}", + ] + return _format_bullet_list(lines) + + return _format_bullet_list( + ( + "Make the scenario self-contained. Do not assume hidden live site names, asset ids, sensor names, or timestamps.", + "In the scenario text, list concrete sensor measurements: for each channel, give the sensor name (or clear label), a numeric value, and a unit (e.g. ppm, %, Hz, mm/s, kV). Prefer names that appear under iot_sensors and vibration_sensors in the Asset Profile where applicable.", + 'Use operator-style phrasing such as: "What is the of a with the following sensor readings: , ..."', + "You may still embed rule text, short summaries, or dataset identifiers in the query when the task requires them.", + ) + ) diff --git a/src/scenarios/constraints/validation.py b/src/scenarios/constraints/validation.py new file mode 100644 index 000000000..7dc8da820 --- /dev/null +++ b/src/scenarios/constraints/validation.py @@ -0,0 +1,480 @@ +"""Deterministic scenario validation.""" + +from __future__ import annotations + +from collections.abc import Iterable, Mapping +from dataclasses import dataclass +from datetime import datetime +from difflib import SequenceMatcher +import json +import re + +from ..models import AssetProfile +from ..text import normalize_for_fuzzy_dedup + +_TOOL_PATTERN_TEMPLATE = r"(? dict: + return { + "index": index, + "text": str(self.scenario.get("text", "")), + "category": str(self.scenario.get("category", "")), + "reasons": list(self.reasons), + } + + +def failure_payload(failures: list[ScenarioValidationFailure]) -> str: + data = [ + failure.to_prompt_dict(index=index) for index, failure in enumerate(failures) + ] + return json.dumps(data, indent=2) + + +def validate_scenario_batch( + focus: str, + scenarios: list[dict], + accepted_scenarios: Iterable[dict] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> tuple[list[dict], list[ScenarioValidationFailure]]: + prior_texts = [ + str(scenario.get("text", "")) + for scenario in (accepted_scenarios or []) + if str(scenario.get("text", "")).strip() + ] + valid: list[dict] = [] + failures: list[ScenarioValidationFailure] = [] + + for scenario in scenarios: + reasons = validate_scenario( + focus, + scenario, + accepted_texts=prior_texts + [str(item.get("text", "")) for item in valid], + profile=profile, + generation_mode=generation_mode, + tool_names_by_focus=tool_names_by_focus, + ) + if reasons: + failures.append( + ScenarioValidationFailure(scenario=scenario, reasons=tuple(reasons)) + ) + continue + valid.append(scenario) + + return valid, failures + + +def validate_negative_scenario_batch( + focus: str, + scenarios: list[dict], + accepted_scenarios: Iterable[dict] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> tuple[list[dict], list[ScenarioValidationFailure]]: + prior_texts = [ + str(scenario.get("text", "")) + for scenario in (accepted_scenarios or []) + if str(scenario.get("text", "")).strip() + ] + valid: list[dict] = [] + failures: list[ScenarioValidationFailure] = [] + + for scenario in scenarios: + reasons = validate_negative_scenario( + focus, + scenario, + accepted_texts=prior_texts + [str(item.get("text", "")) for item in valid], + profile=profile, + generation_mode=generation_mode, + tool_names_by_focus=tool_names_by_focus, + ) + if reasons: + failures.append( + ScenarioValidationFailure(scenario=scenario, reasons=tuple(reasons)) + ) + continue + valid.append(scenario) + + return valid, failures + + +def _flatten_tool_names( + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> tuple[str, ...]: + if not tool_names_by_focus: + return () + seen: set[str] = set() + ordered: list[str] = [] + for tools in tool_names_by_focus.values(): + for t in tools: + if t and t not in seen: + seen.add(t) + ordered.append(t) + return tuple(ordered) + + +def _validate_text_excludes_tool_names( + text: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + if not tool_names_by_focus: + return [] + all_tools = _flatten_tool_names(tool_names_by_focus) + if not all_tools: + return [] + mentioned = _mentioned_tools(text, all_tools) + if not mentioned: + return [] + return [ + "scenario text must not name MCP tools or API functions " + f"(move tool names to characteristic_form only); found in text: {', '.join(mentioned)}" + ] + + +def validate_scenario( + focus: str, + scenario: dict, + accepted_texts: Iterable[str] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> list[str]: + reasons = _validate_required_fields(scenario) + if reasons: + return reasons + + text = str(scenario["text"]).strip() + characteristic_form = str(scenario["characteristic_form"]).strip() + combined = f"{text}\n{characteristic_form}" + + reasons.extend(_validate_text_excludes_tool_names(text, tool_names_by_focus)) + + if _is_duplicate_text(text, accepted_texts or ()): + reasons.append( + f"text is a duplicate or near-duplicate of an already accepted scenario (threshold {_DUPLICATE_THRESHOLD:.2f})" + ) + + if focus == "multiagent": + reasons.extend( + _validate_multiagent_constraints(characteristic_form, tool_names_by_focus) + ) + else: + reasons.extend( + _validate_primary_focus(focus, characteristic_form, tool_names_by_focus) + ) + + if generation_mode == "open_form": + reasons.extend(_validate_open_form_grounding(focus, combined, profile)) + + return reasons + + +def validate_negative_scenario( + focus: str, + scenario: dict, + accepted_texts: Iterable[str] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> list[str]: + reasons = _validate_required_fields(scenario) + if reasons: + return reasons + + text = str(scenario["text"]).strip() + characteristic_form = str(scenario["characteristic_form"]).strip() + combined = f"{text}\n{characteristic_form}" + + reasons.extend(_validate_text_excludes_tool_names(text, tool_names_by_focus)) + + reasons.extend(_validate_negative_expectation(characteristic_form)) + reasons.extend( + _validate_negative_answerability( + focus, + combined, + profile=profile, + generation_mode=generation_mode, + ) + ) + return reasons + + +def _validate_required_fields(scenario: dict) -> list[str]: + reasons: list[str] = [] + for field in _REQUIRED_TEXT_FIELDS: + value = scenario.get(field) + if not isinstance(value, str) or not value.strip(): + reasons.append(f"field '{field}' must be a non-empty string") + return reasons + + +def _validate_negative_expectation(characteristic_form: str) -> list[str]: + lowered = characteristic_form.lower() + if any(hint in lowered for hint in _NEGATIVE_EXPECTATION_HINTS): + return [] + return [ + "negative scenarios must require an explicit insufficiency/refusal response in characteristic_form" + ] + + +def _validate_primary_focus( + focus: str, + characteristic_form: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + focus_tools = ( + tuple(tool_names_by_focus.get(focus, ())) if tool_names_by_focus else () + ) + if not focus_tools: + return [] + if _mentioned_tools(characteristic_form, focus_tools): + return [] + return [ + f"{focus} scenarios must explicitly mention at least one concrete {focus} tool in characteristic_form: " + + ", ".join(focus_tools) + ] + + +def _validate_multiagent_constraints( + characteristic_form: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + if not tool_names_by_focus: + return [] + + mentioned_focuses = { + focus + for focus, tool_names in tool_names_by_focus.items() + if focus != "multiagent" and _mentioned_tools(characteristic_form, tool_names) + } + if len(mentioned_focuses) >= 2: + return [] + return [ + "multiagent scenarios must reference concrete tools from at least two distinct focuses in characteristic_form" + ] + + +def _validate_open_form_grounding( + focus: str, + combined: str, + profile: AssetProfile | None, +) -> list[str]: + if profile is None: + return ["open-form validation requires an Asset Profile"] + + allowed_identifiers = ( + profile.grounded_sites() + + profile.grounded_asset_ids(focus) + + profile.grounded_sensor_names(focus) + + profile.grounded_timestamps(focus) + ) + if not allowed_identifiers: + return [ + "open-form scenarios require grounded identifiers, but none were available in the profile" + ] + + lowered = combined.lower() + if any( + identifier.lower() in lowered + for identifier in allowed_identifiers + if identifier + ): + return [] + return [ + "open-form scenarios must use grounded site names, asset ids, sensors, or timestamps from the Asset Profile" + ] + + +def _validate_negative_answerability( + focus: str, + combined: str, + *, + profile: AssetProfile | None, + generation_mode: str, +) -> list[str]: + if _has_unsupported_external_dependency(combined): + return [] + if _has_out_of_range_time_reference(combined, profile, focus): + return [] + if _has_unknown_identifier_reference(combined, profile, focus): + return [] + if generation_mode == "closed_form" and _LONG_HORIZON_PATTERN.search(combined): + return [] + return [ + "negative scenario appears answerable; include a concrete unsupported condition such as an unknown identifier, out-of-range time reference, or unavailable external dependency" + ] + + +def _has_unsupported_external_dependency(text: str) -> bool: + lowered = text.lower() + return any(re.search(pattern, lowered) for pattern in _UNSUPPORTED_DEPENDENCY_PATTERNS) + + +def _parse_timestamp(value: str) -> datetime | None: + candidate = value.strip() + if not candidate: + return None + try: + if "T" in candidate: + normalized = candidate.replace("Z", "+00:00") + return datetime.fromisoformat(normalized) + return datetime.fromisoformat(candidate) + except ValueError: + return None + + +def _grounded_time_bounds(profile: AssetProfile | None, focus: str) -> tuple[datetime, datetime] | None: + if profile is None: + return None + parsed = [ + timestamp + for timestamp in ( + _parse_timestamp(value) for value in profile.grounded_timestamps(focus) + ) + if timestamp is not None + ] + if not parsed: + return None + return min(parsed), max(parsed) + + +def _has_out_of_range_time_reference( + text: str, + profile: AssetProfile | None, + focus: str, +) -> bool: + bounds = _grounded_time_bounds(profile, focus) + if bounds is None: + return False + start, end = bounds + for raw in _ISO_TIMESTAMP_PATTERN.findall(text): + parsed = _parse_timestamp(raw) + if parsed is None: + continue + if parsed < start or parsed > end: + return True + for raw_year in _YEAR_PATTERN.findall(text): + year = int(raw_year) + if year < start.year or year > end.year: + return True + return False + + +def _extract_identifier_mentions(text: str) -> list[str]: + mentions: list[str] = [] + for pattern in _EXPLICIT_IDENTIFIER_PATTERNS: + for match in pattern.finditer(text): + mentions.append(match.group(1).strip(" ,.;:!?")) + mentions.extend(_ASSET_TOKEN_PATTERN.findall(text)) + deduped: list[str] = [] + seen: set[str] = set() + for mention in mentions: + lowered = mention.lower() + if lowered in seen: + continue + seen.add(lowered) + deduped.append(mention) + return deduped + + +def _has_unknown_identifier_reference( + text: str, + profile: AssetProfile | None, + focus: str, +) -> bool: + if profile is None: + return False + allowed = { + identifier.lower() + for identifier in ( + profile.grounded_sites() + + profile.grounded_asset_ids(focus) + + profile.grounded_sensor_names(focus) + ) + if identifier + } + if not allowed: + return False + for mention in _extract_identifier_mentions(text): + lowered = mention.lower() + if lowered in allowed: + continue + if any(char.isdigit() for char in mention) or "site " in text.lower(): + return True + return False + + +def _is_duplicate_text(text: str, accepted_texts: Iterable[str]) -> bool: + normalized = normalize_for_fuzzy_dedup(text) + if not normalized: + return False + for accepted in accepted_texts: + accepted_normalized = normalize_for_fuzzy_dedup(accepted) + if not accepted_normalized: + continue + if ( + SequenceMatcher(None, normalized, accepted_normalized).ratio() + >= _DUPLICATE_THRESHOLD + ): + return True + return False + + +def _mentioned_tools(text: str, tools: Iterable[str]) -> list[str]: + lowered = text.lower() + hits: list[str] = [] + for tool in tools: + pattern = _TOOL_PATTERN_TEMPLATE.format(tool=re.escape(tool.lower())) + if re.search(pattern, lowered): + hits.append(tool) + return hits diff --git a/src/scenarios/failure_mapping/.gitkeep b/src/scenarios/failure_mapping/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/scenarios/failure_mapping/transformer.json b/src/scenarios/failure_mapping/transformer.json new file mode 100644 index 000000000..e3aed2dee --- /dev/null +++ b/src/scenarios/failure_mapping/transformer.json @@ -0,0 +1,556 @@ +{ + "asset_name": "Transformer", + "failure_modes": [ + "Partial Discharge in Oil", + "Thermal Fault \u2014 Oil Overheating", + "Thermal Fault \u2014 Core/Winding", + "Low-Energy Arcing (Sparking)", + "High-Energy Arcing", + "Tap Changer Mechanical Wear", + "Oil Contamination / Moisture Ingress", + "Cellulose Insulation Ageing", + "Oil Dielectric Degradation" + ], + "fm2sensor": { + "Cellulose Insulation Ageing": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il2", + "interfacial_v", + "inut", + "oti", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl2", + "water_content", + "wti" + ], + "High-Energy Arcing": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ], + "Low-Energy Arcing (Sparking)": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl2", + "vl3", + "vl31", + "wti" + ], + "Oil Contamination / Moisture Ingress": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Oil Dielectric Degradation": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Partial Discharge in Oil": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Tap Changer Mechanical Wear": [ + "ati", + "co", + "dbds", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ], + "Thermal Fault \u2014 Core/Winding": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Thermal Fault \u2014 Oil Overheating": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ] + }, + "sensor2fm": { + "acetylene": [ + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "ati": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "co": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "dbds": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "dielectric_rigidity": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "ethane": [ + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil" + ], + "ethylene": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "hydrogen": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il1": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il2": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il3": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "interfacial_v": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "inut": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "methane": [ + "Oil Contamination / Moisture Ingress", + "Partial Discharge in Oil" + ], + "nitrogen": [ + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding" + ], + "oti": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oti_a": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oti_t": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oxygen": [ + "Cellulose Insulation Ageing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil" + ], + "power_factor": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding" + ], + "rated_mva": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl1": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl12": [ + "High-Energy Arcing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl2": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl23": [ + "High-Energy Arcing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl3": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl31": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "water_content": [ + "Cellulose Insulation Ageing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding" + ], + "wti": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ] + }, + "sensors": [ + "acetylene", + "ati", + "co", + "co2", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ] +} \ No newline at end of file diff --git a/src/scenarios/generator/__init__.py b/src/scenarios/generator/__init__.py new file mode 100644 index 000000000..7adcf7f2d --- /dev/null +++ b/src/scenarios/generator/__init__.py @@ -0,0 +1,17 @@ +"""Scenario generation: orchestration, validation loop, and CLI (`python -m scenarios.generator`).""" + +from .agent import ScenarioGeneratorAgent +from .cli import main +from .prompt_helpers import ( + DEFAULT_GENERATED_SCENARIOS_DIR, + default_scenario_output_path, + negative_scenario_output_path, +) + +__all__ = [ + "DEFAULT_GENERATED_SCENARIOS_DIR", + "ScenarioGeneratorAgent", + "default_scenario_output_path", + "negative_scenario_output_path", + "main", +] diff --git a/src/scenarios/generator/__main__.py b/src/scenarios/generator/__main__.py new file mode 100644 index 000000000..9ae637f13 --- /dev/null +++ b/src/scenarios/generator/__main__.py @@ -0,0 +1,4 @@ +from .cli import main + +if __name__ == "__main__": + main() diff --git a/src/scenarios/generator/agent.py b/src/scenarios/generator/agent.py new file mode 100644 index 000000000..0104e7d00 --- /dev/null +++ b/src/scenarios/generator/agent.py @@ -0,0 +1,1017 @@ +"""Scenario generation orchestration and validation loop.""" + +from __future__ import annotations + +import json +import logging +from pathlib import Path + +from agent.cli import _DEFAULT_MODEL +from agent.plan_execute.executor import Executor +from llm.litellm import LiteLLMBackend + +from ..constraints import ( + FOCUS_ORDER, + ScenarioValidationFailure, + failure_payload, + format_accepted_scenarios_for_prompt, + format_categories_for_prompt, + format_forbidden_patterns_for_prompt, + format_hardness_guidance_for_prompt, + format_mode_requirements, + format_requirements_for_prompt, + validate_negative_scenario_batch, + validate_scenario_batch, +) +from ..grounding import discover_grounding +from ..models import ( + AssetProfile, + EvidenceCandidate, + GroundingBundle, + KeyDescription, + RetrieverMode, + Scenario, + ScenarioGenerationResult, + ScenarioBudget, + SensorNameDescription, +) +from ..prompts import ( + BUDGET_ALLOCATOR_PROMPT, + MULTIAGENT_COMBINER_PROMPT, + NEGATIVE_SCENARIO_GENERATOR_PROMPT, + NEGATIVE_VALIDATE_REPAIR_PROMPT, + PROFILE_BUILDER_PROMPT, + SCENARIO_GENERATOR_PROMPT, + VALIDATE_REPAIR_PROMPT, +) +from ..retrieval import retrieve_asset_evidence, synthesize_research_digest +from ..text import slugify_asset_name, truncate_title_one_line +from ..utils import fetch_hf_fewshot, parse_llm_json +from .prompt_helpers import ( + _BUDGET_MAX_TOKENS, + _MULTIAGENT_MAX_TOKENS, + _MAX_FEWSHOT_EXAMPLES, + _MAX_SCENARIO_ATTEMPTS, + _PROFILE_MAX_TOKENS, + _SCENARIO_LLM_MAX_TOKENS, + _asset_profile_json, + _few_shot_examples_section, + _grounding_summary_for_prompt, + hard_scenario_target, + _invert_failure_mapping, + _label_desc_dict_from_list, + _multiagent_budget_cap, + _normalize_failure_sensor_mapping, + _normalize_string_list, + _ordered_descriptions, + _print_live_step, + _print_section, + _print_step, + _redact_logged_prompt, + _require_nonempty_list, + _require_nonempty_str, + _quiet_litellm_logging, + _tool_summary_for_prompt, + _validation_tool_names_by_focus, +) + +_log = logging.getLogger(__name__) + + +def _scenario_from_llm_row( + row: dict, + *, + scenario_type: str, + generation_mode: str, +) -> Scenario: + payload = dict(row) + payload.pop("type", None) + return Scenario(**payload, type=scenario_type, generation_mode=generation_mode) + + +class ScenarioGeneratorAgent: + def __init__( + self, + model_id: str = _DEFAULT_MODEL, + show_workflow: bool = False, + log_dir: str | None = None, + *, + retriever: RetrieverMode = "arxiv", + research_digest_path: str | None = None, + ) -> None: + _quiet_litellm_logging() + self.llm = LiteLLMBackend(model_id=model_id) + self.executor = Executor(llm=self.llm) + self.show_workflow = show_workflow + self.log_dir = log_dir + self.retriever = retriever + self.research_digest_path = research_digest_path + self._log_steps_by_subdir: dict[str, int] = {} + + def _log_path(self, name: str, *, step: int) -> Path: + if not self.log_dir: + raise RuntimeError("log_dir must be configured before writing logs") + relative = Path(name) + suffix = relative.suffix or ".txt" + stem = relative.stem if relative.suffix else relative.name + filename = f"{step:02d}_{stem}{suffix}" + return Path(self.log_dir) / relative.parent / filename + + def _write_log(self, name: str, content: str) -> None: + if not self.log_dir: + return + relative = Path(name) + dir_key = relative.parent.as_posix() if relative.parent != Path(".") else "" + step = self._log_steps_by_subdir.get(dir_key, 0) + 1 + path = self._log_path(name, step=step) + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w") as handle: + handle.write(content) + self._log_steps_by_subdir[dir_key] = step + + def _write_json_log(self, name: str, payload: object) -> None: + log_name = name if name.endswith(".json") else f"{name}.json" + self._write_log(log_name, json.dumps(payload, indent=2)) + + async def run( + self, + asset_name: str, + num_scenarios: int = 50, + data_in_couchdb: bool = False, + num_negative_scenarios: int = 2, + ) -> ScenarioGenerationResult: + asset_name = asset_name.strip() + if not asset_name: + raise ValueError("Asset class name is empty after stripping whitespace.") + _log.debug("Starting scenario generation for asset: %s", asset_name) + server_desc = await self.executor.get_server_descriptions() + + if self.show_workflow: + _print_section("Phase 1: Asset Profile Construction") + asset_profile = await self.build_asset_profile( + asset_name=asset_name, + server_desc=server_desc, + requested_open_form=data_in_couchdb, + ) + + if self.show_workflow: + _print_section("Phase 2: Scenario Budget Allocation") + budget = await self.allocate_budget(asset_profile, total=num_scenarios) + + if self.show_workflow: + _print_section("Phase 3: Focused Generation & Validation") + + all_scenarios: list[Scenario] = [] + validation_tool_names = _validation_tool_names_by_focus(server_desc) + for focus, count in budget.allocation.items(): + if count == 0 or focus == "multiagent": + continue + + if self.show_workflow: + _print_section(f"{focus.upper()} Focus") + _print_step( + f"generate_{focus}", + f"Generating {count} {focus} scenarios in {asset_profile.generation_mode}", + ) + + valid_scenarios = self.generate_validated_scenarios( + focus=focus, + count=count, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + for scenario_data in valid_scenarios: + scenario_data["id"] = f"{slugify_asset_name(asset_name)}_scenario_{len(all_scenarios)+1:02d}" + all_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type=focus, + generation_mode=asset_profile.generation_mode, + ) + ) + + if self.show_workflow: + _print_step( + f"validate_{focus}", + f"Validated {len(valid_scenarios)} {focus} scenarios", + ) + + multiagent_count = budget.allocation.get("multiagent", 0) + if multiagent_count > 0: + if self.show_workflow: + _print_section("Phase 4: Multi-Agent Scenario Construction") + valid_multi = self.generate_validated_scenarios( + focus="multiagent", + count=multiagent_count, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + single_agents=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + for scenario_data in valid_multi: + scenario_data["id"] = f"{slugify_asset_name(asset_name)}_scenario_{len(all_scenarios)+1:02d}" + all_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type="multiagent", + generation_mode=asset_profile.generation_mode, + ) + ) + + if self.show_workflow: + _print_step("validate_multiagent", f"Validated {len(valid_multi)} multiagent scenarios") + + if self.show_workflow: + _print_section("Summary") + print( + f"Successfully generated {len(all_scenarios)} total scenarios for asset: {asset_name} " + f"in {asset_profile.generation_mode} mode.\n" + ) + + negative_scenarios: list[Scenario] = [] + if num_negative_scenarios > 0: + if self.show_workflow: + _print_section("Phase 5: Negative Scenario Construction") + negative_scenarios = self.generate_negative_scenarios( + count=num_negative_scenarios, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + return ScenarioGenerationResult( + scenarios=all_scenarios, + negative_scenarios=negative_scenarios, + ) + + async def build_asset_profile( + self, + asset_name: str, + server_desc: dict, + requested_open_form: bool = False, + ) -> AssetProfile: + asset_name = asset_name.strip() + if not asset_name: + raise ValueError("Asset class name is empty after stripping whitespace.") + if self.show_workflow: + _print_step( + "grounding_start", + f"Starting grounded discovery for {asset_name}...", + details="Inspecting IoT coverage, vibration coverage, and bounded FMSR grounding.", + ) + grounding = discover_grounding(asset_name, requested_open_form=requested_open_form) + self._write_json_log("01_grounding/discovery.json", grounding.model_dump()) + generation_mode = "open_form" if grounding.open_form_eligible else "closed_form" + + if self.show_workflow: + details = ( + f"Requested open form: {requested_open_form}\n" + f"Resolved generation mode: {generation_mode}\n" + f"Grounded instances: {len(grounding.asset_instances)}\n" + ) + _print_step("grounding", "Grounded discovery complete", details=details) + + preload = self.research_digest_path + if preload: + digest_path = Path(preload) + if not digest_path.is_file(): + raise FileNotFoundError( + f"Research digest file not found: {digest_path}. " + "Omit --research-digest or provide a valid path to skip retrieval." + ) + research_digest = digest_path.read_text(encoding="utf-8") + if self.log_dir: + self._write_log( + "02_retrieval/paper_digest/merged.txt", + research_digest.strip(), + ) + if self.show_workflow: + _print_step( + "research_digest", + "Loaded precomputed research digest (retrieval and digest LLM steps skipped)", + details=str(digest_path.resolve()), + ) + else: + if self.show_workflow: + _print_step( + "researcher_queries", + f"Planning bounded academic literature retrieval for {asset_name}...", + ) + + on_pdf_workflow = None + on_academic_query = None + if self.show_workflow: + _pdf_ok_logged: set[str] = set() + + def _on_academic_query(query: str, n_results: int) -> None: + _print_step( + "academic_query", + f"Query: {query!r}", + details=f"Results: {n_results} paper(s) from metadata search", + ) + + def _on_pdf_workflow( + candidate: EvidenceCandidate, phase: str, outcome: str + ) -> None: + title = truncate_title_one_line(candidate.title) + pid = candidate.paper_id + if outcome == "ok": + if pid in _pdf_ok_logged: + return + _pdf_ok_logged.add(pid) + _print_step( + "pdf_fetch", + f'Paper "{title}" — PDF text loaded', + details=f"paper_id={pid}\nphase={phase}", + ) + return + label = { + "no_pdf_url": "No PDF URL (no open-access direct link resolved from metadata)", + "fetch_failed": "PDF fetch failed or URL not a usable PDF stream", + "empty_text": "PDF downloaded but extractable text is empty", + }.get(outcome, outcome) + _print_step( + "pdf_fetch", + f'Paper "{title}" — {label}', + details=f"paper_id={pid}\nphase={phase}\noutcome={outcome}", + ) + + on_pdf_workflow = _on_pdf_workflow + on_academic_query = _on_academic_query + + evidence_bundle = retrieve_asset_evidence( + asset_name=asset_name, + server_desc=server_desc, + llm=self.llm, + log_writer=self._write_log, + retriever=self.retriever, + on_pdf_workflow=on_pdf_workflow, + on_academic_query=on_academic_query, + ) + + if self.show_workflow: + top_titles = "\n".join( + f" - {candidate.title} (judge_score={candidate.judge_score}/10)" + for candidate in evidence_bundle.candidates[:3] + ) or " - No ranked candidates" + details = ( + f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" + f"Queries:\n" + + "\n".join(f" - {query}" for query in evidence_bundle.query_history) + + "\nTop Evidence:\n" + + top_titles + ) + _print_step( + "evidence_retrieval", + "Academic search engine evidence retrieval complete", + details=details, + ) + + research_digest = synthesize_research_digest( + evidence_bundle, + self.llm, + retriever=self.retriever, + log_writer=self._write_log, + on_pdf_workflow=on_pdf_workflow, + ) + if self.show_workflow: + _print_step( + "research_digest", + "Research digest synthesis complete (per-paper extraction + merge)", + ) + + prompt = PROFILE_BUILDER_PROMPT.format( + asset_name=asset_name, + generation_mode=generation_mode, + grounding_summary_json=_grounding_summary_for_prompt(grounding), + research_digest=research_digest, + tool_descriptions=_tool_summary_for_prompt(server_desc), + ) + self._write_log("03_asset_profile/prompt.txt", prompt) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_PROFILE_MAX_TOKENS + ) + parsed, parse_err = parse_llm_json(response.text) + if not parsed or not isinstance(parsed, dict): + raise RuntimeError( + f"Failed to parse asset profile JSON from LLM: {parse_err or 'response is not a JSON object'}" + ) + self._write_json_log("03_asset_profile/response.json", parsed) + + profile = self._merge_profile(parsed, grounding, generation_mode) + self._write_json_log("03_asset_profile/final_asset_profile.json", profile.model_dump()) + if self.show_workflow: + details: str | None = None + if self.log_dir: + details = "Full profile JSON is saved under 03_asset_profile/ in the log directory." + _print_step( + "build_profile", + f"Successfully generated Asset Profile for '{asset_name}'.", + details=details, + ) + return profile + + def _merge_profile( + self, + parsed_profile: dict, + grounding: GroundingBundle, + generation_mode: str, + ) -> AssetProfile: + merged = dict(parsed_profile) + merged["asset_name"] = grounding.asset_name + merged["generation_mode"] = generation_mode + merged["asset_instances"] = [instance.model_dump() for instance in grounding.asset_instances] + + merged_failure_mapping = _normalize_failure_sensor_mapping(merged.get("failure_sensor_mapping", {})) + if grounding.failure_sensor_mapping: + merged["failure_sensor_mapping"] = grounding.failure_sensor_mapping + merged_failure_mapping = grounding.failure_sensor_mapping + elif merged_failure_mapping: + merged["failure_sensor_mapping"] = merged_failure_mapping + else: + merged["failure_sensor_mapping"] = {} + + grounded_failure_modes = _normalize_string_list(grounding.failure_modes) + from_list_fm = _label_desc_dict_from_list( + merged.get("failure_modes"), + primary="key", + alternate="name", + ) + all_failure_mode_keys = list( + dict.fromkeys( + [ + *grounded_failure_modes, + *merged_failure_mapping.keys(), + *from_list_fm.keys(), + ] + ) + ) + + if grounding.sensor_failure_mapping: + merged["sensor_failure_mapping"] = grounding.sensor_failure_mapping + elif merged_failure_mapping: + merged["sensor_failure_mapping"] = _invert_failure_mapping(merged_failure_mapping) + else: + merged["sensor_failure_mapping"] = {} + + merged["description"] = _require_nonempty_str(merged.get("description"), field="description") + + req_iot = sorted(dict.fromkeys(str(s).strip() for s in grounding.iot_sensors if str(s).strip())) + req_vib = sorted(dict.fromkeys(str(s).strip() for s in grounding.vibration_sensors if str(s).strip())) + + iot_from_llm = _label_desc_dict_from_list(merged.get("iot_sensors"), primary="name", alternate="key") + vib_from_llm = _label_desc_dict_from_list(merged.get("vibration_sensors"), primary="name", alternate="key") + + merged["iot_sensors"] = _ordered_descriptions( + iot_from_llm, + req_iot, + field="iot_sensors", + build=lambda n, d: SensorNameDescription(name=n, description=d), + sort_when_ordered_empty=True, + ) + merged["vibration_sensors"] = _ordered_descriptions( + vib_from_llm, + req_vib, + field="vibration_sensors", + build=lambda n, d: SensorNameDescription(name=n, description=d), + sort_when_ordered_empty=True, + ) + + if not all_failure_mode_keys: + merged["failure_modes"] = [ + KeyDescription(key=k, description=from_list_fm[k]) + for k in sorted(from_list_fm.keys()) + ] + else: + merged["failure_modes"] = _ordered_descriptions( + from_list_fm, + all_failure_mode_keys, + field="failure_modes", + build=lambda k, d: KeyDescription(key=k, description=d), + ) + + if not isinstance(merged.get("relevant_tools"), dict): + raise ValueError("Asset profile field 'relevant_tools' must be an object keyed by focus") + tool_focuses = tuple(f for f in FOCUS_ORDER if f != "multiagent") + normalized_relevant: dict[str, list] = {} + for focus in tool_focuses: + tools = merged["relevant_tools"].get(focus) + if tools is None: + normalized_relevant[focus] = [] + continue + if not isinstance(tools, list): + raise ValueError( + f"Asset profile field 'relevant_tools.{focus}' must be a list " + f"(use [] when this subagent is not applicable)" + ) + normalized_relevant[focus] = tools + merged["relevant_tools"] = normalized_relevant + merged["operator_tasks"] = _require_nonempty_list(merged.get("operator_tasks"), field="operator_tasks") + merged["manager_tasks"] = _require_nonempty_list(merged.get("manager_tasks"), field="manager_tasks") + return AssetProfile(**merged) + + async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: + prompt = BUDGET_ALLOCATOR_PROMPT.format( + total_scenarios=total, + asset_profile_json=profile.model_dump_json(indent=2), + ) + self._write_log("04_budget/prompt.txt", prompt) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_BUDGET_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + if not parsed or not isinstance(parsed, dict): + parsed = {} + self._write_json_log("04_budget/response.json", parsed) + + allocation = self._normalize_allocation(parsed.get("allocation", {}), total) + budget = ScenarioBudget( + total_scenarios=total, + allocation=allocation, + reasoning=str(parsed.get("reasoning", "")).strip(), + ) + + if self.show_workflow: + details = f"Reasoning: {budget.reasoning or '(not provided)'}\n\nAllocation:\n" + details += "\n".join(f" - {focus}: {count}" for focus, count in budget.allocation.items()) + _print_step("allocate_budget", f"Successfully allocated {total} scenarios across focuses.", details=details) + + return budget + + def _normalize_allocation(self, raw_allocation: dict, total: int) -> dict[str, int]: + allocation = { + focus: max(0, int(raw_allocation.get(focus, 0) or 0)) + for focus in FOCUS_ORDER + } + if not any(allocation.values()): + raise RuntimeError("Budget allocator returned an empty allocation; refusing to default.") + + allocation["multiagent"] = min( + allocation["multiagent"], _multiagent_budget_cap(total) + ) + current_total = sum(allocation.values()) + if current_total == 0: + raise RuntimeError("Budget allocator produced a zero-sum allocation; refusing to default.") + + if current_total > total: + overflow = current_total - total + for focus in ("multiagent", "wo", "vibration", "tsfm", "fmsr", "iot"): + if overflow <= 0: + break + reducible = min(allocation[focus], overflow) + allocation[focus] -= reducible + overflow -= reducible + elif current_total < total: + deficit = total - current_total + allowed = list(FOCUS_ORDER) + while deficit > 0 and allowed: + for focus in allowed: + if deficit <= 0: + break + if focus == "multiagent" and allocation["multiagent"] >= _multiagent_budget_cap( + total + ): + continue + allocation[focus] += 1 + deficit -= 1 + return allocation + + def generate_single_focus_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + few_shots = fetch_hf_fewshot( + focus=focus, + max_examples=_MAX_FEWSHOT_EXAMPLES, + ) + profile_json = _asset_profile_json(profile) + prompt = SCENARIO_GENERATOR_PROMPT.format( + count=count, + subagent_name=focus, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + tool_definitions=json.dumps(server_desc.get(focus, {}), indent=2), + few_shot_examples_section=_few_shot_examples_section(few_shots), + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + hard_target_count=hard_scenario_target(count), + hardness_guidance=format_hardness_guidance_for_prompt(focus), + forbidden_patterns=format_forbidden_patterns_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + ) + self._write_log( + f"05_generation/{focus}/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_SCENARIO_LLM_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + if isinstance(parsed, list): + self._write_json_log(f"05_generation/{focus}/generation_response.json", parsed) + return parsed + self._write_json_log(f"05_generation/{focus}/generation_response.json", []) + return [] + + def validate_and_repair( + self, + focus: str, + scenarios: list[dict], + profile: AssetProfile, + accepted_scenarios: list[dict] | None = None, + failures: list[ScenarioValidationFailure] | None = None, + *, + negative: bool = False, + ) -> list[dict]: + if not scenarios: + return [] + + profile_json = _asset_profile_json(profile) + prompt_template = NEGATIVE_VALIDATE_REPAIR_PROMPT if negative else VALIDATE_REPAIR_PROMPT + prompt = prompt_template.format( + subagent_name=focus, + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + hard_target_count=hard_scenario_target(len(scenarios)), + batch_size=len(scenarios), + hardness_guidance=format_hardness_guidance_for_prompt(focus), + forbidden_patterns=format_forbidden_patterns_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + asset_profile_json=profile_json, + input_scenarios_json=json.dumps(scenarios, indent=2), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + validation_failures_json=failure_payload(failures or []), + ) + self._write_log( + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_SCENARIO_LLM_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + if isinstance(parsed, list): + repaired = parsed[: len(scenarios)] + self._write_json_log( + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_response.json", + repaired, + ) + return repaired + self._write_json_log( + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_response.json", + scenarios, + ) + return scenarios + + def construct_multiagent_scenarios( + self, + count: int, + single_agents: list[dict], + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + profile_json = _asset_profile_json(profile) + prompt = MULTIAGENT_COMBINER_PROMPT.format( + count=count, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + mcp_function_definitions=json.dumps(server_desc, indent=2), + single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + hard_target_count=hard_scenario_target(count), + hardness_guidance=format_hardness_guidance_for_prompt("multiagent"), + mode_requirements=format_mode_requirements(profile, "multiagent", profile.generation_mode), + forbidden_patterns=format_forbidden_patterns_for_prompt("multiagent"), + ) + self._write_log( + "05_generation/multiagent/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_MULTIAGENT_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + if isinstance(parsed, list): + self._write_json_log("05_generation/multiagent/generation_response.json", parsed) + return parsed + self._write_json_log("05_generation/multiagent/generation_response.json", []) + return [] + + def generate_validated_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + single_agents: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[dict]: + accepted_scenarios = list(accepted_scenarios or []) + valid_batch: list[dict] = [] + failure_notes: list[str] = [] + + for attempt in range(1, _MAX_SCENARIO_ATTEMPTS + 1): + remaining = count - len(valid_batch) + if remaining <= 0: + break + + baseline = accepted_scenarios + valid_batch + generated = self._generate_attempt_batch( + focus=focus, + count=remaining, + profile=profile, + server_desc=server_desc, + accepted_scenarios=baseline, + single_agents=single_agents, + ) + if not generated: + failure_notes.append(f"attempt {attempt}: generator returned no parseable scenarios") + continue + + generated = self.validate_and_repair( + focus=focus, + scenarios=generated, + profile=profile, + accepted_scenarios=baseline, + ) + valid_now, failures = validate_scenario_batch( + focus=focus, + scenarios=generated, + accepted_scenarios=baseline, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(valid_now) + + if failures: + self._write_log( + f"05_generation/{focus}/deterministic_failures_attempt_{attempt:02d}.json", + failure_payload(failures), + ) + if self.show_workflow: + _print_live_step( + f"repair_{focus}", + f"Repairing {len(failures)} scenario(s)", + ) + repaired_invalids = self.validate_and_repair( + focus=focus, + scenarios=[failure.scenario for failure in failures], + profile=profile, + accepted_scenarios=accepted_scenarios + valid_batch, + failures=failures, + ) + repaired_valid, remaining_failures = validate_scenario_batch( + focus=focus, + scenarios=repaired_invalids, + accepted_scenarios=accepted_scenarios + valid_batch, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(repaired_valid) + if remaining_failures: + failure_notes.append( + f"attempt {attempt}: {len(remaining_failures)} scenario(s) still invalid after repair" + ) + self._write_log( + f"05_generation/{focus}/remaining_failures_attempt_{attempt:02d}.json", + failure_payload(remaining_failures), + ) + + if len(valid_batch) < count: + shortage = count - len(valid_batch) + summary = "; ".join(failure_notes) if failure_notes else "no detailed failure summary available" + raise RuntimeError( + f"Failed to generate {count} valid {focus} scenarios after {_MAX_SCENARIO_ATTEMPTS} attempts. " + f"Still missing {shortage}. Details: {summary}" + ) + final_for_focus = valid_batch[:count] + self._write_json_log(f"05_generation/{focus}/final_scenarios.json", final_for_focus) + return final_for_focus + + def generate_negative_focus_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + profile_json = _asset_profile_json(profile) + prompt = NEGATIVE_SCENARIO_GENERATOR_PROMPT.format( + count=count, + subagent_name=focus, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + tool_definitions=json.dumps(server_desc.get(focus, {}), indent=2), + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + ) + self._write_log( + f"06_negative_generation/{focus}/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate_with_usage( + prompt, max_tokens=_SCENARIO_LLM_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + if isinstance(parsed, list): + self._write_json_log(f"06_negative_generation/{focus}/generation_response.json", parsed) + return parsed + self._write_json_log(f"06_negative_generation/{focus}/generation_response.json", []) + return [] + + def generate_validated_negative_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[dict]: + accepted_scenarios = list(accepted_scenarios or []) + valid_batch: list[dict] = [] + failure_notes: list[str] = [] + + for attempt in range(1, _MAX_SCENARIO_ATTEMPTS + 1): + remaining = count - len(valid_batch) + if remaining <= 0: + break + + baseline = accepted_scenarios + valid_batch + generated = self.generate_negative_focus_scenarios( + focus=focus, + count=remaining, + profile=profile, + server_desc=server_desc, + accepted_scenarios=baseline, + ) + if not generated: + failure_notes.append(f"attempt {attempt}: negative generator returned no parseable scenarios") + continue + + generated = self.validate_and_repair( + focus=focus, + scenarios=generated, + profile=profile, + accepted_scenarios=baseline, + negative=True, + ) + valid_now, failures = validate_negative_scenario_batch( + focus=focus, + scenarios=generated, + accepted_scenarios=baseline, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(valid_now) + + if failures: + self._write_log( + f"06_negative_generation/{focus}/deterministic_failures_attempt_{attempt:02d}.json", + failure_payload(failures), + ) + repaired_invalids = self.validate_and_repair( + focus=focus, + scenarios=[failure.scenario for failure in failures], + profile=profile, + accepted_scenarios=accepted_scenarios + valid_batch, + failures=failures, + negative=True, + ) + repaired_valid, remaining_failures = validate_negative_scenario_batch( + focus=focus, + scenarios=repaired_invalids, + accepted_scenarios=accepted_scenarios + valid_batch, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(repaired_valid) + if remaining_failures: + failure_notes.append( + f"attempt {attempt}: {len(remaining_failures)} negative scenario(s) still invalid after repair" + ) + self._write_log( + f"06_negative_generation/{focus}/remaining_failures_attempt_{attempt:02d}.json", + failure_payload(remaining_failures), + ) + + if len(valid_batch) < count: + shortage = count - len(valid_batch) + summary = "; ".join(failure_notes) if failure_notes else "no detailed failure summary available" + raise RuntimeError( + f"Failed to generate {count} negative {focus} scenarios after {_MAX_SCENARIO_ATTEMPTS} attempts. " + f"Still missing {shortage}. Details: {summary}" + ) + final_for_focus = valid_batch[:count] + self._write_json_log(f"06_negative_generation/{focus}/final_scenarios.json", final_for_focus) + return final_for_focus + + def generate_negative_scenarios( + self, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[Scenario]: + accepted_scenarios = list(accepted_scenarios or []) + if count <= 0: + return [] + + focuses = self._negative_focus_order(profile, validation_tool_names) + negative_scenarios: list[Scenario] = [] + for index in range(count): + focus = focuses[index % len(focuses)] + negative_rows = self.generate_validated_negative_scenarios( + focus=focus, + count=1, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios + [scenario.to_dict() for scenario in negative_scenarios], + validation_tool_names=validation_tool_names, + ) + for scenario_data in negative_rows: + scenario_data["id"] = ( + f"{slugify_asset_name(profile.asset_name)}_negative_scenario_{len(negative_scenarios)+1:02d}" + ) + negative_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type=focus, + generation_mode=profile.generation_mode, + ) + ) + + return negative_scenarios + + def _negative_focus_order( + self, + profile: AssetProfile, + validation_tool_names: dict[str, tuple[str, ...]] | None, + ) -> list[str]: + ordered: list[str] = [] + for focus in FOCUS_ORDER: + if focus == "multiagent": + continue + if (validation_tool_names and validation_tool_names.get(focus)) or profile.relevant_tools.get(focus): + ordered.append(focus) + if ordered: + return ordered + return [focus for focus in FOCUS_ORDER if focus != "multiagent"] + + def _generate_attempt_batch( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict], + single_agents: list[dict] | None = None, + ) -> list[dict]: + if focus == "multiagent": + if single_agents is None: + raise RuntimeError("single_agents are required when generating multiagent scenarios") + return self.construct_multiagent_scenarios( + count=count, + single_agents=single_agents, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios, + ) + + return self.generate_single_focus_scenarios( + focus=focus, + count=count, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios, + ) diff --git a/src/scenarios/generator/cli.py b/src/scenarios/generator/cli.py new file mode 100644 index 000000000..c80b427a6 --- /dev/null +++ b/src/scenarios/generator/cli.py @@ -0,0 +1,140 @@ +"""CLI entry for `python -m scenarios.generator`.""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import logging +import os +import sys + +from dotenv import load_dotenv + +from agent.cli import _DEFAULT_MODEL + +from .agent import ScenarioGeneratorAgent +from .prompt_helpers import default_scenario_output_path, negative_scenario_output_path + + +def main() -> None: + load_dotenv() + + parser = argparse.ArgumentParser(description="Scenario Generator for AssetOpsBench") + parser.add_argument("asset_name", help="Asset class name (for example 'Chiller' or 'Wind Turbine')") + parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") + parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") + parser.add_argument( + "--num-negative-scenarios", + type=int, + default=2, + help="Total number of intentionally unanswerable negative scenarios to generate (0 disables the negative track)", + ) + parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") + parser.add_argument( + "--log", + action="store_true", + help=( + "Write prompts and pipeline artifacts under the run directory (generated/scenarios/.../logs/). " + "Does not change console output; use --show-workflow for step-by-step terminal output." + ), + ) + parser.add_argument( + "--data-in-couchdb", + action="store_true", + help="Use grounded open-form generation when matching live CouchDB-backed asset data is available", + ) + parser.add_argument( + "--retriever", + choices=("arxiv", "semantic_scholar"), + default="arxiv", + help=( + "Optional. Academic search backend for Phase 1 evidence retrieval. " + "Default is arxiv when this flag is omitted." + ), + ) + parser.add_argument( + "--research-digest", + metavar="PATH", + default=None, + help=( + "Optional. Path to a precomputed research digest (Markdown). When set and the file exists, " + "skips academic retrieval and digest LLM steps; loads this text for asset profile construction." + ), + ) + + args = parser.parse_args() + output_path = default_scenario_output_path(args.asset_name) + + # stderr: `--show-workflow` owns the console (`_print_step`); keep root at + # WARNING so `_log.info(...)` from agent/grounding/retrieval never mixes in. + # Without `--show-workflow`, `--data-in-couchdb` raises to INFO so + # `scenarios.grounding` can emit FMSR/discovery progress on stderr. + if args.show_workflow: + level = logging.WARNING + elif args.data_in_couchdb: + level = logging.INFO + else: + level = logging.WARNING + # Imported MCP server modules (e.g. servers.fmsr.main) call basicConfig(WARNING) + # at import time; without force=True, this CLI's basicConfig would be a no-op. + logging.basicConfig( + level=level, + format="%(asctime)s %(levelname)s %(message)s", + force=True, + ) + if level == logging.INFO: + for noisy in ("httpx", "httpcore"): + logging.getLogger(noisy).setLevel(logging.WARNING) + + log_dir = None + if args.log: + log_dir = str(output_path.parent / "logs") + os.makedirs(log_dir, exist_ok=True) + + agent = ScenarioGeneratorAgent( + model_id=args.model_id, + show_workflow=args.show_workflow, + log_dir=log_dir, + retriever=args.retriever, + research_digest_path=args.research_digest, + ) + + try: + generation_result = asyncio.run( + agent.run( + args.asset_name, + num_scenarios=args.num_scenarios, + data_in_couchdb=args.data_in_couchdb, + num_negative_scenarios=args.num_negative_scenarios, + ) + ) + except Exception as exc: # noqa: BLE001 + print(f"\n[FATAL ERROR] {exc}") + sys.exit(1) + + final_scenarios = generation_result.scenarios + negative_scenarios = generation_result.negative_scenarios + + if not final_scenarios: + print("\n[WARNING] No scenarios were successfully generated and validated.") + sys.exit(0) + + output_path.parent.mkdir(parents=True, exist_ok=True) + with output_path.open("w") as handle: + json.dump([scenario.to_dict() for scenario in final_scenarios], handle, indent=2) + + if negative_scenarios: + negative_output_path = negative_scenario_output_path(output_path) + with negative_output_path.open("w") as handle: + json.dump([scenario.to_dict() for scenario in negative_scenarios], handle, indent=2) + + if not args.show_workflow: + suffix = ( + f" and {len(negative_scenarios)} negative scenarios at {negative_scenario_output_path(output_path)}" + if negative_scenarios + else "" + ) + print(f"Success! Generated {len(final_scenarios)} scenarios at {output_path}{suffix}") + else: + print(f"Scenarios saved to {output_path}") diff --git a/src/scenarios/generator/prompt_helpers.py b/src/scenarios/generator/prompt_helpers.py new file mode 100644 index 000000000..3b7cbbba5 --- /dev/null +++ b/src/scenarios/generator/prompt_helpers.py @@ -0,0 +1,259 @@ +"""Prompt construction and normalization helpers for scenario generation.""" + +from __future__ import annotations + +from collections.abc import Callable +from datetime import datetime +import math +import json +import logging +from pathlib import Path +import re +from typing import TypeVar + +from ..constraints import FOCUS_ORDER +from ..models import AssetProfile, GroundingBundle +from ..text import slugify_asset_name + + +def _quiet_litellm_logging() -> None: + for name in ("LiteLLM", "LiteLLM Proxy", "LiteLLM Router"): + logging.getLogger(name).setLevel(logging.WARNING) + + +_MAX_SCENARIO_ATTEMPTS = 4 +_MAX_FEWSHOT_EXAMPLES = 6 + + +def _multiagent_budget_cap(total: int) -> int: + if total <= 1: + return total + return (total * 3) // 4 + + +_PROFILE_MAX_TOKENS = 4096 +_MULTIAGENT_MAX_TOKENS = 4096 +_BUDGET_MAX_TOKENS = 4096 +_SCENARIO_LLM_MAX_TOKENS = 8192 +DEFAULT_GENERATED_SCENARIOS_DIR = Path("generated/scenarios") + + +def _print_section(title: str) -> None: + print(f"\n{'─' * 60}") + print(f" {title}") + print(f"{'─' * 60}") + + +def _print_step( + phase: str, + info: str, + details: str | None = None, + tool_info: str | None = None, +) -> None: + print(f" [OK ] Step ({phase}): {info}") + if tool_info: + print(f" {tool_info}") + if details: + indented = "\n".join(" " + line for line in details.splitlines()) + print(indented) + + +def _print_live_step(phase: str, info: str, details: str | None = None) -> None: + print(f" [....] Step ({phase}): {info}") + if details: + indented = "\n".join(" " + line for line in details.splitlines()) + print(indented) + + +def _log_timestamp() -> str: + return datetime.now().strftime("%Y%m%d_%H%M%S") + + +def default_scenario_output_path(asset_name: str) -> Path: + timestamp = _log_timestamp() + run_dir = DEFAULT_GENERATED_SCENARIOS_DIR / f"{slugify_asset_name(asset_name)}_scenarios_{timestamp}" + return run_dir / "scenarios.json" + + +def negative_scenario_output_path(scenarios_path: Path) -> Path: + return scenarios_path.with_name("negative_scenarios.json") + + +def hard_scenario_target(count: int, ratio: float = 0.7) -> int: + if count <= 0: + return 0 + return max(1, math.ceil(count * ratio)) + + +def _asset_profile_json(profile: AssetProfile) -> str: + return profile.model_dump_json(indent=2) + + +def _few_shot_examples_section(few_shots: list[dict]) -> str: + if not few_shots: + return ( + "No benchmark few-shot examples were available for this focus. " + "Do not assume any hidden fallback examples." + ) + + return ( + "Benchmark few-shot examples (style, complexity, and specificity references only; " + "follow Generation Mode for closed-form vs open-form grounding, and always prefer " + "direct operator/manager wording over any legacy benchmark phrasing):\n" + f"{json.dumps(few_shots, indent=2)}" + ) + + +def _tool_names_from_description(description: object) -> list[str]: + if not isinstance(description, str): + return [] + names: list[str] = [] + for line in description.splitlines(): + match = re.search(r"-\s*([a-zA-Z0-9_]+)\(", line) + if match: + names.append(match.group(1)) + return list(dict.fromkeys(names)) + + +def _normalize_string_list(raw_values: object | None) -> list[str]: + if not isinstance(raw_values, list): + return [] + return list(dict.fromkeys(str(value).strip() for value in raw_values if str(value).strip())) + + +def _normalize_failure_sensor_mapping(raw_mapping: object | None) -> dict[str, list[str]]: + if not isinstance(raw_mapping, dict): + return {} + normalized: dict[str, list[str]] = {} + for raw_failure_mode, raw_sensors in raw_mapping.items(): + if raw_failure_mode is None: + continue + failure_mode = str(raw_failure_mode).strip() + if not failure_mode or not isinstance(raw_sensors, list): + continue + sensors = sorted(dict.fromkeys(str(sensor).strip() for sensor in raw_sensors if str(sensor).strip())) + if sensors: + normalized[failure_mode] = sensors + return normalized + + +_TDesc = TypeVar("_TDesc") + + +def _label_desc_dict_from_list(raw: object, *, primary: str, alternate: str) -> dict[str, str]: + if not isinstance(raw, list): + return {} + out: dict[str, str] = {} + for item in raw: + if not isinstance(item, dict): + continue + raw_label = item.get(primary) + if raw_label is None: + raw_label = item.get(alternate) + if raw_label is None: + continue + label = str(raw_label).strip() + if not label: + continue + desc = str(item.get("description", "")).strip() + if desc: + out[label] = desc + return out + + +def _ordered_descriptions( + combined: dict[str, str], + ordered_names: list[str], + *, + field: str, + build: Callable[[str, str], _TDesc], + sort_when_ordered_empty: bool = False, +) -> list[_TDesc]: + if not ordered_names: + if sort_when_ordered_empty: + if not combined: + return [] + return [build(k, str(combined[k]).strip()) for k in sorted(combined.keys())] + raise ValueError(f"Asset profile field '{field}' requires a non-empty ordered name list") + missing = [k for k in ordered_names if k not in combined or not str(combined[k]).strip()] + if missing: + preview = ", ".join(missing[:8]) + suffix = "..." if len(missing) > 8 else "" + raise ValueError(f"Asset profile field '{field}' is missing names: {preview}{suffix}") + return [build(k, str(combined[k]).strip()) for k in ordered_names] + + +def _require_nonempty_str(value: object, *, field: str) -> str: + text = str(value or "").strip() + if not text: + raise ValueError(f"Asset profile is missing required non-empty field: '{field}'") + return text + + +def _require_nonempty_list(value: object, *, field: str) -> list[str]: + if not isinstance(value, list): + raise ValueError(f"Asset profile field '{field}' must be a list") + items = [str(item).strip() for item in value if str(item).strip()] + if not items: + raise ValueError(f"Asset profile is missing required non-empty list field: '{field}'") + return list(dict.fromkeys(items)) + + +def _invert_failure_mapping(failure_sensor_mapping: dict[str, list[str]]) -> dict[str, list[str]]: + sensor_failure_mapping: dict[str, list[str]] = {} + for failure_mode, sensors in failure_sensor_mapping.items(): + for sensor_name in sensors: + sensor_failure_mapping.setdefault(sensor_name, []).append(failure_mode) + return { + sensor_name: sorted(dict.fromkeys(failure_modes)) + for sensor_name, failure_modes in sensor_failure_mapping.items() + } + + +def _grounding_summary_for_prompt(grounding: GroundingBundle) -> str: + summary = { + "requested_open_form": grounding.requested_open_form, + "open_form_eligible": grounding.open_form_eligible, + "iot_sensors": grounding.iot_sensors, + "vibration_sensors": grounding.vibration_sensors, + "asset_instances": [ + { + "site_name": instance.site_name, + "asset_id": instance.asset_id, + "has_iot": instance.has_iot, + "has_vibration": instance.has_vibration, + "iot_time_range": instance.iot_time_range.model_dump() if instance.iot_time_range else None, + "vibration_time_range": ( + instance.vibration_time_range.model_dump() if instance.vibration_time_range else None + ), + } + for instance in grounding.asset_instances + ], + "failure_modes": grounding.failure_modes, + "failure_sensor_mapping": grounding.failure_sensor_mapping, + "sensor_failure_mapping": grounding.sensor_failure_mapping, + } + return json.dumps(summary, indent=2) + + +def _tool_summary_for_prompt(server_desc: dict) -> str: + compact = { + focus: _tool_names_from_description(description) + for focus, description in server_desc.items() + if focus in {"iot", "fmsr", "tsfm", "wo", "vibration"} + } + return json.dumps(compact, indent=2) + + +def _validation_tool_names_by_focus(server_desc: dict) -> dict[str, tuple[str, ...]]: + return { + focus: tuple(_tool_names_from_description(server_desc.get(focus, ""))) + for focus in FOCUS_ORDER + if focus != "multiagent" + } + + +def _redact_logged_prompt(prompt: str, asset_profile_json: str) -> str: + if asset_profile_json and asset_profile_json in prompt: + return prompt.replace(asset_profile_json, ".redacted", 1) + return prompt diff --git a/src/scenarios/grounding.py b/src/scenarios/grounding.py new file mode 100644 index 000000000..187724a63 --- /dev/null +++ b/src/scenarios/grounding.py @@ -0,0 +1,262 @@ +"""Grounded asset discovery helpers for scenario generation.""" + +from __future__ import annotations + +import json +import logging +from pathlib import Path +from typing import Any + +from servers.fmsr.main import get_failure_mode_sensor_mapping, get_failure_modes +from servers.iot.main import SITES, get_asset_list, get_asset_time_range, get_sensor_list +from servers.vibration.couchdb_client import list_asset_coverage as get_vibration_asset_coverage + +from .models import AssetInstance, GroundedTimeRange, GroundingBundle +from .text import slugify_asset_name + +_log = logging.getLogger(__name__) + +_FAILURE_MAPPING_DIR = Path(__file__).resolve().parent / "failure_mapping" + + +def _normalize_string_list(values: list[Any]) -> list[str]: + return sorted(dict.fromkeys(str(value).strip() for value in values if str(value).strip())) + + +def _normalize_string_mapping(mapping: dict[str, list[str]]) -> dict[str, list[str]]: + normalized: dict[str, list[str]] = {} + for key, values in mapping.items(): + clean_key = str(key).strip() + clean_values = _normalize_string_list(values) + if clean_key and clean_values: + normalized[clean_key] = clean_values + return normalized + + +def _failure_mapping_path(asset_name: str) -> Path: + return _FAILURE_MAPPING_DIR / f"{slugify_asset_name(asset_name)}.json" + + +def _load_failure_mapping(asset_name: str) -> tuple[dict[str, list[str]], dict[str, list[str]]] | None: + path = _failure_mapping_path(asset_name) + if not path.is_file(): + return None + try: + payload = json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as exc: + _log.warning("Ignoring failure mapping file %s: %s", path, exc) + return None + if not isinstance(payload, dict): + return None + fm2sensor = _normalize_string_mapping(dict(payload.get("fm2sensor", {}) or {})) + sensor2fm = _normalize_string_mapping(dict(payload.get("sensor2fm", {}) or {})) + if not fm2sensor and not sensor2fm: + return None + _log.info("Loaded F2S/S2F mapping for %s from %s", asset_name, path) + return fm2sensor, sensor2fm + + +def _write_failure_mapping( + asset_name: str, + fm2sensor: dict[str, list[str]], + sensor2fm: dict[str, list[str]], +) -> None: + path = _failure_mapping_path(asset_name) + path.parent.mkdir(parents=True, exist_ok=True) + payload = {"fm2sensor": fm2sensor, "sensor2fm": sensor2fm} + tmp = path.with_suffix(path.suffix + ".tmp") + try: + tmp.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8") + tmp.replace(path) + _log.info("Wrote F2S/S2F mapping for %s to %s", asset_name, path) + except OSError as exc: + _log.warning("Failed to write failure mapping %s: %s", path, exc) + try: + tmp.unlink(missing_ok=True) + except OSError: + pass + + +def _as_mapping(result: Any) -> dict[str, Any]: + if hasattr(result, "model_dump"): + return result.model_dump() + if isinstance(result, dict): + return result + return {} + + +def _iot_timestamp_to_str(value: Any) -> str | None: + if value is None: + return None + if isinstance(value, str): + stripped = value.strip() + return stripped or None + if hasattr(value, "isoformat"): + return value.isoformat() + return str(value) + + +def _discover_iot_inventory_and_instances() -> tuple[list[AssetInstance], list[str]]: + instances: list[AssetInstance] = [] + iot_union: set[str] = set() + + for asset_id in get_asset_list(): + sensors = get_sensor_list(asset_id) + for s in sensors: + if str(s).strip(): + iot_union.add(str(s).strip()) + tr_raw = get_asset_time_range(asset_id) + iot_time_range = GroundedTimeRange( + start=_iot_timestamp_to_str(tr_raw.get("start")), + end=_iot_timestamp_to_str(tr_raw.get("end")), + total_observations=int(tr_raw.get("total_observations") or 0), + ) + instances.append( + AssetInstance( + site_name=SITES[0], + asset_id=asset_id, + has_iot=bool(sensors), + iot_time_range=iot_time_range, + ) + ) + + return instances, sorted(iot_union) + + +def _vibration_by_site_asset() -> dict[tuple[str, str], dict[str, Any]]: + rows = get_vibration_asset_coverage() + out: dict[tuple[str, str], dict[str, Any]] = {} + for row in rows: + site = str(row.get("site_name", "")).strip() + aid = str(row.get("asset_id", "")).strip() + if site and aid: + out[(site, aid)] = row + return out + + +def _overlay_vibration( + instances: list[AssetInstance], + vib_by_key: dict[tuple[str, str], dict[str, Any]], +) -> list[str]: + vib_union: set[str] = set() + for inst in instances: + row = vib_by_key.get((inst.site_name, inst.asset_id)) + if not row: + continue + raw_sensors = row.get("sensors", []) or [] + for s in raw_sensors: + if str(s).strip(): + vib_union.add(str(s).strip()) + inst.has_vibration = bool(raw_sensors) + tr = dict(row.get("time_range", {})) + inst.vibration_time_range = GroundedTimeRange( + start=tr.get("start"), + end=tr.get("end"), + total_observations=int(tr.get("total_observations") or 0), + ) + + def _sort_weight(inst: AssetInstance) -> int: + vib_n = inst.vibration_time_range.total_observations if inst.vibration_time_range else 0 + return vib_n + + instances.sort( + key=lambda inst: ( + -_sort_weight(inst), + inst.asset_id.lower(), + ), + ) + return sorted(vib_union) + + +def _build_failure_sensor_grounding( + asset_name: str, + iot_sensors: list[str], + vibration_sensors: list[str], +) -> tuple[list[str], dict[str, list[str]], dict[str, list[str]]]: + raw_modes = _as_mapping(get_failure_modes(asset_name=asset_name)) + failure_modes = list(dict.fromkeys(raw_modes.get("failure_modes", []) or [])) + if not failure_modes: + return [], {}, {} + sensors = sorted( + dict.fromkeys( + str(s).strip() + for s in (*iot_sensors, *vibration_sensors) + if str(s).strip() + ) + ) + + if not sensors: + return failure_modes, {}, {} + + cached = _load_failure_mapping(asset_name) + if cached is not None: + fm2sensor, sensor2fm = cached + return failure_modes, fm2sensor, sensor2fm + + _log.info( + "Building FMSR grounding for %s using %d failure modes and %d sensors (one mapping call)", + asset_name, + len(failure_modes), + len(sensors), + ) + result = _as_mapping( + get_failure_mode_sensor_mapping( + asset_name=asset_name, + failure_modes=failure_modes, + sensors=sensors, + ) + ) + if "error" in result: + _log.info("FMSR sensor mapping failed for %s: %s", asset_name, result["error"]) + return failure_modes, {}, {} + + fm2sensor: dict[str, list[str]] = dict(result.get("fm2sensor", {}) or {}) + sensor2fm: dict[str, list[str]] = dict(result.get("sensor2fm", {}) or {}) + + normalized_fm2sensor = _normalize_string_mapping(fm2sensor) + normalized_sensor2fm = _normalize_string_mapping(sensor2fm) + _write_failure_mapping( + asset_name=asset_name, + fm2sensor=normalized_fm2sensor, + sensor2fm=normalized_sensor2fm, + ) + + return failure_modes, normalized_fm2sensor, normalized_sensor2fm + + +def discover_grounding(asset_name: str, requested_open_form: bool = False) -> GroundingBundle: + if not requested_open_form: + return GroundingBundle(asset_name=asset_name, requested_open_form=False) + + asset_instances, iot_sensor_names = _discover_iot_inventory_and_instances() + + vib_by_key = _vibration_by_site_asset() + vibration_sensor_names = _overlay_vibration(asset_instances, vib_by_key) + + if not asset_instances: + return GroundingBundle( + asset_name=asset_name, + requested_open_form=True, + open_form_eligible=False, + ) + + failure_modes, failure_sensor_mapping, sensor_failure_mapping = _build_failure_sensor_grounding( + asset_name=asset_name, + iot_sensors=iot_sensor_names, + vibration_sensors=vibration_sensor_names, + ) + + return GroundingBundle( + asset_name=asset_name, + requested_open_form=True, + open_form_eligible=True, + iot_sensors=iot_sensor_names, + vibration_sensors=vibration_sensor_names, + asset_instances=asset_instances, + failure_modes=failure_modes, + failure_sensor_mapping=failure_sensor_mapping, + sensor_failure_mapping=sensor_failure_mapping, + ) + + +__all__ = ["discover_grounding"] diff --git a/src/scenarios/huggingface/asset/compressor_utterance.jsonl b/src/scenarios/huggingface/asset/compressor_utterance.jsonl new file mode 100644 index 000000000..3c1e67093 --- /dev/null +++ b/src/scenarios/huggingface/asset/compressor_utterance.jsonl @@ -0,0 +1,15 @@ +{"id": 1001, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Based on the compressor sensor readings from April 10 to April 17, 2020, is there a risk of an air leak failure occurring within the next 7 days? Should we schedule maintenance to prevent this issue?", "hint": "IoT Agent handles raw sensor data ingestion and cleaning; TSFM Agent is responsible for anomaly detection and predicting remaining useful life; FMSR Agent interprets failure modes; WO Agent plans potential maintenance actions.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "The response should identify subtle trends or deviations across sensor streams indicating degradation (e.g., pressure drops, valve irregularities). After data ingestion by the IoT Agent, the TSFM Agent detects anomalies and predicts the likelihood and timing of failure. The FMSR Agent diagnoses the fault mode consistent with air leak signatures, and the WO Agent recommends proactively scheduled maintenance within the prediction horizon. Success is confirmed by the failure occurring on April 18 and evaluating if proposed maintenance timing could prevent or mitigate it.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1002, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Looking at the compressor data collected on April 17, 2020, can we determine whether an air leak failure is imminent within the next 24 hours? What immediate actions should be planned?", "hint": "IoT Agent manages sensor data streams; TSFM Agent focuses on real-time anomaly detection; FMSR Agent narrows down failure signatures; WO Agent recommends urgent inspections or shutdowns.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The response should detect rapid onset anomalies, such as spikes or correlated irregularities in pressure, motor current, and valve signals, processed by IoT and TSFM Agents. The FMSR Agent should infer probable air leak causes from these anomalies, and the WO Agent should propose immediate maintenance or operational responses. Effectiveness depends on timely and accurate prediction minimizing false positives.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1003, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. Following the air leak failure on April 18 and subsequent maintenance conducted on April 19, 2020, how has the compressor's operational health changed through April 20 to April 26? Is further intervention needed?", "hint": "IoT Agent compares pre- and post-maintenance sensor data; TSFM Agent looks for lingering anomalies; FMSR Agent assesses residual failure signatures; WO Agent advises on additional maintenance or monitoring.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "The response should effectively contrast sensor indicators before and after maintenance, identifying if anomalies persist or have resolved. Agents collaborate to determine if the repair fully restored asset health or if further actions are necessary. Correct assessment aligns with no subsequent failure events during the post-maintenance monitoring period.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1004, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Using sensor data from May 22 to May 28, 2020, can we predict whether the train's compressor is at risk of an air leak failure within the following 7 days? Should maintenance be scheduled?", "hint": "IoT Agent processes sensor inputs; TSFM Agent detects anomalies and forecasts failure risk; FMSR Agent analyzes fault modes; WO Agent plans possible maintenance interventions.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "The expected answer identifies early deviations from normal behavior through analysis of sensor data by IoT and TSFM Agents, links these to air leak failure modes via the FMSR Agent, and suggests appropriate preventive maintenance via the WO Agent. Confirmation with actual failure starting on May 29 validates the predictive accuracy.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1005, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Is there evidence from sensor streams on May 28, 2020, suggesting imminent air leak failure within 24 hours? What immediate maintenance actions are recommended?", "hint": "IoT and TSFM Agents focus on real-time anomaly detection; FMSR Agent interprets fault characteristics; WO Agent advises urgent response.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The answer should reveal rapid anomaly emergence detected by the TSFM Agent from IoT data, with the FMSR Agent confirming air leak signatures and the WO Agent proposing critical maintenance. Timely detection and minimal false alarms are essential for success.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1006, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. After the maintenance performed on May 30, 2020, how has the compressor's condition evolved during May 31 to June 6? Are there any indications that further repair or monitoring is needed?", "hint": "IoT, TSFM, and FMSR Agents analyze pre- and post-maintenance data; WO Agent provides recommendations for follow-up maintenance or monitoring adjustments.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "This should identify whether sensor anomalies have been resolved or persist despite the repair. Effective reasoning by agents leads to actionable recommendations for additional maintenance or confirms successful restoration of health.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1007, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. From the compressor sensor data collected between May 29 and June 4, 2020, can we assess the likelihood of an air leak failure occurring within the subsequent week starting June 5? Is preventive maintenance advisable?", "hint": "IoT Agent performs data aggregation; TSFM Agent identifies subtle anomalies and forecasts risk; FMSR Agent diagnoses failure signatures; WO Agent plans maintenance.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "Expected reasoning includes detection of emerging deviations, interpretation as air leak precursors, actionable maintenance scheduling, and validation via actual failure timing on June 5.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1008, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Based on sensor data from June 4, 2020, can we predict if an air leak failure will occur within 24 hours? What are the recommended immediate actions?", "hint": "IoT and TSFM Agents handle fast anomaly detection; FMSR Agent confirms fault mode; WO Agent advises urgent maintenance.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "Response should detect salient rapid changes forefronting failure, interpret them correctly as air leak signals, and recommend timely maintenance actions to mitigate damage.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1009, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. How has the compressor\u2019s sensor profile changed between June 8 and June 14, 2020, following maintenance on June 8 at 16:00? Is there evidence the air leak repair was successful or is further follow-up necessary?", "hint": "IoT, TSFM, and FMSR Agents evaluate before/after sensor data; WO Agent provides health assessment and maintenance suggestions.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "Expected outcome distinguishes persistent anomalies from resolved faults, with actionable follow-up maintenance recommendations when needed, or confirmation of repair success.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1010, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Using data from July 8 to July 14, 2020, can we assess the risk of an air leak failure occurring on or after July 15? Should maintenance be planned proactively?", "hint": "IoT Agent preprocesses data; TSFM Agent detects predictive anomalies; FMSR Agent diagnoses; WO Agent plans maintenance.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "Reasoning includes detection of fault precursors, assessment of failure risk, recommendation of proactive maintenance, and validation against actual failure occurrence.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1011, "type": "multiagent", "group": "Predictive Maintenance", "entity": "compressor", "text": "Consider asset mp_1. Is there any indication from sensor data on July 14, 2020, that an air leak failure is imminent within the next 24 hours? What immediate mitigations should be considered?", "hint": "IoT and TSFM Agents detect anomalies; FMSR Agent diagnoses fault mode; WO Agent advises urgent maintenance.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The response should identify sudden abnormal patterns signaling an imminent failure, contextualize using failure mode knowledge, and recommend immediate preventive or corrective measures.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1012, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. Following maintenance on July 16, 2020, how has the compressor\u2019s health trended during July 16 to July 22? Should further repair or monitoring be pursued?", "hint": "IoT, TSFM, and FMSR Agents compare sensor data pre- and post-maintenance; WO Agent recommends further action or confirms restoration.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "Expected is a clear differentiation of maintenance success or residual issues, with recommendations aligned to sensor data trends and operational context.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1013, "type": "multiagent", "group": "System Health Monitoring", "entity": "compressor", "text": "Consider asset mp_1. Based on compressor sensor data from February 1 to February 21, 2020, can we confirm that the system was operating normally during the following week, with no indications of upcoming failure? Is it safe to continue regular operations without scheduling maintenance?", "hint": "IoT Agent processes sensor data; TSFM Agent evaluates anomaly absence and system stability; FMSR Agent verifies no failure modes activated; WO Agent corroborates no work orders needed.", "category": "Healthy Operation - Weekly Monitor", "labels": "normal, healthy, no-failure", "characteristic_form": "The expected response reports stable sensor readings with no significant anomalies or degradation trends detected by the TSFM Agent after data ingestion by the IoT Agent. The FMSR Agent confirms absence of fault signatures, and the WO Agent concludes no maintenance is presently needed. The reasoning sequence is: data acquisition, anomaly absence confirmation, failure mode exclusion, and maintenance deferral recommendation.", "failure_event": "No failure - normal operation", "note": ""} +{"id": 1014, "type": "multiagent", "entity": "compressor", "group": "System Health Monitoring", "text": "Consider asset mp_1. Reviewing compressor data from June 20 to July 10, 2020\u2014after the June maintenance and before the July failure event\u2014does the system show stable operation without anomalies that would require maintenance intervention?", "hint": "IoT, TSFM, FMSR, and WO Agents collaborate to confirm operational health and maintenance on-hold.", "category": "Healthy Operation - Mid-Term Monitoring", "labels": "normal, healthy, no-failure", "characteristic_form": "The response should indicate consistent sensor patterns with no precursors to failure. Anomaly detection should yield negative results, failure diagnostics indicate no active faults, and maintenance planning agents advise continuity of normal operation. Clarity in confirming the asset\u2019s healthy condition strengthens confidence in monitoring processes.", "failure_event": "No failure - normal operation", "note": ""} +{"id": 1015, "type": "multiagent", "entity": "compressor", "group": "System Health Monitoring", "text": "Consider asset mp_1. Does the compressor data from July 23 to August 5, 2020, reflect stable and healthy operation, supporting continued service without urgent maintenance requirements?", "hint": "IoT & TSFM Agents analyze sensor stability; FMSR Agent confirms lack of failure mode activations; WO Agent endorses status quo.", "category": "Healthy Operation - Post-Maintenance Monitoring", "labels": "normal, healthy, no-failure", "characteristic_form": "Expected is an assessment confirming sensor stability and absence of anomaly flags. The failure mode analysis corroborates no fault activation, and the maintenance agent recommends continuation of routine monitoring without action. This supports operational decision-making by confirming equipment readiness.", "failure_event": "No failure - normal operation", "note": ""} diff --git a/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl b/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl new file mode 100644 index 000000000..c4d318e46 --- /dev/null +++ b/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl @@ -0,0 +1,17 @@ +{"id": 2001, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 50 days leading up to and including 2023-01-28, can we detect that the valve condition is approaching total failure? What trends in the sensor data over this 50-day window indicate the degradation?", "hint": "IoT Agent collects multi-sensor data over the fixed window; TSFM Agent examines temporal feature shifts; FMSR Agent validates the trajectory to fault state; WO Agent plans action based on bounded trend analysis.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Detection should integrate pressure, flow, vibration, and temperature trends across dates 2022-12-10 to 2023-01-28. TSFM Agent flags sustained deviations; FMSR Agent matches the fixed window anomalies to valve degradation profiles; WO Agent uses detection output for timely maintenance scheduling.", "failure_event": "Valve close to total failure at date 2023-01-28", "entity": "hydrolic_pump", "deterministic": true, "asset_component": "valve", "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2002, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 50 days leading up to and including 2024-03-13, can we detect the valve nearing total failure? Which sensor patterns over this window support this diagnosis?", "hint": "IoT aggregates valve-related sensor streams over the 50-day window; TSFM identifies evolving valve anomalies; FMSR confirms failure progression; WO recommends timely maintenance.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Detection is based on multi-day feature trends including pressure sensors PS1\u2013PS6, flow sensors FS1/FS2, and vibration VS1. The agents jointly identify and confirm progressive valve degeneration in dates 2024-01-24 to 2024-03-13.", "failure_event": "Valve close to total failure at date 2024-03-13", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2003, "type": "multiagent", "text": "For asset hp_1, analyzing the last 50 days leading up to and including 2026-05-14, can the sensor data reveal a worsening valve condition approaching failure? What temporal indicators support this?", "hint": "Multi-sensor sequence analysis performed over 2026-03-26 to 2026-05-14; TSFM and FMSR Agents detect and validate valve failure signatures; WO Agent plans repair.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Consistent anomalies in valve-switching-related sensor signals detected over the last 50 days before 2026-05-14 enable agents to detect failure onset and prioritize maintenance.", "failure_event": "Valve close to total failure at date 2026-05-14", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2004, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage onset at 2023-01-27 be detected by analyzing sensor data from the last 100 days? Which sensor trends and patterns within this window indicate leakage development?", "hint": "IoT and TSFM Agents analyze pressure, flow, vibration, and motor power sensor data from days 2022-10-20 to 2023-01-27; FMSR Agent diagnoses leakage severity; WO Agent recommends intervention based on trend detection.", "category": "Fixed-Window Condition Detection (100 days)", "characteristic_form": "The agents jointly detect escalating pump leakage signatures manifested as temporal deviations in sensors PS1\u2013PS6, FS1/FS2, EPS1, and VS1 across the 100-day window before date 2023-01-27, enabling timely maintenance action recommendations.", "failure_event": "Severe pump leakage onset at date 2023-01-27", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2005, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 100 days leading up to and including 2023-06-09, can severe internal pump leakage be detected? What sensor evidence within this window is most critical for diagnosis?", "hint": "Pressure, flow, motor power, vibration, and temperature sensors are analyzed temporally over dates 2023-03-02 to 2023-06-09; Agents collaborate for fault classification and maintenance planning.", "category": "Fixed-Window Condition Detection (100 days)", "characteristic_form": "Multi-sensor signatures of pump leakage are tracked and interpreted from a 100-days historical window ending at 2023-06-09, supporting confident fault detection and prioritization of corrective action.", "failure_event": "Severe pump leakage onset at day 2023-06-09", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2006, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage on 2024-01-31 be detected using sensor data from the preceding 100 days? Which sensor trends provide key clues within this timeframe?", "hint": "Agents monitor sensor streams representing pump performance and anomalies over the window from 2023-10-24 to 2024-01-31; FMSR and WO Agents localize fault and maintenance needs.", "category": "Fixed-Window Condition Detection (100-day window)", "characteristic_form": "Joint analysis of sensor deviations over the 100-day period before 2024-01-31 allows agents to support reliable detection of severe leakage and guide corresponding repairs.", "failure_event": "Severe pump leakage onset on 2024-01-31", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2007, "type": "multiagent", "text": "For asset hp_1, using the last 100 days up to and including 2027-01-30, can sensor data reveal the onset of severe internal pump leakage? Which sensor anomalies support this?", "hint": "Integrated multi-sensor data monitoring from 2026-10-22 to 2027-01-30 assists TSFM and FMSR Agents in detecting and classifying severe leakage; WO Agent coordinates timely maintenance intervention.", "category": "Fixed-Window Condition Detection (100-day window)", "characteristic_form": "Agents utilize densely sampled trends over the 100-day window to detect severe leakage onset reliably and recommend appropriate repair schedules.", "failure_event": "Severe pump leakage onset on 2027-01-30", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2008, "type": "multiagent", "text": "For asset hp_1, is the hydraulic accumulator\u2019s pressure near total failure detectable in sensor data from the prior 50 days leading up to and including 2024-01-22? What temporal sensor features indicate critical pressure decline?", "hint": "Pressure sensors monitored over the window from 2023-12-04 to 2024-01-22 provide key data; TSFM detects critical trends; FMSR assesses failure risk; WO advises urgent maintenance.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Agents detect significant pressure decrease alongside corroborative anomalies in temperature and flow across 50 days, confirming the accumulator\u2019s critical condition and enabling timely maintenance decision-making.", "failure_event": "Accumulator close to failure on 2024-01-22", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2009, "type": "multiagent", "text": "For asset hp_1, using sensor data from the 50 days preceding and including 2026-03-23, can we detect critically low hydraulic accumulator pressure? Which sensor trends support this detection?", "hint": "Multi-sensor temporal analysis including pressure, flow, and temperature over the window from 2026-02-02 to 2026-03-23 supports multi-agent failure confirmation.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Degradation patterns in pressure sensors and supporting data confirm near failure of the accumulator, prompting maintenance planning.", "failure_event": "Accumulator close to failure on 2026-03-23", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2010, "type": "multiagent", "text": "For asset hp_1, can sensor data covering the 50 days before and including 2028-03-11 confirm that the hydraulic accumulator is close to total failure? What temporal sensor signals are most indicative?", "hint": "Agents analyze sustained pressure drops and supporting temperature and flow trends over the window from 2028-01-21 to 2028-03-11; WO Agent plans detection-based intervention.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Temporal sensor trends over the fixed window clearly reflect critical accumulator degradation, enabling agents to confirm failure mode and recommend immediate maintenance.", "failure_event": "Accumulator close to failure on 2028-03-11", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2101, "type": "multiagent", "text": "For asset hp_1, using sensor data spanning the days leading up to and including 2023-01-28, can we detect that the valve condition is approaching total failure? What evolving sensor trends support this diagnosis?", "hint": "IoT Agent aggregates multi-days sensor data; TSFM Agent analyzes valve switching anomalies over time; FMSR Agent confirms failure progression; WO Agent maps findings to maintenance scheduling.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents integrate all relevant sensor data prior to and including 2023-01-28 to detect progressive valve degradation, emphasizing temporal patterns and cumulative anomalies supporting fault detection.", "failure_event": "Valve close to total failure around 2023-01-28", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2102, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage at 2023-01-27 be detected by reviewing historical sensor data over the days leading up to this event? Which sensor anomalies are key?", "hint": "Multi-agent analysis aggregates pump-related sensor streams over an unbounded prior window to identify leakage onset and severity.", "category": "Open-Window Condition Detection", "characteristic_form": "Detection capitalizes on extended temporal context leveraging all available days before 2023-01-27, focusing on identifying trends in flow, pressure, motor power, and vibration signaling leakage onset.", "failure_event": "Severe pump leakage onset around 2023-01-27", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2103, "type": "multiagent", "text": "Consider asset hp_1. Is valve near-total failure detectable in sensor data across the days leading up to and including 2024-03-13? How do sensor patterns evolve during this period?", "hint": "Agents review all available sensor data prior to and including 2024-03-13 to detect valve degradation and failure patterns.", "category": "Open-Window Condition Detection", "characteristic_form": "Temporal anomaly detection integrates long-term sensor trends, enabling confident detection of valve near-failure states informed by multiple data streams.", "failure_event": "Valve close to total failure around 2024-03-13", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2104, "type": "multiagent", "text": "Consider asset hp_1. At 2024-01-22, can the hydraulic accumulator close to total failure be detected by analyzing sensor data spanning previous days? What sensor signatures confirm this state?", "hint": "All pressure and supporting sensor data from prior days are evaluated; agents detect critical pressure decline and associated anomalies.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents leverage as much historical data as needed to observe pressure degradation, ensuring reliable identification of accumulator failure risk and informing urgent maintenance.", "failure_event": "Accumulator close to failure around 2024-01-22", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2105, "type": "multiagent", "text": "Consider asset hp_1. Can sensor data over the days leading up to and including 2026-03-23 confirm that the hydraulic accumulator pressure has critically dropped? Which sensor patterns support this finding?", "hint": "Pressure, flow, and temperature data aggregated across preceding days; multi-agent collaboration interprets failure risk.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents utilize flexible-length temporal context to corroborate failure mode activation and prioritize intervention.", "failure_event": "Accumulator close to failure around 2026-03-23", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2106, "type": "multiagent", "text": "For asset hp_1, is the hydraulic accumulator close to total failure on 2028-03-11 detectable using sensor data from all available prior days? What sensor evidence indicates this condition?", "hint": "Agents analyze long-term pressure sensor trends plus supporting signals to detect critical hydraulic accumulator failure.", "category": "Open-Window Condition Detection", "characteristic_form": "A complete historical view enables agents to detect and confirm the degradation leading to failure and to recommend timely preventive maintenance.", "failure_event": "Accumulator close to failure around 2028-03-11", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2107, "type": "multiagent", "text": "For asset hp_1, at 2023-06-09, can severe internal pump leakage be detected by considering sensor data over an extended window leading to this point? What sensor trends are most indicative?", "hint": "Agents combine multi-day sensor inputs for robust trend detection and classification of pump leakage severity.", "category": "Open-Window Condition Detection", "characteristic_form": "Use of long-term temporal context helps accurately identify leakage onset and severity from anomalies in pressure, flow, motor power, vibration, and temperature records.", "failure_event": "Severe pump leakage onset around 2023-06-09", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} diff --git a/src/scenarios/huggingface/scenarios/all_utterance.jsonl b/src/scenarios/huggingface/scenarios/all_utterance.jsonl new file mode 100644 index 000000000..0e41382c9 --- /dev/null +++ b/src/scenarios/huggingface/scenarios/all_utterance.jsonl @@ -0,0 +1,152 @@ +{"id":1,"type":"IoT","text":"What IoT sites are available?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value of all sites, either as text or as a reference to a file","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":2,"type":"IoT","text":"Can you list the IoT sites?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value of all sites, either as text or as a reference to a file","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":3,"type":"IoT","text":"What assets can be found at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value from querying the assets at the MAIN site. The response should be a reference to a file containing the list of assets","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":4,"type":"IoT","text":"Which assets are located at the MAIN facility?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value from querying the assets at the MAIN site. The response should be a reference to a file containing the list of assets","group":"retrospective","entity":"Equipment","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":5,"type":"IoT","text":"Retrieve metadata for Chiller 6 located at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the metadata for asset 'Chiller 6' at the MAIN site. The metadata may be in the return value, or the may be returned as a reference to a file containing the metadata","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":6,"type":"IoT","text":"Get the asset details for Chiller 9 at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the details for asset 'Chiller 9' at the MAIN site. The details may be in the return value, or the may be returned as a reference to a file containing the details","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":7,"type":"IoT","text":"Download the metadata for Chiller 3 at the MAIN facility.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the metadata for asset 'Chiller 3' as the MAIN site. The metadata may be in the return value, or the may be returned as a reference to a file containing the metadata","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":8,"type":"IoT","text":"Download sensor data for Chiller 6's Tonnage from the last week of 2020 at the MAIN site","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the tonnage data for last week of 2020 for 'Chiller 6' at the MAIN site. The response should be a reference to a file containing the list of tonnage values","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":9,"type":"IoT","text":"Retrieve sensor data for Chiller 6's % Loaded from June 2020 at MAIN.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the % Loaded measurements for the asset 'Chiller 6' at the MAIN site. It should include all recorded values for June 1, 2020 througb June 30, 2020 inclusive. The response should be a reference to a file containing the % Loaded data","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":10,"type":"IoT","text":"Get sensor data for both Chiller 6 and Chiller 9's Tonnage from first week of June 2020 at MAIN in a single file.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the Tonnage values for both asset 'Chiller 6' and asset 'Chiller 9' at the MAIN site for last week. The values from both chillers should be merged into a single file. The return value should reference the file containing the merged Tonnage data from both chillers","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":11,"type":"IoT","text":"Download all sensor data for Chiller 6 from the last week of April '20 at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be data from all sensors for asset 'Chiller 6' at the MAIN site for the past week. The return value should reference a file containing all the sensor data","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":12,"type":"IoT","text":"Retrieve sensor data for Chiller 6 from June 2020.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be all sensor data for asset 'Chiller 6' for June 1, 2020 through June 30, 2020, inclusive. The return value should be a reference to a file containing all the sensor data.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":41,"type":"IoT","text":"What was the latest supply humidity from CQPA AHU 1 at site MAIN on sept 3 2015? return in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the latest value for the supply humidity on asset CQPA AHU 1 at the MAIN site, on Septemer 3, 2015. The return value should reference a file containing the supply humidity data","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":42,"type":"IoT","text":"what was the supply temperature from CQPA AHU 2B on sept 19, 2020 at quarter to midnight, at site MAIN? return in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the supply temperature from asset CQPA AHU 2B at 11:45pm on September 19, 2015. The returned value should be a reference to a file containing the value","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":43,"type":"IoT","text":"how much power was CQPA AHU 1 (MAIN site) using on 6/14/20?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be either a list of power consumption values for asset CQPA AHU 1 at the MAIN site on June 14, 2016, or the average power consumption on June 14, 2016. The returned value should either be the average power consumption, or a reference to a file containing the power consumption values for the date June 14, 2016.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":44,"type":"IoT","text":"Can I list all the metrics monitored by CQPA AHU 2B? use site MAIN","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of all the metrics which may be obtained for asset CQPA AHU 2B? at the MAIN site. The return value should be a reference to a file which lists the metrics.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":45,"type":"IoT","text":"What is the power consumption of CQPA AHU 1 on mar 13 '20, site MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of the power consumption values for asset CQPA AHU 1 at the MAIN site for January 13, 2023, or the average power consumption for January 13, 2023. The returned value should be a reference to a file, or else a single average power number.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":46,"type":"IoT","text":"retrieve the supply temperature data recorded last week for Chiller 3 (MAIN site)?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the supply temperature for asset Chiller 3 for the site MAIN for last week. The returned value should be a reference to a file listing the supply temperatures.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":47,"type":"IoT","text":"list all the chillers at site MAIN","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of all chiller assets for the site MAIN. The returned value should be a reference to a file containing the list of chiller assets.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":48,"type":"IoT","text":"what was the return temperature from CQPA AHU 2B on sept 19, 2020 at 7pm, at site MAIN? return data in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return temperature for asset CQPA AHU 2B at the MAIN site, for 7pm on September 19, 2015. The return value should reference a file that contains the return temperature.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":101,"type":"FMSR","text":"List all failure modes of asset Chiller.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes for Chiller are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":102,"type":"FMSR","text":"List all failure modes of asset Chiller 6.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes of asset Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":103,"type":"FMSR","text":"List all failure modes of asset Wind Turbine.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain a list of meaningful failure modes for asset wind turbine.","group":"retrospective","entity":"WindTurbine","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":104,"type":"FMSR","text":"List all installed sensors of asset Chiller 6.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The installed sensors of asset Chiller 6 are: Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":105,"type":"FMSR","text":"Provide some sensors of asset Wind Turbine.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain a list of sensor names for asset wind turbine.","group":"retrospective","entity":"WindTurbine","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":106,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by Chiller 6 Supply Temperature.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":107,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by temperature sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":108,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":109,"type":"FMSR","text":"Get failure modes for Chiller 6 and only include in final response those that can be monitored using the available sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":110,"type":"FMSR","text":"Are there any failure modes of Chiller 6 that can be predicted by monitoring the vibration sensor data?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"predictive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":111,"type":"FMSR","text":"List all sensors of Chiller 6 that are potentially relevant to Compressor Overheating.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":112,"type":"FMSR","text":" If compressor overheating occurs for Chiller 6, which sensor should be prioritized for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.]","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":113,"type":"FMSR","text":" If Evaporator Water side fouling occurs for Chiller 6, which sensor is most relevant for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":114,"type":"FMSR","text":"What are the failure modes of Chiller 6 that can be identified by analyzing the data from the available sensors?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":115,"type":"FMSR","text":"Purge unit of chiller 6 have possibility to excess purge, what is the plan by the maintenance experts to early detect the failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a plan by the maintenance experts to early detect the failure of purge unit of chiller 6. the answer should include the sensors that can be used to detect the failure of purge unit of chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":116,"type":"FMSR","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a machine learning recipe for detecting overheating failure for Chiller 6. the answer should include the sensors that can be used to detect the failure of overheating for Chiller 6","text":"Generate a machine learning recipe for detecting overheating failure for Chiller 6. Result should include feature sensors and target sensor.","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":117,"type":"FMSR","text":"When compressor motor of Chiller 6 fails, what is the temporal behavior of the power input?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should describe the temporal behavior of the power input of Chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":118,"type":"FMSR","text":"When power input of Chiller 6 drops, what is the potential failure that causes it?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":119,"type":"FMSR","text":"When the Liquid Refrigerant Evaporator Temperature of Chiller 6 drops, what failure is most likely to occur?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":120,"type":"FMSR","text":"I want to build an anomaly model for identifying a chiller trip failure for POKMAIN chiller 6. Provide me a list of sensors that I should use, along with the temporal behavior,","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain how to build an anomaly model for identifying a chiller trip failure for POKMAIN chiller 6. The answer should include sensors that I should use, along with the temporal behavior,","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":201,"type":"TSFM","text":"What types of time series analysis are supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: the available AI tasks are [{task_id:'tsfm_integrated_tsad',task_description:'Time series Anomaly detection'},{task_id:'tsfm_forecasting',task_description:'Time series Multivariate Forecasting'},{task_id:'tsfm_forecasting_tune',task_description:'Finetuning of Multivariate Forecasting models'},{task_id:'tsfm_forecasting_evaluation',task_description:'Evaluation of Forecasting models'}]","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":202,"type":"TSFM","text":"What are time series pretrained models are available in system?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: The available pretrained models are [{model_id:'ttm_96_28', model_checkpoint:'data/tsfm_test_data/ttm_96_28', model_description:'Pretrained forecasting model with context length 96'},{model_id:'ttm_512_96', model_checkpoint:'data/tsfm_test_data/ttm_512_96', model_description:'Pretrained forecasting model with context length 512'},{model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'},{model_id:'ttm_energy_512_96', model_checkpoint:'data/tsfm_test_data/ttm_energy_512_96', model_description:'Pretrained forecasting model tuned on energy data with context length 512'}]","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":203,"type":"TSFM","text":"Are any time series forecasting models supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, several time series forecasting models are supported.","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":204,"type":"TSFM","text":"Is TTM (Tiny Time Mixture), a time series model supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, several TTM models are supported","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":205,"type":"TSFM","text":"Is LSTM model supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: LSTM model is not supported.","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":206,"type":"TSFM","text":"Is Chronos model supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: No, Chronos is not supported","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":207,"type":"TSFM","text":"Is Anomaly Detection supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, anomaly detection is supported in TSFM.","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":208,"type":"TSFM","text":"Is Time Series Classification supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Time Series Classification is not supported in TSFM","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":209,"type":"TSFM","text":"Is any model with context length 96 supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, there is a model with context length 96","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":210,"type":"TSFM","text":"Is any model with context length 1024 supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: No, there is no model with context length 1024","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":211,"type":"TSFM","text":"Find a model for energy forecasting.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: [{model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'}, {model_id:'ttm_energy_512_96', model_checkpoint:'data/tsfm_test_data/ttm_energy_512_96', model_description:'Pretrained forecasting model tuned on energy data with context length 512'}]","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":212,"type":"TSFM","text":"Find a model for energy forecasting with context length 96 and nothing else.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: ttm_energy_96_28","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":213,"type":"TSFM","text":"Find all models with context length 96.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: [{model_id:'ttm_96_28', model_checkpoint:'data/tsfm_test_data/ttm_96_28', model_description:'Pretrained forecasting model with context length 96'}, {model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'}]","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":214,"type":"TSFM","text":"How many models with context length exactly 96 are supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: There are 2 models with a context length of 96","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":215,"type":"TSFM","text":"Does TSFM support time series regression tasks or any model for forecasting with context length 1024?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: TSFM does not support regression and there is no model with context length 1024","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":216,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use parameter 'Timestamp' as a timestamp. Use the following parameters as inputs 'Chiller 9 Liquid Refrigerant Evaporator Temperature,Chiller 9 Return Temperature,Chiller 9 Tonnage,Chiller 9 Setpoint Temperature,Chiller 9 Supply Temperature,Chiller 9 Chiller % Loaded,Chiller 9 Condenser Water Supply To Chiller Temperature,Chiller 9 Power Input,Chiller 9 Chiller Efficiency'","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":217,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use parameter 'Timestamp' as a timestamp.","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":218,"type":"TSFM","text":"Use data in 'chiller9_annotated_small_test.csv' to forecast 'Chiller 9 Condenser Water Flow' with 'Timestamp' as a timestamp.","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":219,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use the following parameters as inputs 'Chiller 9 Liquid Refrigerant Evaporator Temperature,Chiller 9 Return Temperature,Chiller 9 Tonnage,Chiller 9 Setpoint Temperature,Chiller 9 Supply Temperature,Chiller 9 Chiller % Loaded,Chiller 9 Condenser Water Supply To Chiller Temperature,Chiller 9 Power Input,Chiller 9 Chiller Efficiency'","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":220,"type":"TSFM","text":"Finetune a forecasting model for 'Chiller 9 Condenser Water Flow' using data in 'chiller9_finetuning_small.csv' with 'Timestamp' as a timestamp.","category":"Tuning Query","deterministic":true,"characteristic_form":"The finetuned forecasting model is saved in save_model_dir=tunedmodels with result stored in results_file. Results are saved: {%JSON_RESULT}","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Tuning Query"} +{"id":221,"type":"TSFM","text":"Finetune a forecasting model for 'Chiller 9 Condenser Water Flow' using data in 'chiller9_finetuning_small.csv' with 'Timestamp' as a timestamp. Use 1% of data for tuning","category":"Tuning Query","deterministic":true,"characteristic_form":"The finetuned forecasting model is saved in save_model_dir=tunedmodels with result stored in results_file. Results are saved: {%JSON_RESULT}","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Tuning Query"} +{"id":222,"type":"TSFM","text":"I need to perform Time Series anomaly detection of 'Chiller 9 Condenser Water Flow' using data in chiller9_tsad.csv","category":"Anomaly Detection Query","deterministic":true,"characteristic_form":"The anomaly detection results are stored in file data/tsfm_test_data/tsad_conformal.csv","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Anomaly Detection Query"} +{"id":223,"type":"TSFM","text":"Find and run several methods to analyze data sensor 'Chiller 9 Condenser Water Flow' using data in 'data/tsfm_test_data/chiller9_tsad-small.csv'.","category":"Complex Query","deterministic":true,"characteristic_form":"The forecasting results for 'Chiller 9 Condenser Water Flow' using data in 'data/tsfm_test_data/chiller9_annotated_small_test.csv' are available in the json file and results of anomaly detection are stored in a csv file","group":"retrospective","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Complex Query"} +{"id":400,"text":"Get the work order of equipment CWC04013 for year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There will be 33 records. The expected response should retrieve all work orders for equipment CWC04013 in the year 2017, ensuring correct equipment ID and time filtering.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":401,"text":"I would like to check the work order distribution for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"Work order with primary Code MT010 occurred 3 times and code MT013 occurred once. The expected response should retrieve and summarize work orders by type or month for equipment CWC04013 during 2017, ensuring correct year and equipment filtering.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":402,"text":"I would like to retrieve the preventive work order details for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 31 preventive work orders for this utterance. The expected response should retrieve preventive maintenance work orders for CWC04013 in 2017, correctly filtering by asset, preventive work order type and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":403,"text":"I would like to retrieve the corrective work order details for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"The output is two corrective work orders. The expected response should retrieve corrective maintenance work orders for CWC04013 during 2017, verifying correct work order type and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":404,"text":"Get the events of equipment CWC04009 for year 2019 and provide a summary based on the event group, such as work order event, alerts and anomaly events.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 14 work orders, 0 alert, and 0 anomaly. The expected response should retrieve all event types (work orders, alerts, anomalies) for CWC04009 in 2019 and summarize them by event group.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":405,"text":"Get all the events of equipment CWC04009 for the June of 2020 and provide a summary based on the event group for work order, alert, and anomaly.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 3 work order events, 30 alert events, and 30 anomaly events. The expected response should retrieve and summarize events (work order, alert, anomaly) for CWC04009 during June 2020, grouped correctly by event type and time range (June 2020).","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":406,"text":"Get the summary of the events of equipment CWC04009 for the June of 2020 and provide a summary based on the event group.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 30 alerts, 30 anomalies, and 3 work orders. The expected response should summarize events of CWC04009 in June 2020 by event group, ensuring complete event retrieval and correct categorization/grouping (alert, anomalies, and work order).","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":407,"text":"Get the daily count of the events of alert, anomaly for 2021 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 82 days have events. The expected response should retrieve daily counts of alerts and anomalies for CWC04009 throughout 2021, verifying correct aggregation over time (daily) and filtering of asset, event type (alert), and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":408,"text":"Get the daily count of the events of alert, anomaly for the May 2020 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 26 days have events. The expected response should retrieve daily counts of alerts and anomalies for CWC04009 for May 2020, verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly), and time range - May 2020.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":409,"text":"Get the daily count of alert, anomaly and work order event for the May 2020 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":false,"characteristic_form":"There are 26 days with the records. Depending on the LLM used, the result could be daily total event summary or daily summary for each event type. The expected response should retrieve and summarize daily counts of alerts, anomalies, and work order events for CWC04009 for May 2020, verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly and work order), and time range - May 2020.","note":"We have both work order business data object and work order event as a group type in the event file. So we make a change of the utterance.","group":"retrospective","entity":"Equipment"} +{"id":410,"text":"Get all the events of equipment CWC04009 for the first week of June of 2020 and provide a summary based on the event group for work order event, alert, and anomaly.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 6 alert records. The expected response should retrieve events for CWC04009 in the first week of June 2020 and group them by event type. verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly and work order), and time range - First week of May 2020.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":411,"text":"Which corrective work orders for equipment CWC04009 in year 2017 can be bundled in the next maintenance window? A bundle means that several work orders are executed in a short period, say in two weeks.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There are two bundles, one has 10, and another has 3 corrective work orders. The expected response should identify corrective work orders for CWC04009 in 2017 that can be bundled together for execution within a two-week maintenance window. Ensure the calculation and bundile is correct","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":412,"text":"I would like to predict the next work order probability for the equipment labeled as CWC04013.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"The expected response should be able to identify the next likely work order for CWC04013 based on historical work order patterns. It should be a list of work order with the probabilities (the summation of the probabilities should be one).","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":413,"text":"Assuming that the current date is 2018-01-02, can you predict next work order probability for me for equipment CWC04009 using predict_next_work_order_probability function?","type":"Workorder","category":"Prediction","deterministic":true,"characteristic_form":"Freon Management (code MT012) under Maintenance and Routine Checks has a probability of 0.2. The output should have the probability for primary code. For example, the highest probability of next work order. The expected response should be able to use historical work order data up to 2018-01-02 for CWC04009 to identify or predict the next work order probability, ensuring no cutoff of results. More specific, It should be a list of work order with the probabilities (the summation of the probabilities should be one).","note":"The output token size changed to 2000 to make sure there is no cut-off of the generated results.","group":"predictive","entity":"Equipment"} +{"id":414,"text":"Assuming that the current date is 2018-01-02, can you predict next work order probability for me for equipment CWC04009?","type":"Workorder","deterministic":true,"category":"Prediction","characteristic_form":"Failure codes MT012, MT008, and M013 each have a probability of 0.2. It will predict the next work order probability for CWC04009 using available data up to 2018-01-02. The expected response should be able to use historical work order data up to 2018-01-02 for CWC04009 to identify or predict the next work order probability, ensuring no cutoff of results. More specific, It should be a list of work order with the probabilities (the summation of the probabilities should be one).","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Prediction"} +{"id":415,"text":"When an anomaly happens for equipment CWC04009, can you recommend a list of candidate work orders and give me a summary of work order as percentage?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"An possible example is work orders are split evenly with 50% for MT010 and 50% for MT013 for equipment CWC04009.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":416,"text":"When an anomaly happens for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"It gives a list of work order with a primary failure code. Based on an anomaly in CWC04009, recommend the top three most appropriate work orders for remediation.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":417,"text":"Just notice an anomaly 'KPI Cooling Load above upper bound' happens for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a list of the primilar failure codes with three work order types. In more details, upon observing the 'KPI Cooling Load above upper bound' anomaly, suggest the top three corrective work orders for CWC04009.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":418,"text":"Just notice two anomalies 'KPI Cooling Load above upper bound' and 'KPI Delta Setpoint above upper bound' happened for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a list of the primilar failure codes with three work order types. Upon observing two anomalies, recommend the top three corrective actions for CWC04009 to address both issues.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":419,"text":"Using your knowledge of the industrial asset, can you suggest me a work order for alert RUL0014 with the context of 'Chiller - Cooling Substance Delta T Low' for closed-loop water-cool chiller its load is higher than the upper bound?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a one or more the primilar failure codes with their work order types. Recommend an appropriate work order to address the alert RUL0014 for the cooling issue in the closed-loop water-cooled chiller.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":420,"text":"Assume today is early of July 2020, I would like to review the performance of chiller 9 with equipment ID CWC04009 for June 2020 and track any anomalies or operation violations as alerts.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There were 30 alerts for 'Chiller - Evaporator Approach High', and anomalies were observed in Cooling Load (12 instances), Flow Efficiency (9), Delta Setpoint (6), and Delta Temperature (3). The LLM ReAct process is to review the operational performance and detect anomalies or alerts for Chiller 9 (CWC04009) during June 2020, confirming correct equipment ID and timeframe.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":421,"text":"In May and June of 2020, numerous anomalies and alerts have been reported for Chiller 9 with equipment ID CWC04009. Could you review them and suggest appropriate work orders or actions?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a one or more the primilar failure codes. The LLM ReAct analyze anomalies and alerts for Chiller 9 (CWC04009) during May–June 2020 and recommend appropriate corrective work orders.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":422,"text":"After checking existing work orders, anomalies and alerts in May and June 2020 for Chiller 9 with equipment ID CWC04009, should I recommend a new work order or is it too early to decide for July 2020?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zeor or more the primilar failure codes recommendaed as possible work orders. Evaluate whether a new work order should be created for July 2020 based on the review of anomalies, alerts, and existing work orders from May–June 2020 for CWC04009.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":423,"text":"I am using historical work order information upto end of June 2020 for prioritizing maintenance. Which work orders should I prioritize first for Chiller 9 with equipment ID CWC04009 in July 2020?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zeor or more the primilar failure codes recommendaed as possible work orders with priorities. Use historical work order data up to June 2020 to prioritize the most urgent work orders for Chiller 9 (CWC04009) in July 2020.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":424,"text":"Can you provide guidance on bundling corrective work orders together to optimize the maintenance schedule for Chiller 9 with equipment ID CWC04009 covering years of 2017, 2018 and 2019, bundle has to be happen within two weeks and have at least two work orders, also tell the details of each bundle?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There will be three bundles generated with the size of 15, 6 and 2 respectively. Suggest bundles of corrective work orders for CWC04009 across 2017–2019, ensuring each bundle contains at least two work orders scheduled within a two-week window.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":425,"text":"How can I analyze anomalies across multiple KPIs to better diagnose the root cause of these issues?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Based on the utilzied LLM, the process begins with collecting and cleaning historical KPI and maintenance data, followed by detecting anomalies across key performance indicators. These anomalies are then analyzed for correlations, leading to root cause hypotheses that are validated with logs and expert input, ultimately guiding the bundling of corrective work orders into optimized maintenance actions. Provide a method to analyze anomalies across multiple KPIs for more accurate root cause diagnosis.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":426,"text":"Could you identify any causal linkages between anomalies across KPIs to better understand the severity and interconnectedness?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The LLM ReAct identifies causal relationships between anomalies across KPIs to understand system-wide impact and severity. Two causal linkages were identified between anomalies across KPIs: one related to Misalignment under Structural and Mechanical Failures and another to Insufficient Insulation under Energy Efficiency. Each issue occurred once, suggesting distinct yet potentially impactful contributors to system performance degradation.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":427,"text":"Since we know 80% of alerts are likely spurious, can you identify the meaningful 20% for further analysis for any chillers?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The results may vary, and the actual outcome depends on the specific LLM used. Filter and prioritize the most meaningful 20% of alerts from chillers for detailed analysis, excluding the spurious ones.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":428,"text":"Could you generate rules that help distinguish meaningful alerts from spurious ones?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Depends on the LLM utuilzied, the outcome could be 1) Real thredholds for meaning alert; or 2) the steps to generate such rules. Develop rules or criteria to distinguish genuine alerts from spurious or false positives in operational monitoring.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":429,"text":"How can reasoning on operation alerts help in generating significant warning message to improve maintenance recommendations for Chiller 9 with equipment ID CWC04009?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be one or more the alter rule codes. Explain how operational alert reasoning can be used to improve the generation of actionable warning messages for Chiller 9 (CWC04009).","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":430,"text":"We are building an early detection and remediation system for potential failures, such as condenser water side fouling, for Chiller 9 with equipment ID CWC04009 at main site site with two month’s period from 2020-05-01T12:30:00 to 2022-06-30T19:30:00. We like to review the chiller’s performance of the period with any anomalies or operation violations as alerts, and provide the guideline on work order generation?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be one or more the primilar failure codes with corresponding work order types. Review anomalies and alerts for Chiller 9 (CWC04009) at main site between 2020-05-01 and 2022-06-30, and provide work order generation guidelines.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":431,"text":"Assume today is early of July 2020, I would like to review the performance of chiller 9 with equipment ID CWC04009 for June 2020 and track any anomalies or operation violations as alerts. Tell me what corrective work orders have been scheduled, and whether new work order should generate.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zero or one the primilar failure code with corresponding work order type. The outcome dependes on the LLM utilzied. Review June 2020 anomalies and alerts for Chiller 9 (CWC04009), list scheduled corrective work orders, and determine if a new work order is needed.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":432,"text":"I would like to review the performance of chiller 9 with equipment ID CWC04009 at main site site for June 2020 and track any anomalies or operation alerts. Tell me what corrective work orders have been scheduled, and whether new work order should generate.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zero or more the primilar failure code with corresponding work order type. The outcome dependes on the LLM utilzied. Review June 2020 performance of Chiller 9 (CWC04009) at main site, track anomalies and alerts, and evaluate corrective work order needs.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":433,"text":"We are building an early detection system for a potential failure condenser Water side fouling for Chiller 9. Monitor Chiller 9 at main site site from 2020-04-20T12:30:00 to 2020-05-12T19:30:00, identify anomalous behaviors and provide a work order recomendation.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output could be a description of anomalous for fouling and/or a work order recommendation. Monitor Chiller 9 (CWC04009) at main site between 2020-04-20 and 2020-05-12 for anomalies indicating condenser fouling and recommend a corrective work order.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":434,"text":"We are building an early detection system for a potential failure condenser Water side fouling for Chiller 9. Monitor Chiller 9 at main site site from 2020-04-20T12:30:00 to 2020-05-12T19:30:00, identify anomalous behaviors and provide a work order recommendation if there is no such corrective work order created already.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output could be a description of anomalous for fouling and/or a work order recommendation.. Detect condenser fouling anomalies for Chiller 9 (CWC04009) between 2020-04-20 and 2020-05-12, and recommend a work order only if none already exists.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":435,"text":"Assume today is early of July 2020, I would like to review the alerts for chiller 9 with equipment ID CWC04009 for June 2020 and the work order should be generated based on the type of alerts.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Two work order recommendations are suggested due to structural and mechanical issues: one for compressor failure (M010) and another for deformation (M003). Analyze June 2020 alerts for Chiller 9 (CWC04009) and recommend generating appropriate work orders based on alert types.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":436,"text":"Build a predictive model from historical alerts and work orders of CWC04009 to forecast failures and replacement needs over the forthcoming 10-year horizon.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Leverage ALERT and WORK_ORDER records (features: description, event_group, event_category, event_time) for CWC04009 to train and validate a model that predicts the likelihood and timing of future failures or required replacements.","group":"retrospective;predictive;prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":437,"text":"Detect clusters of alerts and work orders on CWC04009 that signal elevated failure risk for the next planning cycle, guiding proactive maintenance budgeting.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Apply time-series burst or clustering analysis to event_time for ALERT + WORK_ORDER events of CWC04009; flag dense clusters as high-risk periods for long-term budgeting.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":438,"text":"Rank alert descriptions for CWC04009 by how strongly they predict subsequent corrective work orders, supporting long-term failure-risk mitigation.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"For each alert description on CWC04009, compute the conditional probability that a CM WORK_ORDER follows within a set window; sort descriptions by predictive strength.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":439,"text":"Analyse sequences where alerts precede corrective work orders on CWC04009 to improve failure anticipation over the asset’s remaining life-cycle.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Identify ALERT → CM WORK_ORDER pairs for CWC04009, measure lead-lag intervals, and summarise patterns that can inform proactive scheduling.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":440,"text":"Using historical counts, project how many preventive (PM) and corrective (CM) work orders each major description category is likely to generate for CWC04009 over the coming decade.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Aggregate yearly PM and CM WORK_ORDER counts for CWC04009 by description and extrapolate future volumes with a simple trend or time-series model.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":441,"text":"Determine which alert or work-order descriptions for CWC04009 exhibit the fastest growth trend, indicating components that may need early replacement in the life-cycle plan.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Compute year-over-year growth rates of event counts by description for CWC04009; highlight those with the steepest increases.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":442,"text":"Examine whether the year-over-year increase in corrective maintenance for CWC04009 warrants shifting resources from annual repairs toward multi-year replacement planning.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Plot CM WORK_ORDER counts per year for CWC04009, assess the upward trend, and recommend budget reallocation if growth is significant.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":443,"text":"Measure typical time gaps between alerts and the corrective work orders they precede for CWC04009 to refine the life-cycle maintenance timeline.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"For each ALERT that is followed by a CM WORK_ORDER on CWC04009, calculate the time interval; summarise median, mean, and distribution to guide scheduling.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":444,"text":"Quantify how often alerts and corrective work orders cluster together for CWC04009 to identify high-risk operational periods in the years ahead.","type":"Workorder","deterministic":false,"category":"Decision Support","characteristic_form":"Use rolling windows on event_time to count co-occurrences of ALERT and CM WORK_ORDER events for CWC04009; flag windows with elevated counts.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":445,"text":"Identify which alert descriptions for CWC04009 show the steepest upward trend and therefore require priority in the 10-year capital-planning roadmap.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Group ALERT events for CWC04009 by description, compute yearly counts, calculate trend slopes, and list the descriptions with the largest positive slopes.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":446,"text":"Determine which alert or work-order descriptions account for the highest event counts on CWC04009 and should therefore drive allocation of funds in the next 10-year capital budget.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Aggregate ALERT and WORK_ORDER events for CWC04009 by description, rank by total count, and provide the top contributors as budget-prioritisation drivers.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":501,"type":"multiagent","text":"Is there any anomaly detected in Chiller 6's Tonnage in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions while ensuring the correct variables, including the asset (Chiller 6), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that IoTAgent was called to request and download the data, and TSFMAgent was properly utilized to perform Time Series anomaly detection on the Tonnage parameter. The response must also verify that the data was accurately stored in the designated file location, and that the analysis results were saved to a new file. Additionally, the response should explicitly confirm the detection of anomalies in Chiller 6's Tonnage during the specified timeframe at the MAIN site, as these anomalies were anticipated.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":502,"type":"multiagent","text":"What is the forecast for 'Chiller 9 Condenser Water Flow' in the week of 2020-04-27 based on data from the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent identified the sensors for the asset and site, then located the specific sensor, 'Chiller 9 Condenser Water Flow'. The response must confirm that the agent retrieved the time-series data for this sensor within the specified timeframe and provided the correct file path where the data is stored. Additionally, the response should verify that TSFMAgent was called to analyze the data and perform forecasting using the specified model checkpoint 'ttm_96_28'. The response should confirm that the agent successfully read the JSON file, performed the time-series forecasting, and stored the results in the designated file path.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":503,"type":"multiagent","text":"Have there been any anomalies in Chiller 6's Tonnage in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and download the Chiller 6 Tonnage data for the specified week, and that the data was stored correctly. The response must also confirm that TSFMAgent was used to analyze the data for anomalies, and that the analysis results were saved in a separate file. Additionally, it should confirm that the dataset contained mote than 400 records and that around 20 anomalies were detected. Finally, the response must be clear, justified, and free from hallucinations, ensuring that all actions were executed accurately and anomalies in Chiller 6's Tonnage during the specified timeframe at MAIN were detected as expected.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":504,"type":"multiagent","text":"Can you forecast Chiller 6's performance for next week based on the data from 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and retrieve the necessary data (specially Chiller 6 Tonnage) for Chiller 6, then used TSFMAgent to analyze the data and generate a forecast for the following week. The response must also confirm that the forecasting results were stored in a designated file and that the model used for forecasting was specified as 'ttm_96_28'.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":505,"type":"multiagent","text":"What's the forecast for Chiller 6's Tonnage for next week based on the data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to retrieve the Chiller 6 Tonnage data for the week of 2020-04-27 at MAIN and attempt to forecast for the next week. It should specify that the agent identified an issue with the missing model checkpoint, but effectively queried available pretrained models using the tsfmmodels tool. The response must confirm that after selecting a suitable model, the agent successfully generated the forecast for the next week.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":506,"type":"multiagent","text":"Is there any anomaly detected in Chiller 9's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and download the Condenser Water Flow data for Chiller 9 at the MAIN site for the specified week. The response must confirm that the agent analyzed the downloaded time-series data for anomalies using TSFMAgent. Additionally, the response should explicitly state that the agent provided the file path where the data is stored and that the analysis results were reviewed. The response must confirm that no anomalies were detected in Chiller 9's Condenser Water Flow during the specified week at the MAIN site.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":507,"type":"multiagent","text":"What is the predicted energy consumption for Chiller 9 in the week of 2020-04-27 based on data from the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent identified the sensor name (power input sensor) and retrieved the historical energy consumption data for Chiller 9 during the specified time period. The response must also explain that the agent attempted to analyze the data for energy consumption prediction, but was unable to do so due to insufficient data, as the power input for Chiller 9 was consistently 0.0 from 2020-04-20 to 2020-04-25, indicating that the chiller was not operating.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":508,"type":"multiagent","text":"Have there been any anomalies in Chiller 6's performance metrics from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent successfully retrieved the Chiller 6 Tonnage sensor data for the specified time range and location. The response must confirm that the agent called TSFMAgent to perform anomaly detection on the data and that the results were saved correctly. Additionally, it should explicitly mention that there were anomalies detected in the Chiller 6 Tonnage data during the specified week.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":509,"type":"multiagent","text":"Can you detect any anomalies in Chiller 6's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent successfully retrieved the Condenser Water Flow data for Chiller 6 at MAIN during the specified time period and then used TSFMAgent to analyze the data for anomalies. The response optionally explain that the agent encountered multiple errors but resolved them by providing the missing timestamp_column, increasing the n_calibration parameter, and adjusting the false_alarm parameter. Additionally, the response should confirm that the anomaly detection was successfully completed and that the results were saved to the specified file. The response must include the file location, the number of records (1 record), and the fact that 0 anomalies were detected in the dataset.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":510,"type":"multiagent","text":"What are the anomaly detection results for Chiller 9's Tonnage and Power Input in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm that the agent successfully executed all required actions to retrieve the time-series data for Chiller 9's Tonnage and Power Input at the MAIN site for the specified time range (2020-04-27 to 2020-05-03). It should specify that the agent determined the data does not exist for the requested time period. The response must also mention that the agent attempted multiple actions to retrieve the data and provided clear evidence of the error encountered during the process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":511,"type":"multiagent","text":"Can you predict Chiller 9's energy usage for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset (Chiller 9) and location (MAIN site) were used for data retrieval and analysis. It should specify that the agent first identified the sensors for Chiller 9, then selected the Chiller 9 Power Input sensor, and successfully retrieved the energy usage data for the specified time period. The response should confirm that the agent provided the file path where the data is stored. Additionally, it should mention that although the agent initially encountered errors while analyzing the data and making predictions, it successfully corrected its mistakes and finetuned a Time Series Forecasting model using the provided data. The agent should have used the finetuned model to generate predictions for the next week, with the results being stored in the specified file.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":512,"type":"multiagent","text":"Has any anomaly been detected in Chiller 6's Return Temperature in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all necessary actions, ensuring that the correct asset (Chiller 6) and location (MAIN) were used to verify the availability of the dataset for the specified time range (week of 2020-04-27). It should specify that the agent queried the history for the Return Temperature sensor, found data observations.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":513,"type":"multiagent","text":"What is the forecast for Chiller 6's Setpoint Temperature for next week based on the week of 2020-04-27 data?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the forecast for Chiller 6 Setpoint Temperature for the next week, based on data from the week of 2020-04-27. It should specify that the agent first requested and downloaded the data from IoTAgent, then used TSFMAgent to analyze the data and generate a forecast. The response should explain that the agent identified the data had a constant value of 45.5 and produced a forecast with the same constant value for the next week. Additionally, the response should mention that the agent handled the error encountered during the forecasting process by selecting a pretrained model, successfully completing the task.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":514,"type":"multiagent","text":"Can you detect any anomalies in Chiller 9's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the detection of anomalies in Chiller 9's Condenser Water Flow during the week of 2020-04-27 at the MAIN site. It should specify that the agent first requested and downloaded the necessary Condenser Water Flow data. Then, it should explain that the agent used TSFMAgent to analyze the data for anomalies, encountered errors with the anomaly detection tool, but correctly identified that no anomalies were detected. The response must clearly state that no anomalies were found.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":515,"type":"multiagent","text":"Can you predict Chiller 9's performance for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the forecasting of Chiller 9's performance for the next week, using data from the specified time period and location. It should specify that the agent first retrieved the performance data for Chiller 9 and then used TSFMAgent to generate the prediction. The response must clarify that the forecasting results were successfully stored and the model used was 'ttm_96_28'.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":516,"type":"multiagent","text":"What's the forecast for Chiller 6's future energy consumption for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task regarding the forecast for Chiller 6's future energy consumption. It should specify that the agent first identified any issues with the sensor name and provided a clear explanation. Then, it should explain that the agent retrieved the correct sensor data for Chiller 6 and used it to generate a forecast. The response must also confirm that the agent handled any exceptions, such as the absence of the required sensor, and provided a clear explanation for this. Additionally, the agent should verify that it successfully read the forecast file and provided the forecast for Chiller 6's future energy consumption, generated using the 'ttm_96_28' model. Finally, the response should clearly state the forecast for Chiller 6's future energy consumption and include any relevant details from the forecasting process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":517,"type":"multiagent","text":"Are there any anomalies detected in Chiller 9's Tonnage in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of anomaly detection for Chiller 9's Tonnage sensor at the MAIN site during the week of 2020-04-27. It should specify that the agent first retrieved the asset history data for Chiller 9's Tonnage sensor for the specified time range. The agent then used TSFMAgent to analyze the data for anomalies and provided a detailed description of the dataset. Anomaly are detected for this query.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":518,"type":"multiagent","text":"Can you forecast energy usage for Chiller 9 for next week using data from the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of forecasting Chiller 9's Power Input. It should specify that the agent first identified and resolved multiple issues, including the missing timestamp column, incorrect model checkpoint, and incorrect target column. After these issues were corrected, the agent used the pretrained model 'ttm_96_28' to generate the forecasting results. The response should emphasize that the agent successfully handled the corrections and produced the forecasting results, with no further errors encountered during the process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":519,"type":"multiagent","text":"Is there any anomaly detected in Chiller 9's Power Input in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task regarding the detection of anomalies in Chiller 9's Power Input. It should specify that the agent first requested and retrieved the necessary Chiller 9 Power Input data from IoTAgent, then used TSFMAgent to analyze the data for anomalies. The response should clarify that the agent successfully identified no anomalies and provide the file path where the data is stored, as well as the location of the output file containing the anomaly detection results.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":520,"type":"multiagent","text":"What is the forecast for Chiller 6's energy consumption for next week based on data from the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of forecasting the energy consumption for the next week. It should specify that the agent first identified the relevant sensor for energy consumption and retrieved the historical data for the specified time range. The agent then verified the structure of the JSON file to ensure it contained the necessary columns, such as the target column 'Chiller 6 Power Input' and the timestamp column 'timestamp'. Despite initial issues with selecting the correct model and parameters, the agent successfully used the correct pretrained model 'ttm_energy_96_28' to analyze the time-series data and forecast the energy consumption. The forecasted results were stored in a file, and the agent provided the file path in the final response.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":601,"type":"multiagent","text":"List all failure modes of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes for Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":602,"type":"multiagent","text":"List all failure modes of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes of asset Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":603,"type":"multiagent","text":"List all installed sensors of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The installed sensors of asset Chiller 6 are: Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":604,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by Chiller 6 Chiller Efficiency.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":605,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":606,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":607,"type":"multiagent","text":"Get failure modes for Chiller 6 at MAIN site and only include in final response those that can be monitored using the available sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":608,"type":"multiagent","text":"Are there any failure modes of Chiller 6 at MAIN site that can be predicted by monitoring the vibration sensor data?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":609,"type":"multiagent","text":"List all sensors of Chiller 6 at MAIN site that are potentially relevant to Compressor Overheating.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":610,"type":"multiagent","text":" If compressor overheating occurs for Chiller 6 at MAIN site, which sensor should be prioritized for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":611,"type":"multiagent","text":" If Evaporator Water side fouling occurs for Chiller 6 at MAIN site, which sensor is most relevant for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":612,"type":"multiagent","text":"What are the failure modes of Chiller 6 at MAIN site that can be identified by analyzing the data from the available sensors?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":613,"type":"multiagent","text":"Generate an anomaly detection recipe for detecting compressor motor failure for Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a detailed anomaly detection recipe for detecting compressor motor failure for chiller","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":614,"type":"multiagent","text":"Purge unit of chiller 6 at MAIN site have possibility to excess purge, what is the plan by the maintenance experts to early detect the failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a plan by the maintenance experts to early detect the failure of purge unit of chiller 6. the answer should include the sensors that can be used to detect the failure of purge unit of chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":615,"type":"multiagent","text":"Generate a machine learning recipe for detecting overheating failure for Chiller 6 at MAIN site. Result should include feature sensors and target sensor.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a machine learning recipe for detecting overheating failure for Chiller 6. the answer should include the sensors that can be used to detect the failure of overheating for Chiller 6","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":616,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":617,"type":"multiagent","text":"When compressor motor of Chiller 6 at MAIN site fails, what is the temporal behavior of the power input?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should describe the temporal behavior of the power input of Chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":618,"type":"multiagent","text":"When power input of Chiller 6 at MAIN site drops, what is the potential failure that causes it?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":619,"type":"multiagent","text":"When the Liquid Refrigerant Evaporator Temperature of Chiller 6 at MAIN site drops, what failure is most likely to occur?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":620,"type":"multiagent","text":"I want to build an anomaly model for identifying a chiller trip failure for MAIN chiller 6. Provide me a list of sensors that I should use, along with the temporal behavior,","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain how to build an anomaly model for identifying a chiller trip failure for MAIN chiller 6. The answer should include sensors that I should use, along with the temporal behavior,","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":621,"type":"multiagent","text":"Can you check if there are any anomalies for chiller tonnage, and do you think I should create a work order after reviewing the anomalies?","category":"Knowledge Query","deterministic":false,"characteristic_form":"The process involves retrieving IoT sensor data, performing time-series anomaly detection, and using maintenance reasoning to decide whether a work order should be created.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":622,"type":"multiagent","text":"Here is an output of anomaly model in file with absolute path '/tmp/tsad_conformal.csv', can you check if there are any anomalies, and do you think I should create a work order after reviewing the anomalies?","category":"Knowledge Query","deterministic":false,"characteristic_form":"The problem is solved by first checking if the anomaly file exists, then running anomaly detection if the data is available, and finally deciding whether a work order should be created based on the results.","group":"retrospective;predictive","entity":"Equipment","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} diff --git a/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl b/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl new file mode 100644 index 000000000..564780f4c --- /dev/null +++ b/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl @@ -0,0 +1,88 @@ +{"id": 1, "type": "FMSR", "text": "List all failure modes of electric motor that can be detected by vibration, cooling gas, or axial flux.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [loss of input power phase, stator windings fault, bearing damage, insulation deterioration, eccentric rotor fault, misalignment, unbalance, brush(es) fault, rotor windings fault]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 2, "type": "FMSR", "text": "List all failure modes of electric motor that can be detected by monitoring the sensors power, current, and vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [brush(es) fault, rotor windings fault, loss of input power phase, eccentric rotor fault, bearing damage, misalignment, stator windings fault, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 3, "type": "FMSR", "text": "List all failure modes of steam turbine that can be detected by vibration, oil debris, or length measurement.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of steam turbine. The failure modes of steam turbine need to be from the list [bearing damage, unbalance, eccentric rotor, damaged rotor blade, hogging or sagging rotor, damaged labyrinth, misalignment, unequal expansion, bearing wear]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 4, "type": "FMSR", "text": "For a steam turbine, list all the failure modes that can be detected by monitoring the sensors vibration, oil debris, and temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of steam turbine. The failure modes of steam turbine need to be from the list [bearing damage, misalignment, unequal expansion, damaged labyrinth, bearing wear, damaged rotor blade, hogging or sagging rotor, eccentric rotor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 5, "type": "FMSR", "text": "For aero gas turbine, list all the failure modes that can be detected or indicated by abnormal readings from vibration, speed, or fuel pressure/fuel flow.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes of aero gas turbine need to be from the list [compressor damaged, power turbine dirty, compressor stall, misalignment, unbalance, seal leakage, combustion chamber holed, fuel filter blockage, air inlet blockage, burner blocked, compressor fouled, gear defects, power turbine damage, bearing wear/damage]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 6, "type": "FMSR", "text": "For aero gas turbine, list all the failure modes that can be detected by the sensors oil debris, compresor pressure/ pressure ratio, and air flow.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes of aero gas turbine need to be from the list [power turbine damage, compressor stall, bearing wear/ damage, compressor damaged, seal leakage, power turbine dirty, air inlet blockage, compressor fouled, burner blocked, unbalance, misalignment, combustion chamber holed, gear defects, speed]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 7, "type": "FMSR", "text": "List all failure modes of industrial gas turbine that can be detected by abnormal readings in speed, air flow, exhaust temperature, fuel pressure/fuel flow, compressor efficiency, and vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of industrial gas turbine. The failure modes of industrial gas turbine need to be from the list [burner blocked, compressor fouled, bearing wear, misalignment, unbalance, compressor damaged, power turbine damaged, combustion chamber holed, air inlet blockage, fuel filter blockage]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 8, "type": "FMSR", "text": "List all failure modes of industrial gas turbine that can be detected by monitoring vibration, compressor pressure, and output power.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of industrial gas turbine. The failure modes of industrial gas turbine need to be from the list [unbalance, compressor fouled, combustion chamber holed, power turbine damaged, air inlet blockage, bearing wear, compressor damaged]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 9, "type": "FMSR", "text": "List all failure modes of pump that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [bearing damage, bearing wear, unbalance, misalignment, mounting fault, damaged impeller, eccentric impeller, damaged seals]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 10, "type": "FMSR", "text": "List all failure modes of pump that can be detected by vibration sensor.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [bearing damage, bearing wear, damaged impeller, eccentric impeller, misalignment, mounting fault, damaged seals]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 11, "type": "FMSR", "text": "What sensors can be used to detect winding deformation, oil leakage, or overheating in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation, oil leakage, or overheating in a power transformer. Example sensors: [Dissolved Gas Analyzer, Oil Level Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 12, "type": "FMSR", "text": "List all failure modes of compressor that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of compressor. The failure modes of compressor need to be from the list [eccentric impeller, compressor stall, unbalance, misalignment, damaged impeller, mounting fault, bearing wear, damaged seals, valve fault, fluid leakage, oil leakage, coast down time, cooling system fault, power, length measurement, pressure or vacuum, speed, oil debris, temperature]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 13, "type": "FMSR", "text": "For a compressor, list all the failure modes that can be detected or are irrelevant when the sensors pressure or vacuum, speed, and vibration show abnormal readings.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of compressor. The failure modes of compressor need to be from the list [damaged seals, damaged impeller, eccentric impeller, misalignment, compressor stall, unbalance, cooling system fault, valve fault, bearing wear, bearing damage, mounting fault]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 14, "type": "FMSR", "text": "List all failure modes of reciprocating internal combustion engine that can be detected by monitoring cylinder pressure, fuel flow, vibration, oil debris, or exhaust temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of reciprocating internal combustion engine. The failure modes of reciprocating internal combustion engine need to be from the list [fuel injector fault, bearing wear, ignition fault, fuel filter blockage, unbalance, cooling system fault, piston ring fault]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 15, "type": "FMSR", "text": "List all failure modes of reciprocating internal combustion engine that can be detected by monitoring oil debris and cylinder pressure.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of reciprocating internal combustion engine. The failure modes of reciprocating internal combustion engine need to be from the list [piston ring fault, bearing wear, seal leakage, flywheel damage, gear defects, mounting fault, unbalance, ignition fault, fuel injector fault, air inlet blockage, fuel filter blockage, cooling system fault, misalignment]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 16, "type": "FMSR", "text": "List all failure modes of electric generator that can be detected by monitoring vibration and temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric generator. The failure modes of electric generator need to be from the list [rotor windings fault, unbalance, eccentric rotor, brush(es) fault, loss of output power phase, misalignment, bearing damage, stator windings fault, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 17, "type": "FMSR", "text": "List all failure modes of electric generator that can be detected by vibration sensor.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric generator. The failure modes of electric generator need to be from the list [unbalance, bearing damage, stator windings fault, eccentric rotor, brush(es) fault, loss of output power phase, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 18, "type": "FMSR", "text": "List all failure modes of fan that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of fan. The failure modes of fan need to be from the list [bearing wear, damaged bellows, damaged oil seals, mounting fault, eccentric impeller, misalignment, rotor fouled, unbalance, damaged impeller]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 19, "type": "FMSR", "text": "List all failure modes of fan that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of fan. The failure modes of fan need to be from the list [unbalance, misalignment, mounting fault, bearing damage, eccentric impeller, damaged impeller, rotor fouled]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 20, "type": "FMSR", "text": "List all failure modes of power transformer that can be detected by dissolved gas analysis, temperature, or ultrasound.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [oil leak, winding distortion, through fault e.g. lightning strike, external damage/ disturbance, de-energized tap-changer condition/ fault, oil quality deterioration, core looseness, winding looseness, on-load tap-changer condition/ fault, moisture ingress/ content, arcing/ electrical discharge, supply faults, e.g. excessive harmonics and over fluxing, low oil level, insulation deterioration]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 21, "type": "FMSR", "text": "For a power transformer, list all the failure modes that can be detected or indicated by an abnormal reading from the sensor dissolved gas analysis or frequency response analysis (fra).", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [winding looseness, core looseness, external damage/ disturbance, de-energized tap-changer condition/ fault, on-load tap-changer condition/ fault, overheating/ auxiliary cooling system fault, oil quality deterioration, low oil level, through fault e.g. lightning strike, winding distortion, arcing/ electrical discharge, connection/ bushing faults, moisture ingress/ content, insulation deterioration]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 22, "type": "FMSR", "text": "What are the failure modes of an electric motor that can be identified using a combination of vibration analysis, temperature monitoring, and current signature analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [bearing failure, stator winding failure, rotor bar failure, misalignment, imbalance, lubrication issues]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 23, "type": "FMSR", "text": "What are the failure modes of an electric motor that can be identified using a combination of vibration analysis, temperature monitoring, and current signature analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [bearing failure, stator winding failure, rotor bar failure, misalignment, imbalance, lubrication issues]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 24, "type": "FMSR", "text": "What are the failure modes of an aero gas turbine that can be identified by monitoring the vibration, temperature, and fuel flow sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade damage, combustion issue, compressor stall, fuel system malfunction]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 25, "type": "FMSR", "text": "What are the failure modes of an aero gas turbine that can be identified using a combination of vibration, temperature, and oil pressure sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade damage, combustion issue, lubrication failure, compressor stall, turbine overheat]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 26, "type": "FMSR", "text": "What are the possible failure modes of the pump that can be identified using the vibration sensor, flow rate sensor, and pressure sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the pump. The failure modes of the pump need to be from the list [cavitation, bearing failure, impeller damage, seal leakage, motor overheating]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 27, "type": "FMSR", "text": "What are the possible failure modes of a pump that can be identified using a combination of vibration, pressure, and flow rate sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [cavitation, bearing failure, seal leakage, impeller damage, motor overheating]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 28, "type": "FMSR", "text": "What are the failure modes of the compressor that can be identified using the vibration sensor, pressure sensor, and temperature sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the compressor. The failure modes of the compressor need to be from the list [Bearing Failure, Impeller Damage, Seal Leakage, Valve Failure, Motor Overheating]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 29, "type": "FMSR", "text": "What are the failure modes of the compressor that can be identified using the vibration sensor, pressure sensor, and temperature sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the compressor. The failure modes of the compressor need to be from the list [Bearing Failure, Impeller Damage, Seal Leakage, Valve Failure, Motor Overheating]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 30, "type": "FMSR", "text": "What are the failure modes of a reciprocating internal combustion engine that can be identified using a combination of vibration analysis, temperature monitoring, and oil analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [Piston failure, Bearing failure, Valve failure, Crankshaft failure, Cylinder head failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 31, "type": "FMSR", "text": "What are the failure modes of a reciprocating internal combustion engine that can be identified using a combination of vibration, temperature, and pressure sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [Piston failure, Bearing failure, Valve failure, Crankshaft failure, Cylinder head failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 32, "type": "FMSR", "text": "What are the possible failure modes of an electric generator that can be identified using vibration analysis, temperature monitoring, and oil analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the electric generator. The failure modes need to be from the list [Bearing Failure, Rotor Imbalance, Stator Winding Failure, Cooling System Failure, Fuel System Failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 33, "type": "FMSR", "text": "What are the failure modes of an electric generator that can be identified using a combination of vibration, temperature, and voltage sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the electric generator. The failure modes need to be from the list [bearing failure, stator winding failure, rotor imbalance, voltage regulator failure, fuel system failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 34, "type": "FMSR", "text": "What are the possible failure modes of a fan that can be identified using data from vibration, noise, and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a fan. The failure modes of a fan need to be from the list [unbalanced blade, worn-out bearing, loose mounting, faulty motor, clogged airways]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 35, "type": "FMSR", "text": "What are the possible failure modes of a fan that can be identified using data from vibration, noise, and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a fan. The failure modes of a fan need to be from the list [unbalanced blades, worn-out bearings, loose mounting, faulty motor, misalignment]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 36, "type": "FMSR", "text": "What failure modes of a power transformer can be identified using a combination of dissolved gas analysis, oil level monitoring, and temperature monitoring?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [Insulation Failure, Overheating, Winding Deformation, Oil Leakage, Bushing Failure]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 37, "type": "FMSR", "text": "What failure modes of a power transformer can be identified using a combination of dissolved gas analysis and partial discharge measurement?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [insulation failure, winding deformation, overheating]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 38, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and overheating in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and overheating related failure modes in an electric motor. The sensors need to be from the list [vibration sensor, temperature sensor, thermographic sensor, current sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 39, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a steam turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of a steam turbine. The sensors need to be from the list [Vibration Sensor, Temperature Sensor, Thermographic Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 40, "type": "FMSR", "text": "For an aero gas turbine, which failure modes can be detected using a combination of vibration analysis and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes need to be from the list [bearing failure, blade failure, combustion instability, compressor stall, fuel system malfunction, high cycle fatigue, low cycle fatigue, oil leakage, shaft imbalance]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 41, "type": "FMSR", "text": "Which failure modes of an aero gas turbine can be detected using a combination of vibration analysis and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade failure, combustion instability, compressor stall, fuel system malfunction, high cycle fatigue, low cycle fatigue, oil leakage, rotor imbalance, turbine inlet temperature exceedance]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 42, "type": "FMSR", "text": "For an industrial gas turbine, which sensors are most effective for detecting failure modes related to vibration and high temperature?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors need to be from the list [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 43, "type": "FMSR", "text": "For an industrial gas turbine, which sensors are most effective for detecting failure modes related to vibration and high temperature?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors related to industrial gas turbine. The sensors need to be from the list [Vibration Sensor, Thermographic Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 44, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of the compressor. The sensors need to be from the list [vibration sensor, temperature sensor, pressure sensor, thermographic sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 45, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of the compressor. The sensors need to be from the list [vibration sensor, temperature sensor, pressure sensor, thermographic sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 46, "type": "FMSR", "text": "Which failure modes of a reciprocating internal combustion engine can be detected using a combination of vibration and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [bearing failure, lubrication failure, cylinder head failure, piston ring failure, crankshaft failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 47, "type": "FMSR", "text": "Which failure modes of a reciprocating internal combustion engine can be detected using a combination of vibration and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [bearing failure, lubrication failure, cylinder head failure, piston ring failure, crankshaft failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 48, "type": "FMSR", "text": "Which failure modes of an electric generator can be detected using a combination of vibration and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an electric generator. The failure modes need to be from the list [bearing failure, imbalance, misalignment, electrical fault, cooling system failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 49, "type": "FMSR", "text": "For a power transformer, which failure modes can be detected using a combination of thermographic and vibration sensors, and what are their corresponding detection reliabilities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer and their corresponding detection reliabilities. The failure modes need to be from the list [overheating, winding deformation, vibration failure, oil leakage, insulation failure]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 50, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, and stator winding faults in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, and stator winding faults in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 51, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, and stator winding faults in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, and stator winding faults in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 52, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in a steam turbine: vibration, overheating, and low oil pressure?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting vibration, overheating, and low oil pressure in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 53, "type": "FMSR", "text": "What are the relevant sensors for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine?", "category": "Recommendation", "characteristic_form": "The answer should contain a list of one or more sensors relevant for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 54, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and high pressure turbine blade failure in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and high pressure turbine blade failure in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Compressor Discharge Pressure, Fuel Flow]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 55, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 56, "type": "FMSR", "text": "What are the most relevant sensors for detecting combustion issues, such as flame instability or fuel starvation, in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion issues like flame instability or fuel starvation in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Flame Detector, Fuel Flow Meter]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 57, "type": "FMSR", "text": "What are the relevant sensors for detecting combustion issues, bearing failures, and compressor fouling in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion issues, bearing failures, and compressor fouling in an industrial gas turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 58, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, bearing failure, and seal leakage in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, bearing failure, and seal leakage in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 59, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, impeller damage, and bearing failure in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, impeller damage, and bearing failure in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 60, "type": "FMSR", "text": "What are the relevant sensors for detecting failure modes related to mechanical issues or performance degradation in a compressor?", "category": "Recommendation", "characteristic_form": "The answer should list one or more sensors relevant for detecting mechanical issues or performance degradation in a compressor. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 61, "type": "FMSR", "text": "What are the sensors that can be used to detect failure modes related to mechanical issues or performance degradation in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting mechanical issues or performance degradation in a compressor. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 62, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 63, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 64, "type": "FMSR", "text": "What sensors can be used to identify potential issues with an electric generator, including overheating, vibration, and output voltage irregularities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting issues like overheating, vibration, and output voltage irregularities in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Voltage Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 65, "type": "FMSR", "text": "What sensors can be used to identify potential issues with an electric generator, including overheating, vibration, and output voltage irregularities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting issues like overheating, vibration, and output voltage irregularities in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Voltage Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 66, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 67, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 68, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and insulation degradation in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and insulation degradation in a power transformer. Example sensors: [Dissolved Gas Analysis (DGA), Frequency Response Analysis (FRA), Partial Discharge (PD) monitoring]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 69, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and oil leakage in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and oil leakage in a power transformer. Example sensors: [Dissolved Gas Analyzer, Oil Level Sensor, Frequency Response Analyzer]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 70, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, or imbalance in an electric motor?", "category": "Recommendation", "characteristic_form": "The answer should list one or more sensors relevant for detecting bearing wear, misalignment, or imbalance in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 71, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, or imbalance in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, or imbalance in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 72, "type": "FMSR", "text": "What are the relevant sensors for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine?", "category": "Recommendation", "characteristic_form": "The answer should contain a list of one or more sensors relevant for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 73, "type": "FMSR", "text": "What are the relevant sensors for detecting multiple failure modes, including vibration issues and lubrication problems, in a steam turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting vibration issues and lubrication problems in a steam turbine. Example sensors: [Vibration Sensor, Oil Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 74, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Fuel Flow Rate, Compressor Discharge Pressure]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 75, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Fuel Flow Rate, Compressor Discharge Pressure]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 76, "type": "FMSR", "text": "What are the most relevant sensors for detecting combustion issues, such as flame instability or fuel starvation, in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion issues like flame instability or fuel starvation in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Combustion Chamber Pressure Sensor, Fuel Flow Meter]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 77, "type": "FMSR", "text": "What are the relevant sensors for detecting combustion issues, turbine blade damage, or compressor fouling in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion issues, turbine blade damage, or compressor fouling in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Vibration Sensor, Compressor Inlet Temperature Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 78, "type": "FMSR", "text": "What are the sensors that can be used to detect cavitation, bearing failure, or seal leakage in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, bearing failure, or seal leakage in a pump. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Flow Rate Sensor, Acoustic Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 79, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, impeller damage, and bearing failure in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, impeller damage, and bearing failure in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 80, "type": "FMSR", "text": "What are the sensors that can be used to detect bearing failure, excessive vibration, or low lubrication in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing failure, excessive vibration, or low lubrication in a compressor. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 81, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in a compressor: bearing failure, seal leakage, and excessive vibration?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting bearing failure, seal leakage, and excessive vibration in a compressor. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Acoustic Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 82, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 83, "type": "FMSR", "text": "What sensors can be used to identify abnormal wear or damage in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting abnormal wear or damage in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Oil Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 84, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in an electric generator: overheating, vibration, and electrical insulation breakdown?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting overheating, vibration, and electrical insulation breakdown in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Partial Discharge Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 85, "type": "FMSR", "text": "What sensors can be used to identify potential mechanical or electrical failures in an electric generator?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting mechanical or electrical failures in an electric generator. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 86, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 87, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 88, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and insulation degradation in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and insulation degradation in a power transformer. Example sensors: [Dissolved Gas Analysis (DGA), Frequency Response Analysis (FRA), Partial Discharge (PD) monitoring]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} diff --git a/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl b/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl new file mode 100644 index 000000000..bf4d4712d --- /dev/null +++ b/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl @@ -0,0 +1,120 @@ +{"id": 1000, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU HUR00118 between 2021-04-11T23:00:00.000Z and 2021-04-12T05:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-04-11T23:00:00.000Z and 2021-04-12T05:15:00.000Z"} +{"id": 1001, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1156 between 2019-03-19T18:30:00.000Z and 2019-03-19T23:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-19T18:30:00.000Z and 2019-03-19T23:15:00.000Z"} +{"id": 1002, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU Y15150AC between 2019-02-16T17:00:00.000Z and 2019-02-16T20:00:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-16T17:00:00.000Z and 2019-02-16T20:00:00.000Z"} +{"id": 1003, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5044 between 2020-02-13T10:15:00.000Z and 2020-02-13T12:30:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-13T10:15:00.000Z and 2020-02-13T12:30:00.000Z"} +{"id": 1004, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU D15150BH between 2020-06-27T11:00:00.000Z and 2020-06-28T08:15:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-27T11:00:00.000Z and 2020-06-28T08:15:00.000Z"} +{"id": 1005, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004507 between 2020-02-03T16:00:00.000Z and 2020-02-03T22:59:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-03T16:00:00.000Z and 2020-02-03T22:59:00.000Z"} +{"id": 1006, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU NCAF028 between 2020-10-08T21:00:00.000Z and 2020-10-09T02:02:00.000Z according to: An anomaly is detected when the AHU is running, and either the filter differential pressure exceeds the supply filter static pressure setpoint, or the difference between post- and pre-filter bank pressures exceeds the setpoint (or 1.0 if the setpoint isn't available). At the same time, the supply fan output is above 50%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-08T21:00:00.000Z and 2020-10-09T02:02:00.000Z"} +{"id": 1007, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU NCAF028 between 2020-09-10T19:45:00.000Z and 2020-09-10T23:23:00.000Z according to: An anomaly is detected when the AHU is running, and either the filter differential pressure exceeds the supply filter static pressure setpoint, or the difference between post- and pre-filter bank pressures exceeds the setpoint (or 1.0 if the setpoint isn't available). At the same time, the supply fan output is above 50%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-10T19:45:00.000Z and 2020-09-10T23:23:00.000Z"} +{"id": 1008, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004511 between 2021-05-17T05:00:00.000Z and 2021-05-17T09:57:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-05-17T05:00:00.000Z and 2021-05-17T09:57:00.000Z"} +{"id": 1009, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004507 between 2020-01-12T10:45:00.000Z and 2020-01-12T15:00:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-12T10:45:00.000Z and 2020-01-12T15:00:00.000Z"} +{"id": 1010, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004511 between 2022-05-28T20:30:00.000Z and 2022-05-29T00:45:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-28T20:30:00.000Z and 2022-05-29T00:45:00.000Z"} +{"id": 1011, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A038 between 2020-07-30T15:00:00.000Z and 2020-07-31T00:00:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-30T15:00:00.000Z and 2020-07-31T00:00:00.000Z"} +{"id": 1012, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU ILCACS3B between 2021-10-03T16:15:00.000Z and 2021-10-04T02:30:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-10-03T16:15:00.000Z and 2021-10-04T02:30:00.000Z"} +{"id": 1013, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A059 between 2020-07-30T16:30:00.000Z and 2020-07-31T00:15:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-30T16:30:00.000Z and 2020-07-31T00:15:00.000Z"} +{"id": 1014, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153CA between 2020-01-10T16:45:00.000Z and 2020-01-11T03:03:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-10T16:45:00.000Z and 2020-01-11T03:03:00.000Z"} +{"id": 1015, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CE between 2020-04-29T00:45:00.000Z and 2020-04-29T11:00:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-29T00:45:00.000Z and 2020-04-29T11:00:00.000Z"} +{"id": 1016, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153EA between 2020-02-11T11:45:00.000Z and 2020-02-11T23:33:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-11T11:45:00.000Z and 2020-02-11T23:33:00.000Z"} +{"id": 1017, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004508 between 2019-02-25T16:00:00.000Z and 2019-02-25T18:15:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-25T16:00:00.000Z and 2019-02-25T18:15:00.000Z"} +{"id": 1018, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004501 between 2021-12-08T13:00:00.000Z and 2021-12-08T16:45:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-12-08T13:00:00.000Z and 2021-12-08T16:45:00.000Z"} +{"id": 1019, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004501 between 2022-04-27T12:00:00.000Z and 2022-04-27T14:30:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-04-27T12:00:00.000Z and 2022-04-27T14:30:00.000Z"} +{"id": 1020, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-02-14T14:15:00.000Z and 2019-02-16T13:45:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-14T14:15:00.000Z and 2019-02-16T13:45:00.000Z"} +{"id": 1021, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1991 between 2019-01-09T10:30:00.000Z and 2019-01-09T16:13:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-09T10:30:00.000Z and 2019-01-09T16:13:00.000Z"} +{"id": 1022, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5078 between 2020-12-28T15:45:00.000Z and 2020-12-28T18:45:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-28T15:45:00.000Z and 2020-12-28T18:45:00.000Z"} +{"id": 1023, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU CHQACS3 between 2021-08-10T10:30:00.000Z and 2021-08-10T23:10:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-10T10:30:00.000Z and 2021-08-10T23:10:00.000Z"} +{"id": 1024, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU BAU00015 between 2019-01-14T20:00:00.000Z and 2019-01-15T07:59:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T20:00:00.000Z and 2019-01-15T07:59:00.000Z"} +{"id": 1025, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU BAU00016 between 2019-02-14T21:30:00.000Z and 2019-02-15T07:15:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-14T21:30:00.000Z and 2019-02-15T07:15:00.000Z"} +{"id": 1026, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004510 between 2022-03-02T12:00:00.000Z and 2022-03-02T15:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-03-02T12:00:00.000Z and 2022-03-02T15:15:00.000Z"} +{"id": 1027, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004506B between 2022-01-26T19:15:00.000Z and 2022-01-26T21:51:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-01-26T19:15:00.000Z and 2022-01-26T21:51:00.000Z"} +{"id": 1028, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004510 between 2022-03-09T06:47:00.000Z and 2022-03-09T17:29:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-03-09T06:47:00.000Z and 2022-03-09T17:29:00.000Z"} +{"id": 1029, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 315150BG between 2020-08-01T11:15:00.000Z and 2020-08-04T18:45:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-01T11:15:00.000Z and 2020-08-04T18:45:00.000Z"} +{"id": 1030, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 0104200000 between 2020-07-23T12:00:00.000Z and 2020-07-23T16:52:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-23T12:00:00.000Z and 2020-07-23T16:52:00.000Z"} +{"id": 1031, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 315150BG between 2020-08-17T19:30:00.000Z and 2020-08-18T08:30:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-17T19:30:00.000Z and 2020-08-18T08:30:00.000Z"} +{"id": 1032, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2022-05-22T14:00:00.000Z and 2022-05-25T20:15:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-22T14:00:00.000Z and 2022-05-25T20:15:00.000Z"} +{"id": 1033, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2022-05-29T04:00:00.000Z and 2022-05-29T12:30:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-29T04:00:00.000Z and 2022-05-29T12:30:00.000Z"} +{"id": 1034, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2020-10-21T17:15:00.000Z and 2020-10-21T19:51:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-21T17:15:00.000Z and 2020-10-21T19:51:00.000Z"} +{"id": 1035, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153AI between 2019-04-15T23:30:00.000Z and 2019-04-16T04:00:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-04-15T23:30:00.000Z and 2019-04-16T04:00:00.000Z"} +{"id": 1036, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153EB between 2021-03-04T01:45:00.000Z and 2021-03-04T07:25:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-04T01:45:00.000Z and 2021-03-04T07:25:00.000Z"} +{"id": 1037, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CE between 2020-04-18T23:00:00.000Z and 2020-04-19T13:30:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-18T23:00:00.000Z and 2020-04-19T13:30:00.000Z"} +{"id": 1038, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-02-13T12:15:00.000Z and 2020-02-13T22:15:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-13T12:15:00.000Z and 2020-02-13T22:15:00.000Z"} +{"id": 1039, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-03-06T12:15:00.000Z and 2020-03-06T22:15:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-06T12:15:00.000Z and 2020-03-06T22:15:00.000Z"} +{"id": 1040, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 343101 between 2020-08-23T16:30:00.000Z and 2020-08-24T07:00:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-23T16:30:00.000Z and 2020-08-24T07:00:00.000Z"} +{"id": 1041, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004512 between 2019-02-22T13:30:00.000Z and 2019-02-23T01:16:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-22T13:30:00.000Z and 2019-02-23T01:16:00.000Z"} +{"id": 1042, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004512 between 2019-01-14T06:00:00.000Z and 2019-01-15T01:17:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T06:00:00.000Z and 2019-01-15T01:17:00.000Z"} +{"id": 1043, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A068 between 2019-03-02T16:30:00.000Z and 2019-03-02T18:45:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-02T16:30:00.000Z and 2019-03-02T18:45:00.000Z"} +{"id": 1044, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CH between 2020-02-19T22:02:00.000Z and 2020-02-20T11:46:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-19T22:02:00.000Z and 2020-02-20T11:46:00.000Z"} +{"id": 1045, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215153CE between 2019-01-27T05:00:00.000Z and 2019-01-28T14:40:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-27T05:00:00.000Z and 2019-01-28T14:40:00.000Z"} +{"id": 1046, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU B010510000511 between 2022-08-30T15:45:00.000Z and 2022-08-31T04:15:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-08-30T15:45:00.000Z and 2022-08-31T04:15:00.000Z"} +{"id": 1047, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU090301 between 2019-03-01T11:58:00.000Z and 2019-03-01T22:43:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-01T11:58:00.000Z and 2019-03-01T22:43:00.000Z"} +{"id": 1048, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A195 between 2021-02-11T11:00:00.000Z and 2021-02-12T00:00:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-11T11:00:00.000Z and 2021-02-12T00:00:00.000Z"} +{"id": 1049, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-04-03T21:15:00.000Z and 2020-04-04T16:00:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-03T21:15:00.000Z and 2020-04-04T16:00:00.000Z"} +{"id": 1050, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5024 between 2020-03-06T14:15:00.000Z and 2020-03-06T20:30:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-06T14:15:00.000Z and 2020-03-06T20:30:00.000Z"} +{"id": 1051, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5041 between 2020-12-11T15:00:00.000Z and 2020-12-12T00:16:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-11T15:00:00.000Z and 2020-12-12T00:16:00.000Z"} +{"id": 1052, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5008 between 2021-02-17T05:00:00.000Z and 2021-02-17T23:55:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-17T05:00:00.000Z and 2021-02-17T23:55:00.000Z"} +{"id": 1053, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-02-21T17:00:00.000Z and 2019-02-23T05:00:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-21T17:00:00.000Z and 2019-02-23T05:00:00.000Z"} +{"id": 1054, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1991 between 2019-03-26T09:15:00.000Z and 2019-03-26T14:15:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-26T09:15:00.000Z and 2019-03-26T14:15:00.000Z"} +{"id": 1055, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-03-19T15:30:00.000Z and 2019-03-20T03:29:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-19T15:30:00.000Z and 2019-03-20T03:29:00.000Z"} +{"id": 1056, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2019-02-20T14:17:00.000Z and 2019-02-21T04:59:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-20T14:17:00.000Z and 2019-02-21T04:59:00.000Z"} +{"id": 1057, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2019-01-29T21:15:00.000Z and 2019-01-30T10:45:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-29T21:15:00.000Z and 2019-01-30T10:45:00.000Z"} +{"id": 1058, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02606 between 2019-01-14T16:15:00.000Z and 2019-01-15T12:30:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T16:15:00.000Z and 2019-01-15T12:30:00.000Z"} +{"id": 1059, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-06T21:45:00.000Z and 2020-05-07T01:00:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-06T21:45:00.000Z and 2020-05-07T01:00:00.000Z"} +{"id": 1060, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-08T04:30:00.000Z and 2020-05-08T06:45:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-08T04:30:00.000Z and 2020-05-08T06:45:00.000Z"} +{"id": 1061, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-08T00:45:00.000Z and 2020-05-08T03:30:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-08T00:45:00.000Z and 2020-05-08T03:30:00.000Z"} +{"id": 1062, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2021-03-20T05:15:00.000Z and 2021-03-20T10:00:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-20T05:15:00.000Z and 2021-03-20T10:00:00.000Z"} +{"id": 1063, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2020-01-16T23:15:00.000Z and 2020-01-17T15:29:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-16T23:15:00.000Z and 2020-01-17T15:29:00.000Z"} +{"id": 1064, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2020-11-10T13:44:00.000Z and 2020-11-10T20:20:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-10T13:44:00.000Z and 2020-11-10T20:20:00.000Z"} +{"id": 1065, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 343514 between 2019-01-18T00:01:00.000Z and 2019-01-18T05:50:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-18T00:01:00.000Z and 2019-01-18T05:50:00.000Z"} +{"id": 1066, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710OC between 2020-12-15T05:00:00.000Z and 2020-12-15T15:15:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-15T05:00:00.000Z and 2020-12-15T15:15:00.000Z"} +{"id": 1067, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 343369 between 2019-03-28T14:46:00.000Z and 2019-03-29T06:59:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-28T14:46:00.000Z and 2019-03-29T06:59:00.000Z"} +{"id": 1068, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU71ETW between 2020-11-20T20:30:00.000Z and 2020-11-23T02:45:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-20T20:30:00.000Z and 2020-11-23T02:45:00.000Z"} +{"id": 1069, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU71ETZ between 2021-01-13T05:00:00.000Z and 2021-02-05T05:00:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-01-13T05:00:00.000Z and 2021-02-05T05:00:00.000Z"} +{"id": 1070, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710VN between 2020-06-24T14:25:00.000Z and 2020-07-25T21:21:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-24T14:25:00.000Z and 2020-07-25T21:21:00.000Z"} +{"id": 1071, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710OA between 2020-10-20T13:30:00.000Z and 2020-10-20T18:15:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-20T13:30:00.000Z and 2020-10-20T18:15:00.000Z"} +{"id": 1072, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 5003E8CRA017 between 2019-03-14T22:15:00.000Z and 2019-03-15T17:00:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-14T22:15:00.000Z and 2019-03-15T17:00:00.000Z"} +{"id": 1073, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU012SJ between 2020-03-28T19:00:00.000Z and 2020-03-29T01:45:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-28T19:00:00.000Z and 2020-03-29T01:45:00.000Z"} +{"id": 1074, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 5003D7CRA002 between 2019-02-11T18:30:00.000Z and 2019-02-12T14:15:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-11T18:30:00.000Z and 2019-02-12T14:15:00.000Z"} +{"id": 1075, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710ND between 2021-09-15T14:45:00.000Z and 2021-09-16T12:34:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-15T14:45:00.000Z and 2021-09-16T12:34:00.000Z"} +{"id": 1076, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710NB between 2019-01-24T12:45:00.000Z and 2019-01-25T03:45:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-24T12:45:00.000Z and 2019-01-25T03:45:00.000Z"} +{"id": 1077, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02006 between 2019-02-18T17:00:00.000Z and 2019-03-04T14:45:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-18T17:00:00.000Z and 2019-03-04T14:45:00.000Z"} +{"id": 1078, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02007 between 2021-09-16T16:30:00.000Z and 2021-09-20T16:30:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-16T16:30:00.000Z and 2021-09-20T16:30:00.000Z"} +{"id": 1079, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2020-09-28T15:26:00.000Z and 2020-09-28T22:15:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-28T15:26:00.000Z and 2020-09-28T22:15:00.000Z"} +{"id": 1080, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2021-08-04T14:27:00.000Z and 2021-08-05T03:59:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-04T14:27:00.000Z and 2021-08-05T03:59:00.000Z"} +{"id": 1081, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2019-02-05T23:30:00.000Z and 2019-02-06T03:10:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-05T23:30:00.000Z and 2019-02-06T03:10:00.000Z"} +{"id": 1082, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2021-08-31T17:10:00.000Z and 2021-09-01T03:59:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-31T17:10:00.000Z and 2021-09-01T03:59:00.000Z"} +{"id": 1083, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02009 between 2020-07-14T23:30:00.000Z and 2020-07-15T07:45:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-14T23:30:00.000Z and 2020-07-15T07:45:00.000Z"} +{"id": 1084, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2020-11-05T07:00:00.000Z and 2020-11-06T02:10:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-05T07:00:00.000Z and 2020-11-06T02:10:00.000Z"} +{"id": 1085, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2019-01-10T18:15:00.000Z and 2019-01-11T02:35:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-10T18:15:00.000Z and 2019-01-11T02:35:00.000Z"} +{"id": 1086, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2022-07-22T11:15:00.000Z and 2022-07-27T07:00:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-07-22T11:15:00.000Z and 2022-07-27T07:00:00.000Z"} +{"id": 1087, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2021-06-02T14:45:00.000Z and 2021-06-03T07:00:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-06-02T14:45:00.000Z and 2021-06-03T07:00:00.000Z"} +{"id": 1088, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH43 between 2020-05-25T06:00:00.000Z and 2020-05-25T13:30:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-25T06:00:00.000Z and 2020-05-25T13:30:00.000Z"} +{"id": 1089, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2022-12-08T17:30:00.000Z and 2022-12-09T21:30:00.000Z according to: The condition has 3 parts. (1) The chiller is running. (2) The absolute difference between the coolant pressure difference and its setpoint is greater than 4 PSI; or, if coolant pressure difference is not reporting, the absolute difference between supply coolant pressure minus return coolant pressure and the setpoint is greater than 4 PSI. (3) The rule is triggered when all three parts of the condition are met for 3 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-12-08T17:30:00.000Z and 2022-12-09T21:30:00.000Z"} +{"id": 1090, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH04 between 2019-02-23T03:00:00.000Z and 2019-02-23T07:00:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-23T03:00:00.000Z and 2019-02-23T07:00:00.000Z"} +{"id": 1091, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller J019600000611 between 2022-10-13T18:00:00.000Z and 2022-10-26T13:45:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-10-13T18:00:00.000Z and 2022-10-26T13:45:00.000Z"} +{"id": 1092, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH04 between 2019-02-21T15:15:00.000Z and 2019-02-21T20:15:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-21T15:15:00.000Z and 2019-02-21T20:15:00.000Z"} +{"id": 1093, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-02-10T15:30:00.000Z and 2019-02-10T18:45:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-10T15:30:00.000Z and 2019-02-10T18:45:00.000Z"} +{"id": 1094, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-01-19T18:45:00.000Z and 2019-01-19T22:45:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-19T18:45:00.000Z and 2019-01-19T22:45:00.000Z"} +{"id": 1095, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-01-04T18:45:00.000Z and 2019-01-04T22:30:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-04T18:45:00.000Z and 2019-01-04T22:30:00.000Z"} +{"id": 1096, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower 2021010CTME06 between 2022-07-30T22:30:00.000Z and 2022-07-31T16:00:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-07-30T22:30:00.000Z and 2022-07-31T16:00:00.000Z"} +{"id": 1097, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower TC02701 between 2020-05-27T23:45:00.000Z and 2020-05-28T15:30:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-27T23:45:00.000Z and 2020-05-28T15:30:00.000Z"} +{"id": 1098, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower TC02701 between 2021-03-30T17:00:00.000Z and 2021-03-31T00:45:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-30T17:00:00.000Z and 2021-03-31T00:45:00.000Z"} +{"id": 1099, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-11-03T23:45:00.000Z and 2020-11-04T16:45:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-03T23:45:00.000Z and 2020-11-04T16:45:00.000Z"} +{"id": 1100, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-12-11T00:45:00.000Z and 2021-01-01T05:00:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-11T00:45:00.000Z and 2021-01-01T05:00:00.000Z"} +{"id": 1101, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-12-04T01:45:00.000Z and 2020-12-04T16:30:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-04T01:45:00.000Z and 2020-12-04T16:30:00.000Z"} +{"id": 1102, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CB between 2021-02-22T11:30:00.000Z and 2021-02-22T15:15:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-22T11:30:00.000Z and 2021-02-22T15:15:00.000Z"} +{"id": 1103, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 406065BC between 2020-11-05T13:15:00.000Z and 2020-11-05T16:30:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-05T13:15:00.000Z and 2020-11-05T16:30:00.000Z"} +{"id": 1104, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 606064AD between 2021-09-26T19:15:00.000Z and 2021-09-27T12:45:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-26T19:15:00.000Z and 2021-09-27T12:45:00.000Z"} +{"id": 1105, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU D08085CB between 2020-07-03T11:15:00.000Z and 2020-07-03T21:15:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-03T11:15:00.000Z and 2020-07-03T21:15:00.000Z"} +{"id": 1106, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU Q08085AB between 2020-09-05T17:15:00.000Z and 2020-09-05T19:45:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-05T17:15:00.000Z and 2020-09-05T19:45:00.000Z"} +{"id": 1107, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU D08085CB between 2020-07-27T09:30:00.000Z and 2020-07-27T11:45:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-27T09:30:00.000Z and 2020-07-27T11:45:00.000Z"} +{"id": 1108, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU 16 between 2021-05-28T17:45:00.000Z and 2021-05-29T01:30:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-05-28T17:45:00.000Z and 2021-05-29T01:30:00.000Z"} +{"id": 1109, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU Q between 2022-05-13T23:15:00.000Z and 2022-05-15T06:30:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-13T23:15:00.000Z and 2022-05-15T06:30:00.000Z"} +{"id": 1110, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU 2 between 2022-05-13T23:00:00.000Z and 2022-05-15T05:00:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-13T23:00:00.000Z and 2022-05-15T05:00:00.000Z"} +{"id": 1111, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP3 between 2020-03-27T16:45:00.000Z and 2020-03-28T01:45:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-27T16:45:00.000Z and 2020-03-28T01:45:00.000Z"} +{"id": 1112, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP4 between 2020-06-08T09:15:00.000Z and 2020-06-10T15:30:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-08T09:15:00.000Z and 2020-06-10T15:30:00.000Z"} +{"id": 1113, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP3 between 2020-03-28T17:30:00.000Z and 2020-03-28T23:45:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-28T17:30:00.000Z and 2020-03-28T23:45:00.000Z"} +{"id": 1114, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump J019600000711 between 2019-01-19T18:30:00.000Z and 2019-01-19T22:45:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-19T18:30:00.000Z and 2019-01-19T22:45:00.000Z"} +{"id": 1115, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343162 between 2020-06-29T02:00:00.000Z and 2020-06-29T06:00:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-29T02:00:00.000Z and 2020-06-29T06:00:00.000Z"} +{"id": 1116, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343142 between 2022-04-20T03:00:00.000Z and 2022-04-20T05:00:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-04-20T03:00:00.000Z and 2022-04-20T05:00:00.000Z"} +{"id": 1117, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2019-03-16T20:15:00.000Z and 2019-03-17T01:45:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-16T20:15:00.000Z and 2019-03-17T01:45:00.000Z"} +{"id": 1118, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2020-02-24T22:45:00.000Z and 2020-02-25T01:00:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-24T22:45:00.000Z and 2020-02-25T01:00:00.000Z"} +{"id": 1119, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2020-02-27T19:30:00.000Z and 2020-02-28T02:30:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-27T19:30:00.000Z and 2020-02-28T02:30:00.000Z"} diff --git a/src/scenarios/models.py b/src/scenarios/models.py new file mode 100644 index 000000000..0e7359c9e --- /dev/null +++ b/src/scenarios/models.py @@ -0,0 +1,236 @@ +"""Pydantic models used by the scenario-generation pipeline.""" + +from __future__ import annotations + +from typing import Any, Literal + +from pydantic import BaseModel, Field + + +ScenarioTypeKey = Literal["iot", "fmsr", "tsfm", "wo", "vibration", "multiagent"] + +RetrieverMode = Literal["arxiv", "semantic_scholar"] + +PdfTextOutcome = Literal["ok", "fetch_failed", "empty_text"] + + +class KeyDescription(BaseModel): + """A named item with a short human-readable description.""" + + key: str + description: str + + +class GroundedTimeRange(BaseModel): + """Concrete time coverage discovered from a live data source.""" + + start: str | None = None + end: str | None = None + total_observations: int = 0 + + +class SensorNameDescription(BaseModel): + """One sensor channel with a human-readable description (from profile synthesis).""" + + name: str + description: str + + +class AssetInstance(BaseModel): + """One live asset id with per-instance coverage (time ranges). + + Sensor inventories are shared across instances and live on ``GroundingBundle`` as + ``iot_sensors`` / ``vibration_sensors`` (prior data for synthesis only). + """ + + site_name: str + asset_id: str + has_iot: bool = False + has_vibration: bool = False + iot_time_range: GroundedTimeRange | None = None + vibration_time_range: GroundedTimeRange | None = None + + +class GroundingBundle(BaseModel): + """Deterministic live grounding information collected before profile synthesis.""" + + asset_name: str + requested_open_form: bool = False + open_form_eligible: bool = False + iot_sensors: list[str] = Field(default_factory=list) + vibration_sensors: list[str] = Field(default_factory=list) + asset_instances: list[AssetInstance] = Field(default_factory=list) + failure_modes: list[str] = Field(default_factory=list) + failure_sensor_mapping: dict[str, list[str]] = Field(default_factory=dict) + sensor_failure_mapping: dict[str, list[str]] = Field(default_factory=dict) + + +class AssetProfile(BaseModel): + """Structured knowledge about an asset and the tools relevant to it.""" + + asset_name: str + generation_mode: str = "closed_form" + description: str + iot_sensors: list[SensorNameDescription] = Field(default_factory=list) + vibration_sensors: list[SensorNameDescription] = Field(default_factory=list) + failure_modes: list[KeyDescription] = Field(default_factory=list) + asset_instances: list[AssetInstance] = Field(default_factory=list) + failure_sensor_mapping: dict[str, list[str]] = Field(default_factory=dict) + sensor_failure_mapping: dict[str, list[str]] = Field(default_factory=dict) + relevant_tools: dict[str, list[dict[str, str]]] = Field(default_factory=dict) + operator_tasks: list[str] = Field(default_factory=list) + manager_tasks: list[str] = Field(default_factory=list) + + def instances_for_focus(self, focus: str) -> list[AssetInstance]: + """Return grounded instances that can support the requested focus.""" + + if focus == "iot": + return [instance for instance in self.asset_instances if instance.has_iot] + if focus == "vibration": + return [instance for instance in self.asset_instances if instance.has_vibration] + if focus in {"fmsr", "tsfm", "wo", "multiagent"}: + return [ + instance + for instance in self.asset_instances + if instance.has_iot or instance.has_vibration + ] + return list(self.asset_instances) + + def grounded_sites(self) -> list[str]: + """Return the distinct grounded site names.""" + + return sorted({instance.site_name for instance in self.asset_instances if instance.site_name}) + + def grounded_asset_ids(self, focus: str | None = None) -> list[str]: + """Return grounded asset ids, optionally filtered by focus.""" + + instances = self.instances_for_focus(focus) if focus else self.asset_instances + return sorted({instance.asset_id for instance in instances if instance.asset_id}) + + def grounded_sensor_names(self, focus: str | None = None) -> list[str]: + """Return sensor names from the profile for the requested focus (open-form validation).""" + + if focus == "vibration": + return sorted(dict.fromkeys(s.name for s in self.vibration_sensors if s.name)) + if focus == "iot": + return sorted(dict.fromkeys(s.name for s in self.iot_sensors if s.name)) + combined = [*(s.name for s in self.iot_sensors), *(s.name for s in self.vibration_sensors)] + return sorted(dict.fromkeys(n for n in combined if n)) + + def grounded_timestamps(self, focus: str | None = None) -> list[str]: + """Return explicit timestamp bounds discovered for grounded instances.""" + + instances = self.instances_for_focus(focus) if focus else self.asset_instances + timestamps: set[str] = set() + for instance in instances: + ranges = [] + if focus != "vibration" and instance.iot_time_range: + ranges.append(instance.iot_time_range) + if focus != "iot" and instance.vibration_time_range: + ranges.append(instance.vibration_time_range) + for time_range in ranges: + if time_range.start: + timestamps.add(time_range.start) + if time_range.end: + timestamps.add(time_range.end) + return sorted(timestamps) + + +class RetrievalAction(BaseModel): + """Next-step decision emitted by the retrieval planner.""" + + action: str = "search" + reason: str = "" + canonical_asset_name: str + queries: list[str] = Field(default_factory=list) + selected_ids: list[str] = Field(default_factory=list) + + +class EvidenceCandidate(BaseModel): + """Metadata for one potentially relevant paper or evidence source.""" + + paper_id: str + title: str + summary: str + query: str + pdf_url: str | None = None + published: str | None = None + judge_score: int = 0 + judge_reason: str = "" + + +class EvidenceSnippet(BaseModel): + """Extracted evidence text used to justify an asset profile.""" + + paper_id: str + title: str + url: str | None = None + source: str + text: str + + +class EvidenceBundle(BaseModel): + """All evidence collected for one asset profile build.""" + + asset_name: str + canonical_asset_name: str + query_history: list[str] = Field(default_factory=list) + selected_candidate_ids: list[str] = Field(default_factory=list) + candidates: list[EvidenceCandidate] = Field(default_factory=list) + snippets: list[EvidenceSnippet] = Field(default_factory=list) + + +class ScenarioBudget(BaseModel): + """Requested scenario count plus per-subagent allocation.""" + + total_scenarios: int = 50 + allocation: dict[str, int] = Field(default_factory=dict) + reasoning: str = "" + + +class Scenario(BaseModel): + """One benchmark scenario emitted by the generator.""" + + id: str + text: str + category: str + characteristic_form: str + type: ScenarioTypeKey + generation_mode: str | None = Field(default=None, exclude=True) + + def to_dict(self) -> dict[str, Any]: + """Return a plain dictionary representation for JSON export.""" + + return { + "id": self.id, + "type": self.type, + "text": self.text, + "category": self.category, + "characteristic_form": self.characteristic_form, + } + + +class ScenarioGenerationResult(BaseModel): + """Final output of one scenario-generation run.""" + + scenarios: list[Scenario] = Field(default_factory=list) + negative_scenarios: list[Scenario] = Field(default_factory=list) + + +__all__ = [ + "AssetProfile", + "EvidenceBundle", + "EvidenceCandidate", + "EvidenceSnippet", + "AssetInstance", + "GroundedTimeRange", + "GroundingBundle", + "KeyDescription", + "RetrievalAction", + "RetrieverMode", + "Scenario", + "ScenarioGenerationResult", + "ScenarioBudget", + "ScenarioTypeKey", + "SensorNameDescription", +] diff --git a/src/scenarios/prompts/__init__.py b/src/scenarios/prompts/__init__.py new file mode 100644 index 000000000..6c09061f9 --- /dev/null +++ b/src/scenarios/prompts/__init__.py @@ -0,0 +1,43 @@ +"""Prompt templates used by the scenario-generation pipeline.""" + +from .asset_profile import PROFILE_BUILDER_PROMPT +from .budget import BUDGET_ALLOCATOR_PROMPT +from .generation import ( + MULTIAGENT_COMBINER_PROMPT, + NEGATIVE_SCENARIO_GENERATOR_PROMPT, + NEGATIVE_VALIDATE_REPAIR_PROMPT, + SCENARIO_GENERATOR_PROMPT, + VALIDATE_REPAIR_PROMPT, +) +from .research_digest import ( + RESEARCH_DIGEST_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_SECTION_HEADINGS, + RESEARCH_DIGEST_SECTION_HEADINGS, + RESEARCH_MERGE_PROMPT, + RESEARCH_PER_PAPER_PROMPT, +) +from .retrieval import ( + RETRIEVAL_METADATA_JUDGE_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT_SECTION, +) + +__all__ = [ + "BUDGET_ALLOCATOR_PROMPT", + "MULTIAGENT_COMBINER_PROMPT", + "NEGATIVE_SCENARIO_GENERATOR_PROMPT", + "NEGATIVE_VALIDATE_REPAIR_PROMPT", + "PROFILE_BUILDER_PROMPT", + "RESEARCH_DIGEST_HEADINGS_MARKDOWN", + "RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN", + "RESEARCH_DIGEST_MERGE_SECTION_HEADINGS", + "RESEARCH_DIGEST_SECTION_HEADINGS", + "RESEARCH_MERGE_PROMPT", + "RESEARCH_PER_PAPER_PROMPT", + "RETRIEVAL_METADATA_JUDGE_PROMPT", + "RETRIEVAL_QUERY_PLAN_PROMPT", + "RETRIEVAL_QUERY_PLAN_PROMPT_SECTION", + "SCENARIO_GENERATOR_PROMPT", + "VALIDATE_REPAIR_PROMPT", +] diff --git a/src/scenarios/prompts/asset_profile.py b/src/scenarios/prompts/asset_profile.py new file mode 100644 index 000000000..64c56562a --- /dev/null +++ b/src/scenarios/prompts/asset_profile.py @@ -0,0 +1,76 @@ +"""Prompt for constructing study-backed asset profile enrichment.""" + +PROFILE_BUILDER_PROMPT = """\ +You are an expert reliability engineer preparing study-backed enrichment for an Asset Profile used in scenario generation. + +The system will compose the final Asset Profile in code. Your job is to return only the study-derived fields that are not already deterministically grounded from CouchDB discovery. + +Asset Name: {asset_name} +Generation Mode: {generation_mode} + +Grounded Coverage Summary: +{grounding_summary_json} + +Research Digest: +{research_digest} + +Available Subagent Tools: +{tool_descriptions} + +Task: +Produce a JSON object matching the following schema exactly. +CRITICAL: Output ONLY the raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Rules: +- Keep the response concise. Do NOT restate asset instances, asset_name, or generation_mode. +- In open_form mode, treat grounded live coverage as the source of truth for concrete site names, asset ids, sensor keys (listed under `iot_sensors` / `vibration_sensors` in the summary), per-asset time ranges, and timestamps. +- In closed_form mode, assume scenarios must be self-contained: the query text should list explicit sensor readings (sensor name, numeric value, unit), and may include rules or dataset names when relevant. +- Use the research digest as the primary source of truth for asset-class understanding, operator workflows, monitoring practices, and standards. +- Do NOT return `failure_sensor_mapping` or `sensor_failure_mapping`. +- Use `iot_sensors` and `vibration_sensors` as separate lists of objects, each with `name` and `description` (what it measures). The system merges these with sensor name strings from the grounding summary in code (every IoT name from the summary must appear under `iot_sensors`; every vibration name from the summary under `vibration_sensors`). +- Use `failure_modes` the same way as before: list of `{{"key": "...", "description": "..."}}`. The system merges with grounded failure modes and F2S/S2F mappings in code (mappings use keys only). +- Include multiple relevant tools per focus when the toolset clearly supports more than one important action for that focus. +- Use an empty array [] for `vibration_sensors` when vibration sensing does not apply; use [] for `iot_sensors` only when the asset truly has no IoT channels in the grounded summary. +- Only include sensor descriptions, failure mode descriptions, and task types that are clearly supported by the research digest, grounded coverage summary, or tool definitions. +- If the research digest is sparse, stay conservative rather than inventing highly specific details. +- The profile must represent the physical industrial asset class itself, not surrounding digital, networking, cyber, or facility infrastructure. +- Add realistic tasks from the point of view of industrial asset operator and the operator's manager. +- Include vibration tools only when vibration analysis is relevant to the asset class or grounded data; otherwise use [] for "vibration". + +{{ + "description": "Short summary of the asset class (1-2 sentences).", + "iot_sensors": [ + {{"name": "sensor_name", "description": "what it measures"}} + ], + "vibration_sensors": [ + {{"name": "sensor_name", "description": "what it measures"}} + ], + "failure_modes": [ + {{"key": "failure_mode_name", "description": "why it matters for this asset"}} + ], + "relevant_tools": {{ + "iot": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "fmsr": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "tsfm": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "wo": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "vibration": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ] + }}, + "operator_tasks": ["task phrased from the operator point of view"], + "manager_tasks": ["task phrased from the manager point of view"] +}} +""" diff --git a/src/scenarios/prompts/budget.py b/src/scenarios/prompts/budget.py new file mode 100644 index 000000000..50ee4ad47 --- /dev/null +++ b/src/scenarios/prompts/budget.py @@ -0,0 +1,38 @@ +"""Prompt for allocating scenario counts across subagents.""" + +BUDGET_ALLOCATOR_PROMPT = """\ +You are an expert Scenario Strategy Consultant for AssetOps Bench. + +Given an Asset Profile and a total number of scenarios to generate ({total_scenarios}), your task is to allocate this budget across the following six focus areas: +1. iot: Focusing on sensor data and basic telemetry. +2. fmsr: Focusing on failure modes and structural reliability. +3. tsfm: Focusing on time-series analysis and technical maintenance. +4. wo: Focusing on actual maintenance execution and work orders. +5. vibration: Focusing on vibration diagnostics, severity assessment, FFT/envelope workflows, and bearing-related reasoning. +6. multiagent: Complex, multi-stage workflows involving orchestration of multiple agents. + +Asset Profile: +{asset_profile_json} + +Allocation Strategy: +- Prioritize agents that have more "relevant_tools" or richer "failure_modes" / "iot_sensors" / "vibration_sensors" entries in the profile. +- If the asset mentions complex standards (ISO 14224, etc.), lean towards analytical categories (tsfm, fmsr, vibration where appropriate). +- It is perfectly acceptable for a category to have 0 scenarios if the Asset Profile doesn't warrant it. +- Cap "multiagent" at a maximum of 75% of the total budget (e.g., max 37 if total is 50). +- The sum of all allocations MUST exactly equal {total_scenarios}. + +Output Format: +CRITICAL: Return ONLY a raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +{{ + "reasoning": "A brief explanation of why you chose this distribution based on the asset details.", + "allocation": {{ + "iot": int, + "fmsr": int, + "tsfm": int, + "wo": int, + "vibration": int, + "multiagent": int + }} +}} +""" diff --git a/src/scenarios/prompts/generation.py b/src/scenarios/prompts/generation.py new file mode 100644 index 000000000..92c0994a9 --- /dev/null +++ b/src/scenarios/prompts/generation.py @@ -0,0 +1,265 @@ +"""Prompts for valid and negative scenario generation.""" + +SCENARIO_GENERATOR_PROMPT = """\ +You are an advanced industrial agent Scenario Architect for AssetOps Bench. +We need you to generate {count} evaluation scenarios with primary focus '{subagent_name}' for the asset class: {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile (full JSON): +{asset_profile_json} + +Available Focus Tools: +{tool_definitions} + +{few_shot_examples_section} + +When generating scenarios, use the Generation Mode and Mode-specific grounding rules (not the few-shot rows) to decide whether each scenario must embed readings, rules, summaries, or dataset identifiers in the query text. + +Suggested category values for this focus: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Hard-scenario contract for this batch: +- At least {hard_target_count} of the {count} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + +Avoid these bad patterns: +{forbidden_patterns} + +Mode-specific grounding rules: +{mode_requirements} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Constraints: +1. Every scenario must read like a realistic direct request from an industrial operator or the operator's manager. +2. Prefer end-user-centric wording such as "Will my transformer's health be okay tomorrow?" over tool-centric or benchmark-centric wording such as "predict transformer health". +3. The scenario may involve supporting work from other agents, but the main burden should stay on the primary focus '{subagent_name}'. +4. Every scenario must be highly specific, having a clear 'text', a 'category', and a 'characteristic_form'. +5. The characteristic_form must explicitly mention the concrete MCP tool names needed to solve the task. +6. The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Reserve every concrete tool name for 'characteristic_form' only. +7. Most scenarios should be multi-part and instruction-following rather than short one-liners. +8. Closed-form scenarios must embed explicit inline sensor readings in the query text: for each measurement, sensor name (or label), numeric value, and unit (e.g. ppm, %, Hz, mm/s). You may also embed rule text, summaries, or dataset identifiers when the task requires them. +9. Open-form scenarios must use only grounded identifiers present in the Asset Profile. +10. Do not output Unsupported. + +Task: Generate a JSON array of {count} scenarios. +CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Format exactly (raw JSON only): +[ + {{ + "text": "...", + "category": "...", + "characteristic_form": "..." + }} +] +""" + +VALIDATE_REPAIR_PROMPT = """\ +You are the Validator and Repair agent for the AssetOps Bench scenario generator. + +You are given a list of JSON scenarios and the corresponding Asset Profile. +Your job is to validate and repair them based on: +1. Do they fit exactly the JSON schema (text, category, characteristic_form)? +2. Does the characteristic_form name the concrete MCP tool names needed to solve the task? +3. Does the 'text' field contain only natural operator language, with no MCP tool names, function identifiers, or parenthetical hints like "e.g. get_failure_modes tool"? If any appear in 'text', remove or rewrite them and keep tool names in characteristic_form only. +4. Does each scenario clearly satisfy the prompt rules for primary focus '{subagent_name}' even if it uses supporting cross-agent steps? +5. In closed_form mode, does each scenario text include explicit inline sensor readings (name, value, unit) per Mode-specific grounding rules? Are there duplicates, near-duplicates, or (for open_form) ungrounded identifiers? +6. Are the scenarios phrased like direct end-user requests rather than internal benchmark instructions? +7. Does this batch satisfy the hard-scenario contract: at least {hard_target_count} of the {batch_size} scenarios should ask for at least two outputs or actions, include an explicit constraint, and include an if/else, fallback, or missing-data instruction? +8. Fix every deterministic validation failure listed below. + +Target Focus: +{subagent_name} + +Suggested Categories: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Hard-scenario contract: +- At least {hard_target_count} of the {batch_size} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + +Avoid these bad patterns: +{forbidden_patterns} + +Mode-specific grounding rules: +{mode_requirements} + +Asset Profile: +{asset_profile_json} + +Input Scenarios: +{input_scenarios_json} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Deterministic validation failures that MUST be fixed: +{validation_failures_json} + +Always review the full batch for end-user-centric phrasing and hardness, even when the deterministic failure list is empty. +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. +""" + +NEGATIVE_SCENARIO_GENERATOR_PROMPT = """\ +You are an advanced industrial agent Scenario Architect for AssetOps Bench. +We need you to generate {count} intentionally unanswerable evaluation scenarios with primary focus '{subagent_name}' for the asset class: {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile (full JSON): +{asset_profile_json} + +Available Focus Tools: +{tool_definitions} + +Suggested category values for this focus: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Mode-specific grounding rules: +{mode_requirements} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Task: +Generate realistic operator- or manager-facing requests that cannot be answered safely from the available grounded data and tools. + +Negative-pattern guidance: +- Use grounded-adjacent realism: the question should sound like a plausible user request, not an adversarial puzzle. +- Make the scenario unanswerable because of one of these causes: missing or non-existent asset/site/sensor identifiers, time windows outside the available data range, unsupported external data joins, or contradictory instructions that prevent a safe grounded answer. +- It is acceptable for open-form negative scenarios to intentionally mention an ungrounded identifier or an out-of-range timestamp when that is exactly what makes the request unanswerable. +- The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers. +- The characteristic_form must describe the expected insufficiency/refusal behavior: it should explicitly say that a correct answer explains why the request cannot be answered from the available data/tools and does not hallucinate missing information. +- Do not output a scenario that is secretly answerable from the Asset Profile and available tools. + +Task: Generate a JSON array of {count} scenarios. +CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Format exactly (raw JSON only): +[ + {{ + "text": "...", + "category": "...", + "characteristic_form": "..." + }} +] +""" + +NEGATIVE_VALIDATE_REPAIR_PROMPT = """\ +You are the Validator and Repair agent for negative AssetOps Bench scenarios. + +You are given a list of intentionally unanswerable JSON scenarios and the corresponding Asset Profile. +Your job is to validate and repair them based on: +1. Do they fit exactly the JSON schema (text, category, characteristic_form)? +2. Does the 'text' field stay in natural operator or manager language, with no MCP tool names or API identifiers? +3. Does each scenario remain realistically user-centric while still being unanswerable from the available data/tools? +4. Does each characteristic_form explicitly require an insufficiency/refusal-style answer that explains what is missing or unsupported? +5. Fix every deterministic validation failure listed below. + +Target Focus: +{subagent_name} + +Suggested Categories: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Mode-specific grounding rules: +{mode_requirements} + +Asset Profile: +{asset_profile_json} + +Input Scenarios: +{input_scenarios_json} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Deterministic validation failures that MUST be fixed: +{validation_failures_json} + +Always preserve the fact that these scenarios are intentionally unanswerable. +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. +""" + +MULTIAGENT_COMBINER_PROMPT = """\ +You are the Multiagent Scenario Combiner. +You generate complex multi-agent workflows that span across multiple focused capabilities (e.g. IoT + WO + TSFM + vibration). +We need {count} multi-agent scenarios for {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile: +{asset_profile_json} + +Available MCP Function Definitions (these are ALL the tools across all subagents, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): +{mcp_function_definitions} + +Here are some valid single-agent scenarios we generated earlier: +{single_agent_scenarios_json} + +Follow Generation Mode: closed-form runs must inline explicit sensor readings (name, value, unit) in operator-facing text, plus any rule text, summaries, or dataset references the task needs. + +Already accepted multiagent scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Hard-scenario contract for this batch: +- At least {hard_target_count} of the {count} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + +Mode-specific grounding rules: +{mode_requirements} + +Avoid these bad patterns: +{forbidden_patterns} + +Task: Use these single-agent pieces to construct cohesive multi-agent scenarios from the point of view of an operator or the operator's manager. +A multiagent scenario tests agent communication, workflow orchestration, and decision-making. +For instance, detecting an anomaly using IoT, confirming a failure signature with FMSR or vibration, projecting impact with TSFM, and planning action with WO. + +Requirements: +- The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Put concrete tool names only in characteristic_form. +- Phrase the text like a direct end-user request, not an internal workflow description. +- Most scenarios should be multi-part and instruction-following rather than short one-liners. +- Every multiagent characteristic_form must mention at least two distinct namespaces chosen from iot, fmsr, tsfm, wo, and vibration. +- Every multiagent characteristic_form must mention concrete MCP tool names from those namespaces. +- Open-form scenarios must only use grounded identifiers from the Asset Profile. +- Closed-form scenarios must contain explicit inline sensor readings (name, value, unit) in the text, and may include summaries, rule text, or dataset identifiers when needed. +- Do not output Unsupported. + +Return ONLY a JSON array of length {count}. +CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. + +[ + {{ + "text": "Detect a temperature anomaly on the chiller, verify its past occurrences, and schedule a work order.", + "category": "Knowledge Query", + "characteristic_form": "The expected response should involve first utilizing the IoT tool to confirm the anomaly, then querying the WO tool to fetch history, before finalizing a work order creation." + }} +] +""" diff --git a/src/scenarios/prompts/research_digest.py b/src/scenarios/prompts/research_digest.py new file mode 100644 index 000000000..90cf904a8 --- /dev/null +++ b/src/scenarios/prompts/research_digest.py @@ -0,0 +1,73 @@ +"""Research digest section headings and merge/per-paper prompts.""" + +from __future__ import annotations + +RESEARCH_DIGEST_SECTION_HEADINGS: tuple[str, ...] = ( + "Condition monitoring, diagnostics, and degradation indicators", + "Maintenance practices, scheduling, and work-order–relevant context", + "Sensor modalities, measurements, and signal interpretation", + "Failure modes, faults, and operational risks", + "Applicable standards, norms, or industry conventions (when mentioned)", + "Operator- and manager-style tasks phrased in natural language", + "Gaps / not supported by this paper", +) + +RESEARCH_DIGEST_HEADINGS_MARKDOWN = "\n".join(f"## {title}\n" for title in RESEARCH_DIGEST_SECTION_HEADINGS) + +RESEARCH_DIGEST_MERGE_SECTION_HEADINGS: tuple[str, ...] = RESEARCH_DIGEST_SECTION_HEADINGS[:-1] +RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN = "\n".join(f"## {title}\n" for title in RESEARCH_DIGEST_MERGE_SECTION_HEADINGS) + +RESEARCH_PER_PAPER_PROMPT = """\ +You are extracting industrial asset lifecycle management (IALM) knowledge from one academic paper +(condition monitoring, maintenance, sensors, work orders, failure modes, standards) for downstream +scenario generation. + +Asset class name: {asset_name} +Canonical asset name: {canonical_asset_name} + +Use ONLY the source text below. Do not invent citations, paper titles, or external paper/repository IDs. +If a section has no relevant content in the source, write a short line such as "Not supported by this +paper." under that heading. + +Output MUST use exactly these section headings (Markdown ##), in this order: + +{headings_markdown} + +Under each heading, use short bullet points or 1–2 sentences. No JSON. + +--- SOURCE TEXT (may be truncated) --- +{body_text} +--- END SOURCE TEXT --- +""" + +RESEARCH_MERGE_PROMPT = """\ +You merge several per-paper research digests into one coherent research brief for the same asset class. + +Asset class name: {asset_name} +Canonical asset name: {canonical_asset_name} + +Goals: +- Deduplicate overlapping facts; reconcile minor contradictions conservatively (prefer explicit wording + from the digests; if sources conflict, say so briefly). +- Every section below must have substantive content. Where the per-paper digests are empty, sparse, or + only say things like "Not supported by this paper" for a heading, fill that section to the best of + your general knowledge for this asset class and typical industrial IALM practice. Do not leave + sections blank or stub-only when you can reasonably supply domain-appropriate detail; do not + contradict what the digests do state. When you supplement beyond the papers, keep wording factual + and typical (not speculative edge cases); you may briefly note that a point is general domain + context if it was not clearly grounded in the digests. +- Keep content focused on physical industrial assets, operations, and IALM (not generic ML methods, + cyber-only, or unrelated domains). +- Produce text that will help generate realistic operator/manager natural-language scenarios + (including plausible sensor interpretations, tasks, and failure contexts). + +Output format: Markdown with exactly these top-level section headings (##), in this order: + +{merge_headings_markdown} + +Do not include paper titles, database IDs, or DOIs in the output. + +--- PER-PAPER DIGESTS --- +{per_paper_digests} +--- END PER-PAPER DIGESTS --- +""" diff --git a/src/scenarios/prompts/retrieval.py b/src/scenarios/prompts/retrieval.py new file mode 100644 index 000000000..6795f3b47 --- /dev/null +++ b/src/scenarios/prompts/retrieval.py @@ -0,0 +1,150 @@ +"""Prompts used by the bounded academic-search retrieval workflow.""" + +RETRIEVAL_QUERY_PLAN_PROMPT = """\ +You are a bounded ReAct retrieval agent for industrial asset research. + +You do not call an academic search engine directly. The host runs searches for you and returns paper metadata summaries. +At each step, decide whether to search again or finish with the best candidates found so far. + +Asset Name: {asset_name} +Current Step: {step_number} of {max_steps} +Current Canonical Asset Name: {canonical_asset_name} + +Available Subagent Tools: +{tool_descriptions} + +Previous Queries: +{previous_queries} + +Current Top Judged Results: +{current_results_summary} + +Return ONLY a raw JSON object in this shape: +{{ + "action": "search" or "finish", + "reason": "brief explanation", + "canonical_asset_name": "canonical industrial equipment term", + "queries": ["1 to 2 new search queries for the academic search engine if action=search, otherwise []"], + "selected_ids": ["preferred paper_id values if action=finish, otherwise []"] +}} + +Constraints: +- Keep the process generic for any industrial asset class. +- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. +- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. +- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. +- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. +- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. +- Queries should focus on physical asset monitoring, diagnostics, failures, maintenance, condition assessment, degradation, or reliability. +- When it fits the asset class, prefer query ingredients such as: Industry 4.0 or IIoT in a plant context; physical sensors (e.g. vibration, temperature, pressure, current, partial discharge); and relevant standards (ISO, IEC, IEEE) only when tied to that equipment—do not stuff acronyms into every query. +- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". +- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. +- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. +- When action is "search", propose 1 to 2 short queries only. +- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. +- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. +- Do not use advanced boolean syntax. +- Do not invent paper_id values that are not present in Current Top Judged Results. +- Output ONLY raw JSON. +""" + +RETRIEVAL_QUERY_PLAN_PROMPT_SECTION = """\ +You are a bounded ReAct retrieval agent for industrial asset research. + +You do not call an academic search engine directly. The host runs searches for you and returns paper metadata summaries. +At each step, decide whether to search again or finish with the best candidates found so far. + +This retrieval pass is scoped to ONE subsection of a downstream research digest. Bias every search query toward +that facet of knowledge (not generic background). You will run again for other subsections separately. + +Section focus (this pass only): {section_heading} + +Asset Name: {asset_name} +Current Step: {step_number} of {max_steps} +Current Canonical Asset Name: {canonical_asset_name} + +Available Subagent Tools: +{tool_descriptions} + +Previous Queries (this section only): +{previous_queries} + +Current Top Judged Results (this section only): +{current_results_summary} + +Return ONLY a raw JSON object in this shape: +{{ + "action": "search" or "finish", + "reason": "brief explanation", + "canonical_asset_name": "canonical industrial equipment term", + "queries": ["1 to 2 new search queries for the academic search engine if action=search, otherwise []"], + "selected_ids": ["preferred paper_id values if action=finish, otherwise []"] +}} + +Constraints: +- Keep the process generic for any industrial asset class. +- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. +- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. +- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. +- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. +- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. +- Queries in this pass must align with the section focus above (e.g. maintenance scheduling vs sensor modalities vs failure modes vs standards). Still describe the physical asset explicitly. +- When it fits the asset class, prefer query ingredients such as: Industry 4.0 or IIoT in a plant context; physical sensors (e.g. vibration, temperature, pressure, current, partial discharge); and relevant standards (ISO, IEC, IEEE) only when tied to that equipment—do not stuff acronyms into every query. +- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". +- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. +- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. +- When action is "search", propose 1 to 2 short queries only. +- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. +- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. +- Do not use advanced boolean syntax. +- Do not invent paper_id values that are not present in Current Top Judged Results. +- Output ONLY raw JSON. +""" + +RETRIEVAL_METADATA_JUDGE_PROMPT = """\ +You are a relevance judge for paper metadata from an academic search engine, retrieved for industrial asset scenario generation. + +Your task is to score how useful each metadata entry is for building an asset profile for the physical industrial asset below. +Judge from the title and summary only. + +Asset Name: {asset_name} +Canonical Asset Name: {canonical_asset_name} + +Metadata Entries: +{metadata_entries_json} + +Return ONLY a raw JSON array. One object per metadata entry: +[ + {{ + "paper_id": "entry id (must match the paper_id in the metadata entry)", + "score_1_to_10": 8, + "reason": "short reason" + }} +] + +Scoring guide: +- Core question: would this paper help define the physical asset class itself and its maintenance, monitoring, sensing, degradation, diagnostics, or failure behavior? +- High score when the paper is clearly about the physical asset and would help populate sensor mappings (modalities, placement, or signal interpretation), known failure modes, relevant tools, maintenance workflows, or applicable standards for that equipment. +- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards (ISO/IEC/IEEE where relevant), physical measurements, or industrial sensing/IIoT for the asset—not generic ML method papers +- 6-8: relevant to the physical asset but somewhat indirect, narrower than ideal, or missing strong maintenance or diagnostics detail +- 3-5: mixed relevance, generic system context, or only weakly connected to the physical asset itself +- 1-2: not about the physical asset itself, clearly about a different asset family, or dominated by unrelated ML/system context +- Low-score examples: + - smart-grid cyberattacks or false-data-injection papers + - communications or networking papers + - grid data architecture, market, or control-system papers + - generic ML "Transformer" architecture papers + - papers about other asset families such as rotating machinery unless the target asset is actually that equipment +- High-score examples: + - condition monitoring + - fault diagnosis + - degradation, insulation, or thermal behavior + - reliability, maintenance, or standards + - sensors and measurements for the physical equipment (including vibration, thermal, electrical, or process variables as they relate to the asset) + - Industry 4.0 or IIoT when the work centers on the physical asset and its monitoring, not on abstract IT architecture alone +- In every reason, explicitly include either the phrase "physical asset focused" or the phrase "not physical asset focused". +- If the paper is off-target, say why in physical-asset terms. + +Be strict about generic smart-grid, networking, cybersecurity, market, or ML-architecture papers when the asset is a physical piece of equipment. +Output ONLY raw JSON. +""" diff --git a/src/scenarios/retrieval/__init__.py b/src/scenarios/retrieval/__init__.py new file mode 100644 index 000000000..f0a5a6c8f --- /dev/null +++ b/src/scenarios/retrieval/__init__.py @@ -0,0 +1,13 @@ +"""Evidence retrieval stage for scenario generation.""" + +from ..models import RetrieverMode +from .base import EvidenceMetadataExecutor +from .digest import synthesize_research_digest +from .pipeline import retrieve_asset_evidence + +__all__ = [ + "EvidenceMetadataExecutor", + "RetrieverMode", + "retrieve_asset_evidence", + "synthesize_research_digest", +] diff --git a/src/scenarios/retrieval/arxiv.py b/src/scenarios/retrieval/arxiv.py new file mode 100644 index 000000000..022ae3cc4 --- /dev/null +++ b/src/scenarios/retrieval/arxiv.py @@ -0,0 +1,261 @@ +"""ArXiv HTTP client and retrieval keyword constants.""" + +from __future__ import annotations + +import io +import json +import logging +from collections.abc import Callable +import ssl +import time +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET + +from ..models import EvidenceCandidate, PdfTextOutcome +from .pdf_http import fetch_pdf_bytes + +_log = logging.getLogger(__name__) + +_ARXIV_COOLDOWN_SECONDS = 3.1 +_ARXIV_BASE_URL = "http://export.arxiv.org/api/query?" +_ARXIV_HEADERS = {"User-Agent": "AssetOpsBench/1.0 (mailto:admin@example.com)"} +_MAX_METADATA_RESULTS = 6 +_MAX_PDF_PAGES = 10 + +_STOPWORDS = { + "a", + "an", + "and", + "asset", + "class", + "equipment", + "for", + "in", + "industrial", + "machine", + "of", + "on", + "or", + "plant", + "system", + "the", + "to", +} + +_DIAGNOSTIC_KEYWORDS = [ + "condition monitoring", + "diagnostic", + "diagnostics", + "fault", + "fault diagnosis", + "failure", + "failure analysis", + "degradation", + "health", + "inspection", + "maintenance", + "monitoring", + "prognostic", + "prognostics", + "reliability", +] + +_STANDARD_KEYWORDS = [ + "iec", + "ieee", + "iso", + "condition assessment", + "industry 4.0", + "iiot", + "maintenance strategy", + "reliability centered maintenance", +] + +_ML_NEGATIVE_KEYWORDS = [ + "attention mechanism", + "bert", + "deep learning", + "federated learning", + "foundation model", + "language model", + "llm", + "mamba", + "neural network", + "nlp", + "time series transformer", + "transformer architecture", + "vision transformer", +] + +_OFF_TARGET_KEYWORDS = [ + "communications", + "control system", + "control systems", + "cyber attack", + "cyber security", + "cyberattack", + "cybersecurity", + "data architecture", + "false data injection", + "market", + "networking", + "smart grid", +] + +_PHYSICAL_REASON_MARKERS = [ + "physical asset focused", + "physical equipment focused", +] + +_OFF_TARGET_REASON_MARKERS = [ + "not physical asset focused", + "communications", + "control system", + "cyberattack", + "cybersecurity", + "data architecture", + "generic ml", + "indirect relevance", + "market", + "networking", + "not directly", + "not entirely physical asset focused", + "other asset family", + "somewhat indirect", + "somewhat relevant", + "smart-grid", + "system paper", + "transformer architecture", +] + + +class _ArxivExecutor: + def __init__( + self, + cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS, + *, + log_writer: Callable[[str, str], None] | None = None, + ) -> None: + self.cooldown_seconds = cooldown_seconds + self._last_request_at: float | None = None + self.metadata_requests = 0 + self.pdf_requests = 0 + self._ctx = ssl.create_default_context() + self._ctx.check_hostname = False + self._ctx.verify_mode = ssl.CERT_NONE + self._log_writer = log_writer + + def _wait_for_cooldown(self) -> None: + if self._last_request_at is None: + return + elapsed = time.monotonic() - self._last_request_at + if elapsed < self.cooldown_seconds: + time.sleep(self.cooldown_seconds - elapsed) + + def _open(self, url: str, timeout: int) -> bytes: + self._wait_for_cooldown() + req = urllib.request.Request(url, headers=_ARXIV_HEADERS) + with urllib.request.urlopen(req, timeout=timeout, context=self._ctx) as response: + data = response.read() + self._last_request_at = time.monotonic() + return data + + def fetch_metadata( + self, + query: str, + max_results: int = _MAX_METADATA_RESULTS, + ) -> list[EvidenceCandidate]: + safe_query = urllib.parse.quote(query) + url = f"{_ARXIV_BASE_URL}search_query={safe_query}&start=0&max_results={max_results}" + self.metadata_requests += 1 + + try: + data = self._open(url, timeout=10) + except urllib.error.HTTPError as exc: + _log.warning("HTTP error fetching ArXiv metadata for %r: %s", query, exc) + return [] + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch ArXiv metadata for %r: %s", query, exc) + return [] + + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_arxiv.json", + json.dumps( + { + "backend": "arxiv", + "query": query, + "request_url": url, + "content_type": "application/atom+xml", + "raw_response": data.decode("utf-8", errors="replace"), + }, + indent=2, + ensure_ascii=False, + ), + ) + + try: + root = ET.fromstring(data) + except ET.ParseError as exc: + _log.warning("Failed to parse ArXiv XML for %r: %s", query, exc) + return [] + + ns = {"atom": "http://www.w3.org/2005/Atom"} + candidates: list[EvidenceCandidate] = [] + for entry in root.findall("atom:entry", ns): + raw_id = entry.findtext("atom:id", default="", namespaces=ns).strip() + paper_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" + title = entry.findtext("atom:title", default="No Title", namespaces=ns) + summary = entry.findtext("atom:summary", default="No Summary", namespaces=ns) + published = entry.findtext("atom:published", default="", namespaces=ns).strip() or None + + pdf_url = None + for link in entry.findall("atom:link", ns): + href = link.attrib.get("href") + if link.attrib.get("title") == "pdf" or link.attrib.get("type") == "application/pdf": + pdf_url = href + if pdf_url and not pdf_url.endswith(".pdf"): + pdf_url += ".pdf" + break + + candidates.append( + EvidenceCandidate( + paper_id=paper_id or title.strip(), + title=title.strip().replace("\n", " "), + summary=summary.strip().replace("\n", " "), + query=query, + pdf_url=pdf_url, + published=published, + ) + ) + return candidates + + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES + ) -> tuple[str, PdfTextOutcome]: + self.pdf_requests += 1 + try: + pdf_bytes = fetch_pdf_bytes(pdf_url, timeout=15) + from pypdf import PdfReader + + reader = PdfReader(io.BytesIO(pdf_bytes)) + pages: list[str] = [] + for index, page in enumerate(reader.pages): + if index >= max_pages: + break + page_text = page.extract_text() + if page_text: + pages.append(page_text) + text = "\n".join(pages) + if text.strip(): + return text, "ok" + return "", "empty_text" + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch or parse ArXiv PDF %s: %s", pdf_url, exc) + return "", "fetch_failed" + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + text, _ = self.fetch_pdf_text_detail(pdf_url, max_pages) + return text diff --git a/src/scenarios/retrieval/base.py b/src/scenarios/retrieval/base.py new file mode 100644 index 000000000..fc856ccbf --- /dev/null +++ b/src/scenarios/retrieval/base.py @@ -0,0 +1,20 @@ +"""Protocol for evidence metadata executors (ArXiv, Semantic Scholar, etc.).""" + +from __future__ import annotations + +from typing import Protocol + +from ..models import EvidenceCandidate, PdfTextOutcome + + +class EvidenceMetadataExecutor(Protocol): + def fetch_metadata(self, query: str, max_results: int = 6) -> list[EvidenceCandidate]: + ... + + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = 10 + ) -> tuple[str, PdfTextOutcome]: + ... + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = 10) -> str: + ... diff --git a/src/scenarios/retrieval/digest.py b/src/scenarios/retrieval/digest.py new file mode 100644 index 000000000..7f8fad44b --- /dev/null +++ b/src/scenarios/retrieval/digest.py @@ -0,0 +1,154 @@ +"""Synthesize merged research digest from retrieved papers.""" + +from __future__ import annotations + +import logging +from collections.abc import Callable + +from llm import LLMBackend + +from ..models import EvidenceBundle, EvidenceCandidate, RetrieverMode +from ..text import truncate_title_one_line +from ..prompts.research_digest import ( + RESEARCH_DIGEST_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + RESEARCH_MERGE_PROMPT, + RESEARCH_PER_PAPER_PROMPT, +) +from .arxiv import _MAX_PDF_PAGES +from .pipeline import _make_executor + +_log = logging.getLogger(__name__) + +_MAX_DIGEST_BODY_CHARS = 28_000 +_DIGEST_PER_PAPER_MAX_TOKENS = 4096 +_DIGEST_MERGE_MAX_TOKENS = 4096 + + +def _candidates_for_digest(bundle: EvidenceBundle) -> list[EvidenceCandidate]: + by_id = {c.paper_id: c for c in bundle.candidates} + ordered: list[EvidenceCandidate] = [] + for aid in bundle.selected_candidate_ids: + if aid in by_id: + ordered.append(by_id[aid]) + if ordered: + return ordered + return list(bundle.candidates[:3]) + + +def _truncate_body(text: str) -> str: + text = text.strip() + if len(text) <= _MAX_DIGEST_BODY_CHARS: + return text + return text[:_MAX_DIGEST_BODY_CHARS] + "\n\n[... truncated for digest input ...]" + + +def _body_text_for_candidate( + executor, + candidate: EvidenceCandidate, + *, + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, +) -> tuple[str, str]: + pdf_unavailable = False + if not candidate.pdf_url: + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", "no_pdf_url") + else: + pdf_text, pdf_outcome = executor.fetch_pdf_text_detail( + candidate.pdf_url, max_pages=_MAX_PDF_PAGES + ) + if pdf_outcome == "ok": + if on_pdf_fetched: + on_pdf_fetched(candidate) + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", "ok") + return "pdf", _truncate_body(pdf_text) + pdf_unavailable = True + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", pdf_outcome) + + summary = (candidate.summary or "").strip() + if summary: + if pdf_unavailable: + _log.info( + "Using abstract text (PDF unavailable) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + return "abstract", _truncate_body(summary) + + if pdf_unavailable: + _log.info( + "No extractable text (PDF unavailable, empty abstract) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + else: + _log.info( + "No extractable text (no PDF URL, empty abstract) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + return "abstract", "(no extractable text)" + + +def synthesize_research_digest( + bundle: EvidenceBundle, + llm: LLMBackend, + *, + retriever: RetrieverMode = "arxiv", + log_writer: Callable[[str, str], None] | None = None, + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, +) -> str: + executor = _make_executor(retriever) + asset_name = bundle.asset_name + canonical = bundle.canonical_asset_name + candidates = _candidates_for_digest(bundle) + + if not candidates: + merged = ( + "## Note\n\nNo ranked papers were available after retrieval; " + "the research digest is empty. Stay conservative in the asset profile." + ) + if log_writer: + log_writer("02_retrieval/paper_digest/merged.txt", merged) + return merged + + per_paper_digests: list[str] = [] + for index, candidate in enumerate(candidates, start=1): + source_kind, body_text = _body_text_for_candidate( + executor, + candidate, + on_pdf_fetched=on_pdf_fetched, + on_pdf_workflow=on_pdf_workflow, + ) + prompt = RESEARCH_PER_PAPER_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical, + headings_markdown=RESEARCH_DIGEST_HEADINGS_MARKDOWN, + body_text=body_text, + ) + digest = llm.generate_with_usage( + prompt, max_tokens=_DIGEST_PER_PAPER_MAX_TOKENS + ).text + block = ( + f"### Paper {index} (source: {source_kind})\n{digest.strip()}" + ) + per_paper_digests.append(block) + if log_writer: + log_writer(f"02_retrieval/paper_digest/per_paper_{index:02d}.txt", digest.strip()) + + merge_prompt = RESEARCH_MERGE_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical, + merge_headings_markdown=RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + per_paper_digests="\n\n".join(per_paper_digests), + ) + merged = llm.generate_with_usage( + merge_prompt, max_tokens=_DIGEST_MERGE_MAX_TOKENS + ).text.strip() + if log_writer: + log_writer("02_retrieval/paper_digest/merged.txt", merged) + return merged diff --git a/src/scenarios/retrieval/pdf_http.py b/src/scenarios/retrieval/pdf_http.py new file mode 100644 index 000000000..3da5c0af4 --- /dev/null +++ b/src/scenarios/retrieval/pdf_http.py @@ -0,0 +1,58 @@ +"""Plain HTTP GET for PDF bytes (browser-like headers).""" + +from __future__ import annotations + +import requests + +_BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" +_PDF_HEADERS = { + "User-Agent": _BROWSER_UA, + "Accept": "application/pdf,*/*", +} + + +def probe_pdf_url(url: str, *, timeout: float = 15.0) -> bool: + cleaned = (url or "").strip() + if not cleaned: + return False + + session = requests.Session() + try: + response = session.head( + cleaned, + headers=_PDF_HEADERS, + timeout=timeout, + allow_redirects=True, + ) + if response.status_code == 200: + content_type = (response.headers.get("Content-Type") or "").lower() + if "pdf" in content_type: + return True + if "octet-stream" in content_type: + return True + except (requests.RequestException, OSError): + pass + + try: + response = session.get( + cleaned, + headers=_PDF_HEADERS, + timeout=timeout, + allow_redirects=True, + stream=True, + ) + response.raise_for_status() + chunk = next(response.iter_content(4096), b"") + response.close() + return len(chunk) >= 4 and chunk[:4] == b"%PDF" + except (requests.RequestException, OSError, StopIteration): + return False + + +def fetch_pdf_bytes(url: str, *, timeout: float = 20) -> bytes: + session = requests.Session() + headers = dict(_PDF_HEADERS) + headers["Accept"] = "application/pdf" + response = session.get(url, headers=headers, timeout=timeout, allow_redirects=True) + response.raise_for_status() + return response.content diff --git a/src/scenarios/retrieval/pipeline.py b/src/scenarios/retrieval/pipeline.py new file mode 100644 index 000000000..b83bc7f15 --- /dev/null +++ b/src/scenarios/retrieval/pipeline.py @@ -0,0 +1,762 @@ +"""LLM-orchestrated evidence retrieval (academic search engine backends).""" + +from __future__ import annotations + +import json +import logging +import os +import re +from typing import Callable + +from llm import LLMBackend + +from ..models import ( + EvidenceBundle, + EvidenceCandidate, + EvidenceSnippet, + RetrievalAction, + RetrieverMode, +) +from ..prompts import ( + RETRIEVAL_METADATA_JUDGE_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT_SECTION, +) +from ..prompts.research_digest import RESEARCH_DIGEST_MERGE_SECTION_HEADINGS +from ..text import collapse_whitespace_lower, truncate_title_one_line +from ..utils import parse_llm_json +from .arxiv import ( + _ARXIV_COOLDOWN_SECONDS, + _ArxivExecutor, + _DIAGNOSTIC_KEYWORDS, + _ML_NEGATIVE_KEYWORDS, + _OFF_TARGET_KEYWORDS, + _OFF_TARGET_REASON_MARKERS, + _PHYSICAL_REASON_MARKERS, + _STANDARD_KEYWORDS, + _STOPWORDS, +) +from .base import EvidenceMetadataExecutor +from .pdf_http import probe_pdf_url +from .semantic_scholar import SemanticScholarExecutor + +_MAX_STEPS = 5 +_MAX_QUERIES_PER_STEP = 2 +_MAX_CANDIDATE_POOL = 8 +_TOP_PDF_DOWNLOADS = 3 +_MAX_SNIPPETS_PER_DOC = 3 +_RETRIEVAL_LLM_MAX_TOKENS = 4096 + +_log = logging.getLogger(__name__) + + +def _tokenise(text: str) -> list[str]: + return re.findall(r"[a-z0-9]+", text.lower()) + + +def _default_canonical_asset_name(asset_name: str) -> str: + return collapse_whitespace_lower(asset_name.replace("_", " ")) + + +def _unique_preserve_order(items: list[str]) -> list[str]: + seen: set[str] = set() + ordered: list[str] = [] + for item in items: + clean = item.strip() + if clean and clean not in seen: + ordered.append(clean) + seen.add(clean) + return ordered + + +def _asset_tokens(asset_name: str) -> list[str]: + return [ + token + for token in _tokenise(asset_name) + if len(token) > 2 and token not in _STOPWORDS + ] + + +def _render_queries(queries: list[str]) -> str: + return "\n".join(f"- {query}" for query in queries) if queries else "(none yet)" + + +def _render_results_summary(candidates: list[EvidenceCandidate]) -> str: + if not candidates: + return "(no judged results yet)" + lines = [] + for candidate in candidates[:5]: + lines.append( + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title} | {candidate.judge_reason}" + ) + return "\n".join(lines) + + +def _summarise_metadata_for_judge(candidates: list[EvidenceCandidate]) -> str: + payload = [ + { + "paper_id": candidate.paper_id, + "title": candidate.title, + "summary": candidate.summary, + "query": candidate.query, + "published": candidate.published, + } + for candidate in candidates + ] + return json.dumps(payload, indent=2, ensure_ascii=True) + + +def _coerce_action(parsed: object) -> RetrievalAction: + if not isinstance(parsed, dict): + raise ValueError("Retrieval planner response could not be parsed as an object.") + + action = str(parsed.get("action", "")).strip().lower() + if action not in {"search", "finish"}: + raise ValueError(f"Retrieval planner returned invalid action: {action!r}") + + reason = str(parsed.get("reason", "")).strip() + if not reason: + raise ValueError("Retrieval planner is missing required non-empty field: 'reason'") + + canonical = str(parsed.get("canonical_asset_name", "")).strip() + if not canonical: + raise ValueError("Retrieval planner is missing required non-empty field: 'canonical_asset_name'") + + action_obj = RetrievalAction( + action=action, + reason=reason, + canonical_asset_name=canonical, + queries=[ + str(query).strip() + for query in parsed.get("queries", []) + if str(query).strip() + ][:_MAX_QUERIES_PER_STEP], + selected_ids=[ + str(pid).strip() + for pid in parsed.get("selected_ids", []) + if str(pid).strip() + ], + ) + + if action_obj.action == "finish": + action_obj.queries = [] + + return action_obj + + +def _judge_fallback( + candidate: EvidenceCandidate, + canonical_asset_name: str, +) -> tuple[int, str]: + text = collapse_whitespace_lower(f"{candidate.title} {candidate.summary}") + asset_phrase = collapse_whitespace_lower(canonical_asset_name) + asset_tokens = _asset_tokens(canonical_asset_name) + + score = 2 + reasons: list[str] = [] + + if asset_phrase and asset_phrase in text: + score += 4 + reasons.append("physical asset focused; mentions canonical asset") + else: + hits = sum(1 for token in asset_tokens if token in text) + if hits: + score += min(3, hits) + reasons.append("physical asset focused; partial asset overlap") + + if any(keyword in text for keyword in _DIAGNOSTIC_KEYWORDS): + score += 2 + reasons.append("physical asset focused; diagnostics or reliability terms") + + if any(keyword in text for keyword in _OFF_TARGET_KEYWORDS): + score -= 3 + reasons.append("not physical asset focused; system, cyber, networking, or smart-grid context") + + if any(keyword in text for keyword in _ML_NEGATIVE_KEYWORDS): + score -= 2 + reasons.append("not physical asset focused; contains generic ML framing") + + score = max(1, min(10, score)) + if not reasons: + reasons.append("not physical asset focused; fallback metadata relevance estimate") + reason = "; ".join(reasons) + return score, reason + + +def _judge_metadata_batch( + asset_name: str, + canonical_asset_name: str, + candidates: list[EvidenceCandidate], + llm: LLMBackend, +) -> list[EvidenceCandidate]: + if not candidates: + return [] + + prompt = RETRIEVAL_METADATA_JUDGE_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + metadata_entries_json=_summarise_metadata_for_judge(candidates), + ) + response = llm.generate_with_usage( + prompt, max_tokens=_RETRIEVAL_LLM_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + + scored_by_id: dict[str, tuple[int, str]] = {} + if isinstance(parsed, list): + for entry in parsed: + if not isinstance(entry, dict): + continue + paper_id = str(entry.get("paper_id", "")).strip() + if not paper_id: + continue + raw_score = entry.get("score_1_to_10", 0) + try: + score = int(raw_score) + except (TypeError, ValueError): + score = 0 + score = max(1, min(10, score)) if score else 0 + reason = str(entry.get("reason", "")).strip() or "No judge reason provided." + if score: + scored_by_id[paper_id] = (score, reason) + + judged: list[EvidenceCandidate] = [] + for candidate in candidates: + score_reason = scored_by_id.get(candidate.paper_id) + if score_reason is None: + score_reason = _judge_fallback(candidate, canonical_asset_name) + candidate.judge_score = score_reason[0] + candidate.judge_reason = score_reason[1] + judged.append(candidate) + return judged + + +def _merge_pool( + pool: dict[str, EvidenceCandidate], + judged_candidates: list[EvidenceCandidate], +) -> None: + for candidate in judged_candidates: + existing = pool.get(candidate.paper_id) + if existing is None or candidate.judge_score > existing.judge_score: + pool[candidate.paper_id] = candidate + + +def _sorted_candidates(pool: dict[str, EvidenceCandidate]) -> list[EvidenceCandidate]: + return sorted( + pool.values(), + key=lambda candidate: (candidate.judge_score, candidate.title.lower()), + reverse=True, + ) + + +def _section_slug(section_heading: str) -> str: + slug = re.sub(r"[^a-zA-Z0-9]+", "_", section_heading.lower()).strip("_") + return slug[:80] if slug else "section" + + +def _merge_global_pools( + global_pool: dict[str, EvidenceCandidate], + section_pool: dict[str, EvidenceCandidate], +) -> None: + for paper_id, candidate in section_pool.items(): + existing = global_pool.get(paper_id) + if existing is None or candidate.judge_score > existing.judge_score: + global_pool[paper_id] = candidate + + +def _filter_fetchable_candidates(raw: list[EvidenceCandidate]) -> list[EvidenceCandidate]: + kept: list[EvidenceCandidate] = [] + for candidate in raw: + if not candidate.pdf_url: + continue + if probe_pdf_url(candidate.pdf_url): + kept.append(candidate) + else: + _log.debug( + "Dropped candidate (PDF probe failed): %s | %s", + candidate.paper_id, + (candidate.pdf_url or "")[:120], + ) + return kept + + +def _fallback_retry_queries_section( + canonical_asset_name: str, + query_history: list[str], + section_heading: str, +) -> list[str]: + canonical = _default_canonical_asset_name(canonical_asset_name) + snippet = section_heading.split(",")[0].strip().lower() + if len(snippet) > 48: + snippet = snippet[:45] + "..." + candidates = [ + f"{canonical} condition monitoring {snippet}", + f"{canonical} fault diagnosis {snippet}", + f"{canonical} condition assessment {snippet}", + f"{canonical} maintenance {snippet}", + f"{canonical} degradation {snippet}", + f"{canonical} physical measurements {snippet}", + f"{canonical} sensor monitoring {snippet}", + f"{canonical} IIoT {snippet}", + ] + return [ + query + for query in _unique_preserve_order(candidates) + if query not in query_history + ][:_MAX_QUERIES_PER_STEP] + + +def _candidate_reason_flags(reason: str) -> tuple[bool, bool]: + normalized = collapse_whitespace_lower(reason) + is_off_target = any(marker in normalized for marker in _OFF_TARGET_REASON_MARKERS) + is_physical = ( + not is_off_target + and any(marker in normalized for marker in _PHYSICAL_REASON_MARKERS) + ) + return is_physical, is_off_target + + +def _candidate_focus_label(candidate: EvidenceCandidate) -> str: + is_physical, is_off_target = _candidate_reason_flags(candidate.judge_reason) + if candidate.judge_score >= 8 and is_physical: + return "accepted: physical asset focused" + if is_off_target or candidate.judge_score <= 4: + return "rejected: not physical asset focused" + return "mixed: uncertain physical asset focus" + + +def _evaluate_candidate_pool(candidates: list[EvidenceCandidate]) -> tuple[bool, str]: + if not candidates: + return False, "No judged candidates are available yet." + + top_candidates = candidates[:5] + strong_physical = 0 + off_target = 0 + + for candidate in top_candidates: + is_physical, is_off_target = _candidate_reason_flags(candidate.judge_reason) + if candidate.judge_score >= 8 and is_physical: + strong_physical += 1 + elif is_off_target or candidate.judge_score <= 4: + off_target += 1 + + if strong_physical < 2: + return ( + False, + f"Only {strong_physical} top candidates are clearly physical asset focused; need at least 2 before finishing early.", + ) + + if off_target >= strong_physical: + return ( + False, + "Top candidates are still dominated by system, cyber, networking, or ML-context papers.", + ) + + return ( + True, + f"Top pool contains {strong_physical} clearly physical-asset-focused papers.", + ) + + +def _extract_snippet_text(text: str, canonical_asset_name: str) -> str: + compact = re.sub(r"\s+", " ", text).strip() + if not compact: + return "" + + keywords = _unique_preserve_order( + [canonical_asset_name, *_DIAGNOSTIC_KEYWORDS, *_STANDARD_KEYWORDS] + ) + lowered = compact.lower() + windows: list[tuple[int, int]] = [] + for keyword in keywords: + norm = collapse_whitespace_lower(keyword) + if not norm: + continue + idx = lowered.find(norm) + if idx == -1: + continue + start = max(0, idx - 220) + end = min(len(compact), idx + len(norm) + 220) + windows.append((start, end)) + if len(windows) >= _MAX_SNIPPETS_PER_DOC: + break + + if not windows: + return compact[:900] + + snippets = [compact[start:end].strip() for start, end in windows if compact[start:end].strip()] + return "\n...\n".join(snippets[:_MAX_SNIPPETS_PER_DOC]) + + +def _select_final_candidates( + pool: dict[str, EvidenceCandidate], + preferred_ids: list[str], +) -> tuple[list[EvidenceCandidate], list[str]]: + ordered_pool = _sorted_candidates(pool) + ordered_by_id = {candidate.paper_id: candidate for candidate in ordered_pool} + + selected: list[EvidenceCandidate] = [] + selected_ids: list[str] = [] + for pid in preferred_ids: + candidate = ordered_by_id.get(pid) + if candidate and pid not in selected_ids: + selected.append(candidate) + selected_ids.append(pid) + + for candidate in ordered_pool: + if candidate.paper_id in selected_ids: + continue + selected.append(candidate) + selected_ids.append(candidate.paper_id) + if len(selected) >= _TOP_PDF_DOWNLOADS: + break + + return selected[:_TOP_PDF_DOWNLOADS], selected_ids[:_TOP_PDF_DOWNLOADS] + + +def _render_step_log( + step_number: int, + action: RetrievalAction, + new_queries: list[str], + fetched_candidates: list[EvidenceCandidate], + pool: dict[str, EvidenceCandidate], + canonical_asset_name: str, + *, + section_heading: str | None = None, + metadata_rows_before_probe: int | None = None, +) -> str: + lines = [] + if section_heading: + lines.append(f"Section: {section_heading}") + lines.extend( + [ + f"Step: {step_number}/{_MAX_STEPS}", + f"Action: {action.action}", + f"Canonical Asset: {canonical_asset_name}", + f"Reason: {action.reason}", + "", + "Queries:", + ] + ) + if new_queries: + lines.extend(f"- {query}" for query in new_queries) + else: + lines.append("(no new queries)") + + lines.extend(["", "Fetched Metadata:"]) + if metadata_rows_before_probe is not None: + lines.append( + f"(metadata rows: {metadata_rows_before_probe}, " + f"fetchable PDF after probe: {len(fetched_candidates)})" + ) + if fetched_candidates: + for candidate in fetched_candidates: + lines.append( + f"- [{candidate.judge_score}/10] {candidate.title}" + ) + lines.append(f" paper_id: {candidate.paper_id}") + lines.append(f" query: {candidate.query}") + lines.append(f" assessment: {_candidate_focus_label(candidate)}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(no metadata fetched)") + + lines.extend(["", "Current Top Candidates:"]) + top_candidates = _sorted_candidates(pool)[:5] + if top_candidates: + for candidate in top_candidates: + lines.append( + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title}" + ) + lines.append(f" assessment: {_candidate_focus_label(candidate)}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(no judged candidates in pool)") + + focused, focus_reason = _evaluate_candidate_pool(top_candidates) + lines.extend( + [ + "", + f"Physical Asset Focused: {'yes' if focused else 'no'}", + f"Focus Summary: {focus_reason}", + ] + ) + + return "\n".join(lines) + + +def _render_final_log( + bundle: EvidenceBundle, + selected_candidates: list[EvidenceCandidate], +) -> str: + focused, focus_reason = _evaluate_candidate_pool(bundle.candidates) + lines = [ + f"Asset: {bundle.asset_name}", + f"Canonical Asset: {bundle.canonical_asset_name}", + f"Physical Asset Focused: {'yes' if focused else 'no'}", + "", + "Query History:", + ] + if bundle.query_history: + lines.extend(f"- {query}" for query in bundle.query_history) + else: + lines.append("(none)") + + lines.extend(["", "Top Judged Candidates:"]) + if bundle.candidates: + for candidate in bundle.candidates: + lines.append( + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title}" + ) + lines.append(f" query: {candidate.query}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(none)") + + lines.extend(["", "Selected PDFs:"]) + if selected_candidates: + for candidate in selected_candidates: + lines.append( + f"- paper_id={candidate.paper_id} | {candidate.title}" + ) + lines.append(f" pdf: {candidate.pdf_url or '(no pdf url)'}") + else: + lines.append("(none)") + + lines.extend(["", f"Final Pool Assessment: {focus_reason}"]) + + return "\n".join(lines) + + +def _retrieve_for_section( + asset_name: str, + canonical_asset_name: str, + section_heading: str, + section_slug: str, + server_desc: dict[str, str], + llm: LLMBackend, + executor: EvidenceMetadataExecutor, + log_writer: Callable[[str, str], None] | None, + on_academic_query: Callable[[str, int], None] | None, +) -> tuple[str, dict[str, EvidenceCandidate], list[str]]: + query_history: list[str] = [] + candidate_pool: dict[str, EvidenceCandidate] = {} + log_prefix = f"02_retrieval/paper_search/{section_slug}" + + for step_number in range(1, _MAX_STEPS + 1): + current_summary = _render_results_summary(_sorted_candidates(candidate_pool)) + previous_queries = _render_queries(query_history) + prompt = RETRIEVAL_QUERY_PLAN_PROMPT_SECTION.format( + asset_name=asset_name, + step_number=step_number, + max_steps=_MAX_STEPS, + canonical_asset_name=canonical_asset_name, + tool_descriptions=json.dumps(server_desc, indent=2), + previous_queries=previous_queries, + current_results_summary=current_summary, + section_heading=section_heading, + ) + response = llm.generate_with_usage( + prompt, max_tokens=_RETRIEVAL_LLM_MAX_TOKENS + ) + parsed, _ = parse_llm_json(response.text) + action = _coerce_action(parsed) + canonical_asset_name = action.canonical_asset_name + + if action.action == "finish" and candidate_pool: + pool_focused, focus_reason = _evaluate_candidate_pool( + _sorted_candidates(candidate_pool) + ) + if pool_focused or step_number == _MAX_STEPS: + if log_writer: + log_writer( + f"{log_prefix}/step_{step_number:02d}.txt", + _render_step_log( + step_number=step_number, + action=action, + new_queries=[], + fetched_candidates=[], + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + ), + ) + break + + action = RetrievalAction( + action="search", + reason=f"Early finish blocked. {focus_reason}", + canonical_asset_name=canonical_asset_name, + queries=_fallback_retry_queries_section( + canonical_asset_name, query_history, section_heading + ), + ) + + new_queries = [ + query + for query in _unique_preserve_order(action.queries) + if query not in query_history + ][: _MAX_QUERIES_PER_STEP] + + if not new_queries: + if log_writer: + log_writer( + f"{log_prefix}/step_{step_number:02d}.txt", + _render_step_log( + step_number=step_number, + action=RetrievalAction( + action="finish", + reason=action.reason + or ( + "No new queries remained; keeping the best-so-far pool." + if candidate_pool + else "No new queries from planner and no evidence pool yet." + ), + canonical_asset_name=canonical_asset_name, + ), + new_queries=[], + fetched_candidates=[], + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + ), + ) + break + + query_history.extend(new_queries) + merged_raw: list[EvidenceCandidate] = [] + for query in new_queries: + rows = executor.fetch_metadata(query) + merged_raw.extend(rows) + if on_academic_query: + on_academic_query(query, len(rows)) + + raw_count = len(merged_raw) + fetchable = _filter_fetchable_candidates(merged_raw) + + judged_candidates = _judge_metadata_batch( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + candidates=fetchable, + llm=llm, + ) + _merge_pool(candidate_pool, judged_candidates) + + if log_writer: + log_writer( + f"{log_prefix}/step_{step_number:02d}.txt", + _render_step_log( + step_number=step_number, + action=action, + new_queries=new_queries, + fetched_candidates=judged_candidates, + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + metadata_rows_before_probe=raw_count, + ), + ) + + return canonical_asset_name, candidate_pool, query_history + + +def _make_executor( + retriever: RetrieverMode, + log_writer: Callable[[str, str], None] | None = None, +) -> EvidenceMetadataExecutor: + if retriever == "semantic_scholar": + key = os.environ.get("SEMANTIC_SCHOLAR_API_KEY") + return SemanticScholarExecutor(api_key=key, log_writer=log_writer) + return _ArxivExecutor(cooldown_seconds=_ARXIV_COOLDOWN_SECONDS, log_writer=log_writer) + + +def retrieve_asset_evidence( + asset_name: str, + server_desc: dict[str, str], + llm: LLMBackend, + log_writer: Callable[[str, str], None] | None = None, + *, + retriever: RetrieverMode = "arxiv", + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, + on_academic_query: Callable[[str, int], None] | None = None, +) -> EvidenceBundle: + executor = _make_executor(retriever, log_writer=log_writer) + canonical_asset_name = _default_canonical_asset_name(asset_name) + query_history: list[str] = [] + candidate_pool: dict[str, EvidenceCandidate] = {} + + for section_heading in RESEARCH_DIGEST_MERGE_SECTION_HEADINGS: + section_slug = _section_slug(section_heading) + canonical_asset_name, section_pool, section_queries = _retrieve_for_section( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + section_slug=section_slug, + server_desc=server_desc, + llm=llm, + executor=executor, + log_writer=log_writer, + on_academic_query=on_academic_query, + ) + for query in section_queries: + query_history.append(f"[{section_heading}] {query}") + _merge_global_pools(candidate_pool, section_pool) + + top_candidates = _sorted_candidates(candidate_pool)[:_MAX_CANDIDATE_POOL] + selected_candidates, selected_candidate_ids = _select_final_candidates( + candidate_pool, + [], + ) + + snippets: list[EvidenceSnippet] = [] + for candidate in selected_candidates: + source = "summary" + text = candidate.summary + if candidate.pdf_url: + pdf_text, pdf_outcome = executor.fetch_pdf_text_detail(candidate.pdf_url) + if pdf_outcome == "ok": + source = "pdf" + text = pdf_text + if on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", "ok") + if on_pdf_fetched: + on_pdf_fetched(candidate) + else: + _log.info( + "Using abstract/summary for evidence snippet (PDF unavailable) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + if on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", pdf_outcome) + elif on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", "no_pdf_url") + snippet_text = _extract_snippet_text(text, canonical_asset_name) + if not snippet_text: + continue + snippets.append( + EvidenceSnippet( + paper_id=candidate.paper_id, + title=candidate.title, + url=candidate.pdf_url, + source=source, + text=snippet_text, + ) + ) + + bundle = EvidenceBundle( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + query_history=query_history, + selected_candidate_ids=selected_candidate_ids, + candidates=top_candidates, + snippets=snippets, + ) + + if log_writer: + log_writer( + "02_retrieval/paper_search/summary.txt", + _render_final_log(bundle, selected_candidates), + ) + + return bundle diff --git a/src/scenarios/retrieval/semantic_scholar.py b/src/scenarios/retrieval/semantic_scholar.py new file mode 100644 index 000000000..00aae53a2 --- /dev/null +++ b/src/scenarios/retrieval/semantic_scholar.py @@ -0,0 +1,322 @@ +"""Semantic Scholar Graph API client (paper search, PDF fetch; 1 Graph API req/s in-process).""" + +from __future__ import annotations + +import io +import json +import logging +from collections.abc import Callable +import re +import ssl +import threading +import time +import urllib.error +import urllib.parse +import urllib.request + +import certifi + +from ..models import EvidenceCandidate, PdfTextOutcome +from .arxiv import _MAX_METADATA_RESULTS, _MAX_PDF_PAGES +from .pdf_http import fetch_pdf_bytes + +_log = logging.getLogger(__name__) + +_S2_SEARCH_URL = "https://api.semanticscholar.org/graph/v1/paper/search" +_S2_API_HOST = "api.semanticscholar.org" +_S2_MIN_INTERVAL_SECONDS = 1.0 +_S2_USER_AGENT = "AssetOpsBench/1.0 (mailto:admin@example.com)" + +_SEARCH_FIELDS = "paperId,title,abstract,year,openAccessPdf,externalIds" + +_s2_api_rate_lock = threading.Lock() +_s2_last_api_request_at: float | None = None + + +def _is_doi_or_non_pdf_landing_url(url: str) -> bool: + try: + parsed = urllib.parse.urlparse(url) + host = (parsed.hostname or "").lower() + except Exception: # noqa: BLE001 + return True + if host in {"doi.org", "dx.doi.org"} or host.endswith(".doi.org"): + return True + if "link.springer.com" in host and "/article/" in (parsed.path or ""): + return True + if "nature.com" in host and "/articles/" in (parsed.path or "") and not (parsed.path or "").lower().endswith(".pdf"): + return True + return False + + +def _is_likely_direct_pdf_url(url: str) -> bool: + if _is_doi_or_non_pdf_landing_url(url): + return False + try: + parsed = urllib.parse.urlparse(url) + host = (parsed.hostname or "").lower() + path = (parsed.path or "").lower() + except Exception: # noqa: BLE001 + return False + if path.endswith(".pdf"): + return True + if "arxiv.org" in host and "/pdf/" in path: + return True + if host == "pdfs.semanticscholar.org": + return True + if "pmc.ncbi.nlm.nih.gov" in host and "pdf" in path: + return True + return False + + +def _arxiv_external_id_to_pdf_url(raw: str) -> str | None: + aid = raw.strip() + if not aid: + return None + lower = aid.lower() + if lower.startswith("arxiv:"): + aid = aid.split(":", 1)[1].strip() + if aid.startswith("http"): + try: + parsed = urllib.parse.urlparse(aid) + if "arxiv.org" in (parsed.hostname or "").lower() and "/abs/" in (parsed.path or ""): + tail = (parsed.path or "").split("/abs/", 1)[-1].rstrip("/") + if tail: + return f"https://arxiv.org/pdf/{tail}.pdf" + except Exception: # noqa: BLE001 + return None + return None + return f"https://arxiv.org/pdf/{aid}.pdf" + + +def _pdf_url_from_external_ids(ext: object) -> str | None: + if not isinstance(ext, dict): + return None + for key in ("ArXiv", "arXiv", "arxiv"): + raw = ext.get(key) + if isinstance(raw, str) and raw.strip(): + return _arxiv_external_id_to_pdf_url(raw) + return None + + +def _normalize_open_access_url(url: str) -> str: + u = url.strip().split("#")[0] + if "arxiv.org/abs/" not in u: + return u + tail = u.split("/abs/", 1)[-1].rstrip("/") + if not tail: + return u + return f"https://arxiv.org/pdf/{tail}.pdf" + + +def _resolve_pdf_url_for_paper(row: dict) -> str | None: + oa = row.get("openAccessPdf") + oa_url: str | None = None + if isinstance(oa, dict): + u = oa.get("url") + if isinstance(u, str) and u.strip(): + oa_url = _normalize_open_access_url(u.strip()) + + if oa_url and _is_doi_or_non_pdf_landing_url(oa_url): + oa_url = None + + ext_pdf = _pdf_url_from_external_ids(row.get("externalIds")) + + if oa_url and _is_likely_direct_pdf_url(oa_url): + return oa_url + + if ext_pdf: + return ext_pdf + + if oa_url: + return oa_url + + return None + + +def _normalize_s2_query(query: str) -> str: + return re.sub(r"\s*-\s*", " ", query).strip() + + +def _ssl_context() -> ssl.SSLContext: + return ssl.create_default_context(cafile=certifi.where()) + + +def _is_semantic_scholar_api_url(url: str) -> bool: + try: + host = (urllib.parse.urlparse(url).hostname or "").lower() + except Exception: # noqa: BLE001 — urlparse is defensive for odd strings + return False + return host == _S2_API_HOST + + +def _http_get(url: str, *, timeout: int, ctx: ssl.SSLContext, headers: dict[str, str]) -> bytes: + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=timeout, context=ctx) as response: + return response.read() + + +def _semantic_scholar_api_get(url: str, *, timeout: int, ctx: ssl.SSLContext, headers: dict[str, str]) -> bytes: + global _s2_last_api_request_at + with _s2_api_rate_lock: + if _s2_last_api_request_at is not None: + elapsed = time.monotonic() - _s2_last_api_request_at + if elapsed < _S2_MIN_INTERVAL_SECONDS: + time.sleep(_S2_MIN_INTERVAL_SECONDS - elapsed) + data = _http_get(url, timeout=timeout, ctx=ctx, headers=headers) + _s2_last_api_request_at = time.monotonic() + return data + + +class SemanticScholarExecutor: + def __init__( + self, + *, + api_key: str | None = None, + log_writer: Callable[[str, str], None] | None = None, + ) -> None: + self._api_key = (api_key or "").strip() or None + self.metadata_requests = 0 + self.pdf_requests = 0 + self._ctx = _ssl_context() + self._log_writer = log_writer + + def _s2_headers(self) -> dict[str, str]: + headers = {"User-Agent": _S2_USER_AGENT, "Accept": "application/json"} + if self._api_key: + headers["x-api-key"] = self._api_key + return headers + + def _open(self, url: str, timeout: int) -> bytes: + if not _is_semantic_scholar_api_url(url): + raise ValueError(f"Expected Semantic Scholar API URL, got {url!r}") + return _semantic_scholar_api_get(url, timeout=timeout, ctx=self._ctx, headers=self._s2_headers()) + + def fetch_metadata( + self, + query: str, + max_results: int = _MAX_METADATA_RESULTS, + ) -> list[EvidenceCandidate]: + q = _normalize_s2_query(query) + limit = max(1, min(max_results, 100)) + params = urllib.parse.urlencode( + { + "query": q, + "limit": str(limit), + "fields": _SEARCH_FIELDS, + } + ) + search_url = f"{_S2_SEARCH_URL}?{params}" + self.metadata_requests += 1 + + try: + raw = self._open(search_url, timeout=15) + except urllib.error.HTTPError as exc: + _log.warning("HTTP error fetching Semantic Scholar paper search for %r: %s", query, exc) + return [] + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch Semantic Scholar paper search for %r: %s", query, exc) + return [] + + payload_text = raw.decode("utf-8", errors="replace") + try: + payload = json.loads(payload_text) + except json.JSONDecodeError as exc: + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_semantic_scholar.json", + json.dumps( + { + "backend": "semantic_scholar", + "query": query, + "request_url": search_url, + "raw_response": payload_text, + "json_decode_error": str(exc), + }, + indent=2, + ensure_ascii=False, + ), + ) + _log.warning("Failed to parse Semantic Scholar search JSON for %r: %s", query, exc) + return [] + + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_semantic_scholar.json", + json.dumps( + { + "backend": "semantic_scholar", + "query": query, + "request_url": search_url, + "raw_response": payload, + }, + indent=2, + ensure_ascii=False, + ), + ) + + rows = payload.get("data") + if not isinstance(rows, list) or not rows: + return [] + + candidates: list[EvidenceCandidate] = [] + for row in rows: + if not isinstance(row, dict): + continue + pid = str(row.get("paperId") or "").strip() + title = str(row.get("title") or "No Title").strip().replace("\n", " ") + abstract_raw = row.get("abstract") + abstract = ( + str(abstract_raw).strip().replace("\n", " ") + if abstract_raw is not None + else "" + ) + year = row.get("year") + published = str(year) if year is not None else None + + pdf_url = _resolve_pdf_url_for_paper(row) + + if not pid: + pid = title or "unknown" + + candidates.append( + EvidenceCandidate( + paper_id=pid, + title=title, + summary=abstract or "No Summary", + query=query, + pdf_url=pdf_url, + published=published, + ) + ) + if len(candidates) >= max_results: + break + + return candidates + + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES + ) -> tuple[str, PdfTextOutcome]: + self.pdf_requests += 1 + try: + pdf_bytes = fetch_pdf_bytes(pdf_url, timeout=20) + from pypdf import PdfReader + + reader = PdfReader(io.BytesIO(pdf_bytes)) + pages: list[str] = [] + for index, page in enumerate(reader.pages): + if index >= max_pages: + break + page_text = page.extract_text() + if page_text: + pages.append(page_text) + text = "\n".join(pages) + if text.strip(): + return text, "ok" + return "", "empty_text" + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch or parse PDF %s: %s", pdf_url, exc) + return "", "fetch_failed" + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + text, _ = self.fetch_pdf_text_detail(pdf_url, max_pages) + return text diff --git a/src/scenarios/text.py b/src/scenarios/text.py new file mode 100644 index 000000000..9a9572b25 --- /dev/null +++ b/src/scenarios/text.py @@ -0,0 +1,39 @@ +"""Shared text normalization and slug helpers for the scenario pipeline.""" + +from __future__ import annotations + +import re + + +def slugify_asset_name(name: str) -> str: + slug = re.sub(r"[^a-z0-9]+", "_", name.strip().lower()).strip("_") + return slug or "asset" + + +def collapse_whitespace_lower(text: str) -> str: + return re.sub(r"\s+", " ", text.strip().lower()) + + +def normalize_for_fuzzy_dedup(text: str) -> str: + normalized = re.sub(r"[^a-z0-9]+", " ", text.lower()).strip() + return re.sub(r"\s+", " ", normalized) + + +def normalize_example_fingerprint(text: str) -> str: + return " ".join(str(text).lower().split()) + + +def truncate_title_one_line(title: str | None, *, max_len: int = 90) -> str: + t = (title or "").strip().replace("\n", " ") + if len(t) > max_len: + return t[: max_len - 3] + "..." + return t or "(no title)" + + +__all__ = [ + "collapse_whitespace_lower", + "normalize_example_fingerprint", + "normalize_for_fuzzy_dedup", + "slugify_asset_name", + "truncate_title_one_line", +] diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py new file mode 100644 index 000000000..e7fb97be8 --- /dev/null +++ b/src/scenarios/utils.py @@ -0,0 +1,494 @@ +"""Scenario-generation utilities shared across pipeline stages.""" + +from __future__ import annotations + +import json +import logging +import random +import re +from pathlib import Path +from typing import Any + +from .text import normalize_example_fingerprint + +_log = logging.getLogger(__name__) + +_SCENARIOS_ROOT = Path(__file__).resolve().parent + +_HF = _SCENARIOS_ROOT / "huggingface" +_ALL_UTTERANCE = _HF / "scenarios" / "all_utterance.jsonl" +_FAILURE_MAPPING = _HF / "task" / "failure_mapping_senarios.jsonl" +_RULE_MONITORING = _HF / "task" / "rule_monitoring_scenarios.jsonl" +_COMPRESSOR = _HF / "asset" / "compressor_utterance.jsonl" +_HYDRAULIC_PUMP = _HF / "asset" / "hydrolicpump_utterance.jsonl" +_LOCAL_VIBRATION = _SCENARIOS_ROOT / "local" / "vibration_utterance.json" + +_ASSET_KEYWORD_SUBSTRINGS = ( + "chiller", + "ahu", + "wind turbine", + "equipment", +) +_ASSET_ID_PATTERN = re.compile(r"\b[A-Z]{2,6}\d{4,}\b") + +_GENERIC_UTTERANCE_DENYLIST = ( + "what iot sites are available", + "can you list the iot sites", + "list the iot sites", + "is lstm model supported", + "lstm model supported in tsfm", + "what sites are available", +) + +_TSFM_ENTITY_ORDER = ( + "Chiller", + "CRAC", + "Boiler", + "AHU", + "Cooling Tower", + "HXU", + "Pump", + "SVL", +) + + +def parse_llm_json(raw: str) -> tuple[Any, str | None]: + text = raw.strip() + if text.startswith("```"): + lines = text.splitlines() + inner = lines[1:-1] if lines and lines[-1].strip() == "```" else lines[1:] + text = "\n".join(inner) + if text.lower().startswith("json"): + text = text[4:] + + text = text.strip() + try: + return json.loads(text), None + except json.JSONDecodeError as exc: + start_obj = text.find("{") + start_arr = text.find("[") + if start_obj == -1 and start_arr == -1: + return None, f"No JSON start character found. Error: {exc}" + + start = ( + start_obj + if start_arr == -1 or (start_obj != -1 and start_obj < start_arr) + else start_arr + ) + end_char = "}" if start == start_obj else "]" + end = text.rfind(end_char) + 1 + + if start != -1 and end > 0: + try: + return json.loads(text[start:end]), None + except json.JSONDecodeError as inner_exc: + return None, f"Failed to parse inner JSON block. Error: {inner_exc}" + return None, "Unknown parsing error." + + +def _load_jsonl(path: Path) -> list[dict[str, Any]]: + if not path.exists(): + _log.warning("Few-shot file missing: %s", path) + return [] + rows: list[dict[str, Any]] = [] + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line: + continue + try: + rows.append(json.loads(line)) + except json.JSONDecodeError as exc: + _log.warning("Skip bad JSONL line in %s: %s", path, exc) + return rows + + +def _load_local_vibration_list() -> list[dict[str, Any]]: + if not _LOCAL_VIBRATION.exists(): + return [] + try: + raw = json.loads(_LOCAL_VIBRATION.read_text(encoding="utf-8")) + except Exception as exc: + _log.warning("Failed to load local vibration few-shot file: %s", exc) + return [] + items = raw if isinstance(raw, list) else raw.get("train", []) + return [dict(item) for item in items] if isinstance(items, list) else [] + + +def _is_asset_specific_utterance(text: str) -> bool: + tl = text.lower() + for phrase in _GENERIC_UTTERANCE_DENYLIST: + if phrase in tl: + return False + if any(k in tl for k in _ASSET_KEYWORD_SUBSTRINGS): + return True + if _ASSET_ID_PATTERN.search(text): + return True + return False + + +_FMSR_FEWSHOT_BUCKET_ORDER: tuple[str, ...] = ( + "list_all", + "for_list_all", + "what", + "which", + "for_which", +) + + +def _failure_mapping_bucket(text: str) -> str | None: + s = text.strip() + sl = s.lower() + if sl.startswith("list all"): + return "list_all" + if sl.startswith("for ") and "list all" in sl: + return "for_list_all" + if sl.startswith("what "): + return "what" + if sl.startswith("which "): + return "which" + if sl.startswith("for ") and re.search(r"\bwhich\b", sl): + return "for_which" + return None + + +def _pick_failure_mapping_examples(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + buckets: dict[str, list[dict[str, Any]]] = {key: [] for key in _FMSR_FEWSHOT_BUCKET_ORDER} + for row in rows: + text = str(row.get("text", "")) + b = _failure_mapping_bucket(text) + if b and b in buckets: + buckets[b].append(row) + out: list[dict[str, Any]] = [] + for key in _FMSR_FEWSHOT_BUCKET_ORDER: + if buckets[key]: + out.append(random.choice(buckets[key])) + return out + + +def _pick_rule_monitoring_diverse(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + picked: list[dict[str, Any]] = [] + used_ids: set[int | str] = set() + + for target in _TSFM_ENTITY_ORDER: + candidates: list[dict[str, Any]] = [] + if target == "SVL": + for row in rows: + rid = row.get("id") + if rid in used_ids: + continue + t = str(row.get("text", "")) + if re.search(r"\bSVL\b", t, re.IGNORECASE): + candidates.append(row) + else: + for row in rows: + rid = row.get("id") + if rid in used_ids: + continue + if str(row.get("entity", "")).strip() == target: + candidates.append(row) + if candidates: + choice = random.choice(candidates) + picked.append(choice) + used_ids.add(choice.get("id")) + return picked + + +def _normalize_fewshot_row( + row: dict[str, Any], source_config: str +) -> dict[str, Any]: + text = str(row.get("text", "")).strip() + category = str(row.get("category", "")).strip() or "Knowledge Query" + characteristic_form = str(row.get("characteristic_form", "")).strip() + return { + "id": row.get("id"), + "text": text, + "category": category, + "characteristic_form": characteristic_form, + "entity": str(row.get("entity", "") or "").strip(), + "group": str(row.get("group", "") or "").strip(), + "note": str(row.get("note", "") or "").strip(), + "hint": str(row.get("hint", "") or "").strip(), + "source_config": source_config, + "source_type": str(row.get("type", "") or "").strip(), + } + + +def _to_prompt_dict(example: dict[str, Any]) -> dict[str, Any]: + return { + "text": example.get("text", ""), + "category": example.get("category", ""), + "characteristic_form": example.get("characteristic_form", ""), + "source_config": example.get("source_config", ""), + } + + +_NATURAL_STYLE_SOURCES = { + "all_utterance_iot", + "all_utterance_wo", + "all_utterance_multiagent", + "compressor_utterance", + "hydrolicpump_utterance", + "local_vibration", +} + + +def _complexity_score(example: dict[str, Any]) -> int: + text = str(example.get("text", "")).strip() + lowered = text.lower() + score = 0 + score += 2 * sum( + 1 + for marker in ( + " and ", + " also ", + " then ", + " before ", + " after ", + " while ", + " compare ", + " summarize ", + " recommend ", + " justify ", + " prioritize ", + " along with ", + ) + if marker in lowered + ) + score += 4 * len( + re.findall(r"\bif\b|\botherwise\b|\belse\b|\bunless\b|\bif available\b|\bif not\b", lowered) + ) + score += 2 * len( + re.findall( + r"\bwithin\b|\bbetween\b|\bat least\b|\bat most\b|\btop\b|\bonly\b|\blast\b|\bnext\b|\bfirst\b|\bhighest\b|\blowest\b", + lowered, + ) + ) + score += min(text.count(","), 3) + word_count = len(text.split()) + if word_count >= 18: + score += 1 + if word_count >= 32: + score += 1 + return score + + +def _user_centric_score(example: dict[str, Any]) -> int: + text = str(example.get("text", "")).strip() + lowered = text.lower() + score = 0 + if str(example.get("source_config", "")).strip() in _NATURAL_STYLE_SOURCES: + score += 3 + if re.search( + r"\b(can you|could you|please|should i|should we|i would like|we need|we are building|after|for asset|consider asset)\b", + lowered, + ): + score += 2 + if "?" in text: + score += 1 + return score + + +def _sorted_prompt_examples( + examples: list[dict[str, Any]], + *, + prioritize_natural: bool = False, +) -> list[dict[str, Any]]: + return sorted( + examples, + key=lambda example: ( + _user_centric_score(example) if prioritize_natural else 0, + _complexity_score(example), + _user_centric_score(example), + len(str(example.get("text", "")).split()), + str(example.get("source_config", "")), + str(example.get("text", "")), + ), + reverse=True, + ) + + +def _select_examples( + ordered: list[dict[str, Any]], + *, + limit: int, + selected_fingerprints: set[str], +) -> list[dict[str, Any]]: + picked: list[dict[str, Any]] = [] + for example in ordered: + fingerprint = normalize_example_fingerprint(example.get("text", "")) + if not fingerprint or fingerprint in selected_fingerprints: + continue + selected_fingerprints.add(fingerprint) + picked.append(example) + if len(picked) >= limit: + break + return picked + + +def _build_style_reference_pool() -> list[dict[str, Any]]: + pool: list[dict[str, Any]] = [] + for row in _load_jsonl(_ALL_UTTERANCE): + row_type = str(row.get("type", "")).strip() + if row_type not in {"IoT", "Workorder", "multiagent"}: + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + source_config = { + "IoT": "all_utterance_iot", + "Workorder": "all_utterance_wo", + "multiagent": "all_utterance_multiagent", + }[row_type] + pool.append(_normalize_fewshot_row(row, source_config)) + + for path, tag in ( + (_COMPRESSOR, "compressor_utterance"), + (_HYDRAULIC_PUMP, "hydrolicpump_utterance"), + ): + for row in _load_jsonl(path): + pool.append(_normalize_fewshot_row(row, tag)) + + for item in _load_local_vibration_list(): + pool.append(_normalize_fewshot_row(dict(item), "local_vibration")) + + return pool + + +def _build_candidate_pool( + focus: str, +) -> list[dict[str, Any]]: + focus_lower = (focus or "").lower() + if focus_lower == "iot": + rows = _load_jsonl(_ALL_UTTERANCE) + pool: list[dict[str, Any]] = [] + for row in rows: + if str(row.get("type", "")).strip() != "IoT": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_iot")) + return pool + + if focus_lower == "fmsr": + rows = _load_jsonl(_FAILURE_MAPPING) + picked = _pick_failure_mapping_examples(rows) + return [_normalize_fewshot_row(r, "failure_mapping") for r in picked] + + if focus_lower == "tsfm": + rows = _load_jsonl(_RULE_MONITORING) + picked = _pick_rule_monitoring_diverse(rows) + return [_normalize_fewshot_row(r, "rule_monitoring") for r in picked] + + if focus_lower == "wo": + rows = _load_jsonl(_ALL_UTTERANCE) + pool = [] + for row in rows: + if str(row.get("type", "")).strip() != "Workorder": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_wo")) + return pool + + if focus_lower == "vibration": + items = _load_local_vibration_list() + return [ + _normalize_fewshot_row(dict(item), "local_vibration") for item in items + ] + + if focus_lower == "multiagent": + pool = [] + for path, tag in ( + (_COMPRESSOR, "compressor_utterance"), + (_HYDRAULIC_PUMP, "hydrolicpump_utterance"), + ): + for row in _load_jsonl(path): + pool.append(_normalize_fewshot_row(row, tag)) + for row in _load_jsonl(_ALL_UTTERANCE): + if str(row.get("type", "")).strip() != "multiagent": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_multiagent")) + return pool + + _log.warning("Unknown focus %r for few-shot; returning empty pool.", focus) + return [] + + +def fetch_hf_fewshot( + focus: str | None = None, + max_examples: int = 6, + seed: int | None = None, +) -> list[dict]: + if max_examples <= 0: + return [] + + if seed is not None: + random.seed(seed) + + focus_pool = _build_candidate_pool(focus) + if not focus_pool: + _log.info("No few-shot examples were available for focus %r.", focus) + return [] + + seen: set[str] = set() + unique_focus: list[dict[str, Any]] = [] + for example in focus_pool: + fp = normalize_example_fingerprint(example.get("text", "")) + if not fp or fp in seen: + continue + seen.add(fp) + unique_focus.append(example) + + style_pool = _build_style_reference_pool() + unique_style: list[dict[str, Any]] = [] + for example in style_pool: + fp = normalize_example_fingerprint(example.get("text", "")) + if not fp or fp in seen: + continue + seen.add(fp) + unique_style.append(example) + + rng = random.Random(seed) if seed is not None else random + rng.shuffle(unique_focus) + rng.shuffle(unique_style) + + anchor_quota = min(len(unique_focus), max(1, max_examples // 3)) + natural_target = max(1, max_examples // 3) if max_examples > 1 else 0 + natural_quota = min(len(unique_style), max(0, min(natural_target, max_examples - anchor_quota))) + selected_fingerprints: set[str] = set() + + selected: list[dict[str, Any]] = [] + selected.extend( + _select_examples( + _sorted_prompt_examples(unique_focus), + limit=anchor_quota, + selected_fingerprints=selected_fingerprints, + ) + ) + selected.extend( + _select_examples( + _sorted_prompt_examples(unique_style, prioritize_natural=True), + limit=natural_quota, + selected_fingerprints=selected_fingerprints, + ) + ) + + combined_fill = unique_focus + unique_style + rng.shuffle(combined_fill) + selected.extend( + _select_examples( + _sorted_prompt_examples(combined_fill, prioritize_natural=True), + limit=max_examples - len(selected), + selected_fingerprints=selected_fingerprints, + ) + ) + + return [_to_prompt_dict(ex) for ex in selected] + + +__all__ = ["fetch_hf_fewshot", "parse_llm_json"] diff --git a/src/servers/fmsr/artifacts/health_index_dataset.csv b/src/servers/fmsr/artifacts/health_index_dataset.csv new file mode 100644 index 000000000..c796db63a --- /dev/null +++ b/src/servers/fmsr/artifacts/health_index_dataset.csv @@ -0,0 +1,471 @@ +Hydrogen,Oxigen,Nitrogen,Methane,CO,CO2,Ethylene,Ethane,Acethylene,DBDS,Power factor,Interfacial V,Dielectric rigidity,Water content,Health index +2845,5860,27842,7406,32,1344,16684,5467,7,19,1,45,55,0,95.2 +12886,61,25041,877,83,864,4,305,0,45,1,45,55,0,85.5 +2820,16400,56300,144,257,1080,206,11,2190,1,1,39,52,11,85.3 +1099,70,37520,545,184,1402,6,230,0,87,4.58,33,49,5,85.3 +3210,3570,47900,160,360,2130,4,43,4,1,0.77,44,55,3,85.2 +13500,343,36500,3150,113,984,5,1230,1,1,4.93,37,52,6,75.6 +10200,11900,33700,573,87,611,0,162,0,1,3.53,45,55,5,75.6 +3,15459,41347,5,68,902,12,2,13,5,0.58,41,71,6,73.2 +16,2470,59600,8,520,2660,5,8,2,164,0.29,44,56,4,72.8 +488,11861,48353,13,85,1957,29,23,0,164,0.27,37,72,10,68 +4,26100,60600,1,206,1440,13,0,13,5,1.32,40,56,4,63.4 +4,21800,46200,0,75,655,3,0,11,0,0.65,42,53,5,63.4 +254,592,60300,14,376,2500,5,9,0,205,0.44,42,42,6,61.3 +23349,2475,28011,5045,156,48,5588,3532,2951,0,1,52,70,2,60.5 +9040,1870,47500,1790,183,2060,7820,638,1450,0,1,42,55,18,60.5 +13200,1120,32800,2650,156,2240,16400,1610,1510,0,1,45,58,22,60.5 +6620,5250,51900,2240,190,1870,13100,1400,1660,0,1,42,54,21,60.5 +8710,4530,42800,658,437,1780,1260,97,9740,1,1,45,55,1,60.5 +5810,11900,51400,471,354,1470,798,44,3990,1,1,44,50,16,60.5 +757,289,57400,1700,1730,24900,2280,755,12,0,42.1,24,51,77,60.5 +590,23200,63900,949,209,51,828,168,582,0,1,45,55,4,60.5 +1310,2690,51900,1010,119,2220,2520,376,17,0,0.25,45,29,34,60.5 +122,294,73100,50,372,2180,69,31,0,168,1.27,42,35,19,59.3 +106,581,75200,47,760,4070,11,30,0,183,0.16,43,29,5,58.3 +95,1760,80800,72,488,3050,10,36,0,176,0.29,44,55,12,58 +87,362,76100,47,560,3920,5,31,0,184,0.23,43,52,4,57.4 +79,699,75700,72,508,3810,83,42,0,136,1.24,34,48,5,56 +2183,192,43380,1061,183,5730,1308,646,2,0,1,42,28,31,55.8 +76,324,71700,45,904,5220,10,27,0,227,0.45,45,45,8,55.1 +14,17600,44300,0,161,2010,22,0,0,0,1.16,37,49,16,51.6 +14,2750,29500,12,54,5190,0,0,0,5,0.19,43,55,3,51.6 +40,2350,65000,8,538,2480,9,0,1,0,1,35,56,62,51.5 +5,9400,37100,4,496,2720,3,0,1,0,1,35,56,51,51.5 +7,12300,32200,0,302,3640,3,0,1,0,1,35,55,36,51.5 +2390,9050,44300,163,546,2660,3,53,0,0,1.71,46,54,12,50.7 +12880,1571,36351,827,184,2267,4,320,0,1,1,46,54,12,50.7 +10700,13100,32700,625,79,660,0,190,1,1,4.45,42,44,4,50.7 +921,22000,43400,42,132,542,75,3,713,0,0.48,45,56,13,50.7 +9350,229,53000,188,451,2720,228,28,0,0,71.75,30,55,5,50.7 +6200,291,59400,218,492,10600,103,39,0,0,67.67,30,54,10,50.7 +3060,257,69500,190,403,8930,68,47,0,0,73.2,29,56,14,50.7 +7907,3564,24991,467,96,1765,2,249,0,0,1,29,56,14,50.7 +5030,7140,54300,179,38,260,0,21,0,0,1.9,29,49,15,50.7 +322,669,56400,181,614,466,170,15,173,0,0.63,45,51,2,50.7 +152,21400,49300,254,64,1510,2250,908,4830,0,1,43,51,5,50.7 +211,249900,62600,148,118,2300,751,103,3030,0,1,45,41,9,50.6 +277,21500,46100,142,93,2090,802,59,3840,0,1,45,50,5,50.6 +253,17300,43700,135,82,1870,57,734,3330,0,1,44,50,4,50.6 +216,24300,48500,93,94,1890,578,36,2830,0,1,42,54,7,50.6 +135,5091,48792,33,568,1301,3,5,0,1,0.12,47,66,3,50.3 +0,219,56900,4,20,507,30,49,67,0,4.4,47,50,3,50 +38,3127,16464,11,177,727,28,3,19,0,1,47,75,38,49.9 +36,2950,63300,101,525,4080,193,35,0,127,0.37,40,53,6,49.2 +30,316,54100,161,309,2710,248,28,0,20,0.57,40,55,4,49.2 +52,387,68400,37,936,6130,8,21,0,138,0.82,44,56,4,49.1 +30,413,19600,39,140,2690,17,48,0,158,0.15,46,56,7,49 +24,455,21700,41,186,2790,10,65,0,162,0.17,44,52,3,48.9 +21,425,33000,32,217,3030,9,47,0,160,0.13,42,53,4,48.5 +59,645,56000,20,267,2300,9,15,0,136,0.21,42,52,4,48.5 +104,1450,76500,37,357,3220,11,11,0,2,0.32,45,54,8,48.3 +3,19700,67600,0,108,1480,10,0,0,17,1,43,53,28,48.2 +40,24800,53300,9,84,919,17,12,0,88,1.68,39,51,4,48.2 +35,1920,73500,6,202,1310,20,0,0,92.6,0.48,40,49,8,48.2 +3,1900,81300,37,234,2800,10,102,0,123,0.44,41,47,6,48.2 +0,693,50600,43,68,2770,4,91,0,180,1.15,44,52,10,48.2 +28,9950,47300,16,245,1290,0,3,0,47.5,0.9,44,49,4,48.2 +25,15500,50700,3,267,1180,0,0,0,27,1,43,43,4,48.2 +25,508,54500,12,317,2750,4,14,0,0,0.65,45,56,4,48.2 +23,888,74700,16,914,3420,5,6,0,63.7,0.14,43,47,7,48.2 +9,10700,42300,2,308,1970,0,4,0,108,0.38,42,57,9,48.2 +9,738,56000,10,294,1960,4,17,0,175,0.27,42,56,7,48.2 +4,408,38700,22,105,1100,7,47,0,168,1.82,43,57,7,48.2 +8,1060,55300,14,235,1850,6,22,0,113,0.21,42,56,3,48.2 +7,376,54700,13,205,1780,4,15,0,162,0.29,43,55,4,48.2 +7,425,50500,9,317,2690,4,15,0,165,0.32,41,55,8,48.2 +7,15700,46800,2,373,3470,28,0,0,162,0.57,40,51,8,48.2 +7,1990,58800,10,154,2210,4,18,0,144,0.3,40,50,1,48.2 +6,3760,70200,17,277,2200,7,31,0,194,0.48,41,55,3,48.2 +5,378,53100,16,231,2170,5,22,0,165,0.32,43,54,4,48.2 +5,17400,53400,4,296,2750,7,0,0,164,0.52,41,55,10,48.2 +5,22900,51800,0,149,826,10,0,0,12,0.21,40,49,10,48.2 +5,20400,42200,0,148,820,17,0,0,142,1.02,38,52,9,48.2 +4,57,31384,5,89,876,2,6,0,76,0.16,38,68,7,48.2 +4,4740,73200,2,154,1910,8,0,0,7,1.55,40,52,15,48.2 +4,20200,44700,0,194,2050,66,0,0,144,2.05,37,54,13,48.2 +3,15400,46100,0,333,1240,18,0,0,0,1.49,38,35,14,48.2 +3,20600,42000,0,118,906,18,0,0,127,0.89,37,57,6,48.2 +3,395,47000,5,47,623,9,11,0,169,3.35,38,54,9,48.2 +2,21500,47500,2,106,1040,3,0,0,123,0.28,42,54,4,48.2 +2,14700,44200,2,297,1780,55,0,0,35,0.8,41,41,14,48.2 +0,5640,71800,17,305,2200,6,41,0,4.4,0.23,42,55,6,48.2 +0,21900,48300,2,39,1420,3,7,0,136,0.41,41,56,9,48.2 +0,21200,44200,0,91,1520,0,0,0,136,0.32,43,50,2,48.2 +0,25900,49700,0,22,399,0,0,0,120,0.86,39,50,4,48.2 +0,22900,45300,0,66,553,0,0,0,155,0.37,43,53,5,48.2 +0,21800,52500,3,78,2180,9,8,0,0,0.41,42,56,6,48.2 +0,2220,58800,13,131,1520,4,22,0,173,0.55,42,52,4,48.2 +0,944,58700,6,266,3530,8,11,0,153,0.35,40,56,4,48.2 +0,27000,56600,0,47,480,0,0,0,11,1,43,51,4,48.2 +0,21600,45800,0,204,2750,5,0,0,9,0.08,43,52,6,48.2 +0,30800,58700,0,98,1740,4,0,0,6,0.17,44,53,4,48.2 +0,21700,45600,0,198,2250,6,0,0,6,0.13,41,55,3,48.2 +0,8380,30800,0,23,180,0,0,0,1,9.43,37,43,7,48.2 +0,27300,55500,0,32,525,0,0,0,1,0.62,40,40,19,48.2 +0,19300,45700,0,53,481,0,0,0,0,1.24,45,47,6,48.2 +0,24800,45700,0,81,514,0,0,0,203,1.47,45,55,5,48.2 +0,22000,44900,0,122,856,8,0,0,136,0.63,41,52,7,48.2 +0,14300,65700,7,148,1960,3,13,0,0,0.41,37,51,2,48.2 +18,17600,51700,4,231,1610,0,7,0,55,1,45,49,3,48.2 +11,1140,63900,7,540,2980,47,0,0,60,8.44,36,50,36,48.2 +16,7340,71000,5,548,3170,5,0,0,0,0.36,46,45,8,48.2 +12,461,54500,3,69,2150,3,8,0,161,0.28,41,57,7,48.2 +4,624,44500,36,232,2580,3,54,0,169,1.16,42,56,8,48.1 +114,2359,31861,2,144,707,0,0,0,0,1,42,75,28,47.9 +1450,13000,55800,157,278,3360,82,75,0,3,13.8,36,56,6,46.6 +81,23790,64479,10,852,1371,0,0,0,5,0.06,47,74,4,45.3 +67,5940,41600,14,930,4030,0,5,0,5,0.15,43,50,2,40 +1230,239,71300,61,576,11300,28,24,0,0,0.95,34,53,12,38.6 +54,1690,27100,8,554,3990,0,3,0,5,0.19,45,56,2,38.4 +44,1735,41280,1,133,520,0,0,0,0,1,45,74,24,38.3 +37,623,20300,21,888,3690,10,10,0,5,0.14,44,55,3,38.3 +24,35700,85300,5,361,1570,0,0,0,0,0.09,40,55,7,38.3 +24,1330,70800,12,771,2960,3,4,0,2,0.12,44,50,4,38.3 +22,2820,53100,3,770,2390,3,0,0,11,0.37,43,43,5,38.3 +20,2170,21300,6,307,1960,0,0,0,1,1.02,46,52,4,38.3 +19,618,20200,15,184,586,2,4,0,0,0.36,47,47,3,38.3 +8,10600,61600,23,226,4390,0,5,0,5,0.13,45,52,2,38.3 +8,8710,71900,21,230,5050,0,4,0,10,0.2,43,55,3,38.3 +7,4973,56032,21,200,4782,0,2,0,10,0.21,38,66,5,38.3 +10,3350,51100,2,678,2360,0,0,0,5,0.24,44,56,4,38.3 +9,909,32800,16,279,2820,0,3,0,5,0.12,45,49,3,38.3 +7,8220,55800,18,236,2730,0,4,0,5,0.08,54,52,2,38.3 +7,647,16900,8,152,528,0,0,0,5,0.11,45,47,3,38.3 +7,1430,15400,4,221,268,0,0,0,5,1.58,46,48,2,38.3 +7,2630,58800,2,784,1410,0,0,0,5,0.26,40,46,2,38.3 +7,4520,22800,2,157,1080,0,0,0,5,1.55,46,49,7,38.3 +6,8510,64300,13,291,2050,9,0,0,1,0.72,41,50,5,38.3 +6,13300,36900,0,411,4160,0,0,0,0,1,41,52,55,38.3 +6,6080,40900,5,893,2640,0,0,0,0,1,33,55,12,38.3 +5,12300,70900,17,269,1880,3,5,0,5,0.12,45,48,2,38.3 +5,12500,48400,3,534,3010,3,0,0,1,1,45,62,3,38.3 +5,3686,57725,5,158,4331,6,1,0,5,1.41,39,49,19,38.3 +5,15000,44400,0,230,399,0,0,0,0,0.71,48,57,4,38.3 +4,279,20000,8,285,4230,0,4,0,2,0.22,44,55,3,38.3 +4,13600,37500,3,443,5890,0,7,0,0,1,34,55,77,38.3 +4,17000,56700,1,408,936,0,0,0,5,0.54,47,48,5,38.3 +3,20500,44000,0,35,290,0,0,0,1,1,47,48,5,38.3 +3,17400,56700,3,362,2230,4,0,0,1,1.02,44,48,3,38.3 +3,2020,59600,6,1070,2950,0,0,0,5,0.39,42,51,3,38.3 +3,22900,48000,0,201,2320,5,0,0,3,0.1,45,51,4,38.3 +3,23700,49800,0,202,3290,8,0,0,2,0.1,46,56,4,38.3 +3,21700,43200,0,129,1530,0,0,0,1,1.59,35,54,21,38.3 +3,19500,42800,0,209,2650,30,0,0,0,0.78,40,43,23,38.3 +3,18400,45000,0,128,1700,28,0,0,5,1.7,35,55,12,38.3 +3,14900,56700,0,163,458,0,0,0,0,0.13,44,50,3,38.3 +3,12000,35800,0,195,283,0,0,0,0,0.59,48,55,4,38.3 +2,24978,76582,2,19,498,0,0,0,0,1,48,55,4,38.3 +2,15900,51300,4,359,2250,0,0,0,0,0.23,43,49,3,38.3 +2,24800,54600,3,216,3260,9,0,0,4,0.08,46,54,6,38.3 +0,24600,50800,0,31,907,9,0,0,1,1.05,41,53,8,38.3 +0,5010,51800,4,262,845,0,0,0,5,0.41,45,52,3,38.3 +0,7520,38100,5,297,778,0,3,0,5,0.39,44,47,2,38.3 +0,839,20700,4,458,2830,0,0,0,1,0.46,41,47,2,38.3 +0,1565,9555,0,111,417,0,0,0,5,0.26,42,75,7,38.3 +0,22200,47200,2,223,2650,10,0,0,4,0.25,45,55,6,38.3 +0,21800,47300,0,249,2510,7,0,0,2,0.27,44,49,4,38.3 +0,22900,49800,0,205,2190,5,0,0,2,0.09,50,50,5,38.3 +0,26600,62500,2,209,2190,6,0,0,2,0.07,46,52,4,38.3 +0,3300,12200,0,118,270,0,0,0,1,1,45,56,3,38.3 +0,1850,61700,0,43,554,0,0,0,0,3.93,51,51,5,38.3 +0,27200,58900,0,100,609,0,0,0,0,1.93,38,52,8,38.3 +0,24400,47700,0,51,458,0,0,0,5,0.32,46,56,4,38.3 +0,25200,50000,0,67,462,0,0,0,5,0.31,48,54,3,38.3 +11,478,19400,11,196,1900,3,5,0,5,0.37,43,42,2,38.3 +17,5680,59500,16,809,3590,11,0,0,5,0.35,42,50,3,38.3 +12,15200,62800,4,413,4720,5,0,0,5,0.53,44,56,14,38.3 +12,4350,65500,11,870,11100,16,8,0,5,0.5,41,56,10,38.3 +178,4070,27300,144,672,2260,3,10,0,0,1,41,58,12,38.1 +10,11900,55100,2,403,1140,6,0,2,0,1,41,30,23,38 +4,5040,37600,4,597,1440,4,3,2,0,1,41,56,27,38 +0,14908,42800,0,52,620,0,0,2,0,0.78,39,60,7,38 +9,578,29200,35,267,1610,52,17,0,0,0.53,42,50,4,36.6 +17,3960,36100,29,113,4420,3,5,0,5,0.15,45,54,2,36.4 +14,2380,67400,78,372,1850,33,1850,0,0,5.56,36,43,27,33.6 +478,9460,64700,21,54,323,0,4,0,0,1,36,43,27,31 +14,514,70600,11,674,11700,13,5,1,0,0.62,42,45,21,28.1 +13,12300,43400,0,309,908,0,0,0,0,1,42,47,26,26.7 +13,6680,59700,2,236,857,0,0,0,0,0.12,42,57,4,26.7 +13,283,60700,3,33,649,0,80,0,0,2.93,32,54,19,26.7 +13,3430,16300,3,220,1280,0,0,0,1,1.07,46,53,3,26.7 +13,309,55000,10,121,3340,15,71,0,0,1,31,58,43,26.7 +14,1170,50900,4,72,1120,3,100,0,0,1,33,60,29,26.7 +14,27000,56100,0,27,397,0,0,0,5,1,43,53,7,26.7 +14,437,55000,2,20,645,0,44,0,0,2.37,32,53,33,26.7 +14,248,44600,2,35,532,3,73,0,0,3.23,31,56,26,26.7 +14,305,54800,2,35,517,0,60,0,0,2.95,32,57,23,26.7 +14,2690,10300,3,155,735,0,0,0,0,0.28,47,54,2,26.7 +5,7930,49900,5,709,2310,5,0,1,0,1,47,54,36,26.6 +7,6150,19400,3,320,785,6,0,1,0,1,32,56,19,26.6 +15,18300,52900,4,266,630,13,3,1,0,1,33,52,31,26.6 +227,9987,37210,11,122,2942,8,26,0,1,2.54,38,52,20,26.6 +114,7840,70100,2,258,1250,0,0,0,0,1,38,54,25,23 +104,163,49800,5,40,579,17,274,0,0,1,32,53,24,22.5 +91,571,44200,6,80,1860,8,168,0,0,10.1,32,30,31,21.9 +91,24600,49400,5,31,420,0,6,0,1,6.16,41,41,9,21.9 +89,189,57800,2,50,502,0,44,0,0,1,32,55,37,21.7 +88,11300,52600,3,530,2640,0,0,0,0,1,32,58,56,21.6 +79,667,54400,6,45,409,14,533,0,0,1,32,53,35,19.8 +78,294,55700,3,132,892,4,121,0,0,2.34,32,57,11,19.5 +73,1100,49947,10,253,2101,1,2,0,1,0.1,47,61,4,17.5 +71,342,46100,8,133,2650,7,257,0,0,1,21,57,37,16.6 +70,371,40100,1,12,1750,7,117,0,0,22,36,53,62,16.2 +61,440,48800,4,98,909,3,117,0,0,1,32,53,15,13.9 +61,1670,52600,4,98,591,0,52,0,0,1.86,33,56,11,13.9 +59,587,20100,15,577,6140,5,5,0,5,0.15,45,54,4,13.8 +59,1900,62400,3,68,704,3,109,0,0,2.08,32,47,13,13.8 +59,1420,50000,3,90,766,0,97,0,0,1,31,55,20,13.8 +58,896,55700,3,63,1040,2,86,0,0,2,33,56,28,13.7 +58,177,30704,4,70,636,4,108,0,0,2.49,33,68,16,13.7 +57,2470,53800,4,98,926,4,147,0,0,2.96,33,53,14,13.6 +56,21110,59700,4,46,430,8,430,0,0,1,33,48,36,13.6 +54,320,47000,2,222,1600,0,15,0,0,1,33,55,19,13.5 +54,256,54600,3,112,780,0,127,0,0,2.87,33,52,18,13.5 +54,281,44100,4,89,833,4,126,0,0,2.95,33,55,17,13.5 +54,281,44100,4,89,833,4,126,0,0,1,33,55,17,13.5 +52,1710,56300,3,87,934,5,82,0,0,1,30,58,51,13.5 +52,645,71300,22,203,1760,5,51,0,0,1,40,42,5,13.5 +52,322,39300,3,128,754,4,60,0,0,1,31,59,21,13.5 +52,1550,58400,3,90,681,0,68,0,0,1,32,50,11,13.5 +51,339,47800,2,53,344,0,217,0,0,2.78,30,44,33,13.4 +50,205,55200,4,70,758,4,105,0,0,1,32,54,20,13.4 +49,352,54600,4,87,1030,3,112,0,0,3.93,33,56,20,13.4 +49,398,40800,2,58,710,3,85,0,0,1,37,57,20,13.4 +48,245,58500,3,112,914,3,77,0,0,1,31,50,15,13.4 +48,1330,58900,4,124,1010,3,79,0,0,5.35,30,55,16,13.4 +48,71,21093,3,36,673,4,144,0,0,2.56,30,58,26,13.4 +48,252,56800,2,62,651,0,112,0,0,3.04,33,54,16,13.4 +48,289,57400,3,56,650,5,132,0,0,4.22,31,55,13,13.4 +47,400,48200,4,74,621,0,57,0,0,1,32,54,20,13.4 +47,366,44500,2,88,966,5,73,0,0,1,38,57,15,13.4 +46,390,40200,3,127,827,4,54,0,0,1,35,59,13,13.4 +46,227,46700,2,67,735,3,122,0,0,2.4,31,59,17,13.4 +42,2580,64500,1,25,660,0,56,0,0,3.38,30,60,37,13.4 +40,266,56300,4,86,1110,3,106,0,0,1,32,57,21,13.4 +40,511,63600,3,95,2190,0,74,0,0,3.24,33,55,18,13.4 +39,1860,57900,3,69,711,4,96,0,0,2.62,30,56,27,13.4 +39,1060,50800,4,74,804,5,83,0,0,1,32,56,58,13.4 +38,461,55900,4,126,3580,3,136,0,0,4.29,32,54,17,13.4 +38,191,60800,2,49,350,0,150,0,0,1,33,53,22,13.4 +37,224,49900,3,39,1030,8,51,0,0,1,31,59,29,13.4 +37,44788,44090,5,313,1776,8,4,0,1,0.43,34,72,5,13.4 +37,280,48100,3,43,535,2,78,0,0,1,32,56,15,13.4 +37,493,48700,2,75,1190,0,62,0,0,1,32,60,24,13.4 +36,247,54000,4,58,776,4,157,0,0,1,32,57,16,13.4 +35,438,53300,3,50,547,0,44,0,0,2.59,33,55,13,13.4 +35,302,39700,3,98,654,4,79,0,0,1,34,60,13,13.4 +35,232,61400,3,78,766,0,91,0,0,2.75,30,50,12,13.4 +35,336,51000,4,75,587,9,96,0,0,3.25,33,58,8,13.4 +3,1480,13500,37,126,319,87,32,0,0,1,45,55,2,13.4 +34,7200,51200,3,380,1680,0,0,0,0,1,45,75,25,13.4 +34,394,43300,2,72,702,4,37,0,0,1,32,52,17,13.4 +33,312,44100,4,88,738,0,91,0,0,1,33,56,8,13.4 +33,2000,48700,2,53,486,0,184,0,0,2.97,30,49,47,13.4 +32,7150,66200,4,666,6450,5,0,0,0,1,33,53,63,13.4 +30,1310,49700,3,45,641,3,111,0,0,1,32,48,15,13.4 +30,298,55400,4,105,920,3,83,0,0,1,32,58,18,13.4 +30,302,56700,3,54,604,3,69,0,0,1,32,57,13,13.4 +30,510,35200,2,46,691,0,70,0,0,1,38,60,25,13.4 +30,466,41900,2,42,439,0,79,0,0,1,37,60,19,13.4 +29,447,52700,6,84,766,13,270,0,0,2.83,33,53,20,13.4 +29,277,44200,3,95,607,0,89,0,0,1.58,33,57,14,13.4 +29,266,48500,2,74,725,4,78,0,0,1,32,60,43,13.4 +29,396,52500,2,53,569,3,115,0,0,1,32,60,27,13.4 +28,289,50300,5,157,787,3,51,0,0,1,32,59,31,13.4 +27,489,60200,11,181,591,4,11,0,0,0.37,47,46,3,13.4 +27,246,52900,3,66,725,0,122,0,0,2.83,33,55,11,13.4 +26,4440,68800,7,89,784,6,302,0,0,2.5,33,57,23,13.4 +26,321,48300,3,68,598,0,62,0,0,1,32,60,19,13.4 +26,8500,51200,2,238,1150,0,3,0,1,1.02,47,44,7,13.4 +25,1500,70400,9,482,2470,4,0,0,0,1,44,54,10,13.4 +25,2060,50300,3,42,552,0,102,0,0,1,31,55,15,13.4 +24,17200,41600,0,68,230,0,0,0,0,1,42,53,15,13.4 +24,1970,64100,2,34,398,0,92,0,0,1,32,53,13,13.4 +24,257,55700,2,47,495,4,105,0,0,3.17,31,56,15,13.4 +24,2350,23200,4,332,2640,0,0,0,1,0.93,46,56,13,13.4 +23,1690,60700,2,43,1380,3,76,0,0,1,30,60,62,13.4 +23,505,58100,2,49,807,0,48,0,0,1,32,54,69,13.4 +23,14800,40700,1,449,2720,3,0,0,0,1,32,57,89,13.4 +23,6480,42100,5,530,1760,0,0,0,0,1,32,58,22,13.4 +22,399,42600,7,100,2580,11,286,0,0,9.37,29,56,52,13.4 +22,1220,49900,3,30,813,5,291,0,0,1,32,57,27,13.4 +21,364,57700,3,40,967,3,68,0,0,1,34,60,15,13.4 +21,6240,52400,3,788,4290,7,0,0,0,1,34,56,41,13.4 +21,197,56700,5,44,1070,6,523,0,0,2.55,32,52,20,13.4 +21,2710,5600,5,167,1260,3,0,0,0,0.6,51,51,10,13.4 +21,243,48800,0,19,187,0,65,0,0,1,30,57,18,13.4 +20,4530,53000,2,842,2750,0,0,0,5,0.24,45,53,4,13.4 +20,17400,59600,4,395,999,16,4,0,0,1,32,46,31,13.4 +20,14453,52582,7,66,568,2,1,0,0,0.33,46,73,5,13.4 +19,3490,30000,1,374,728,0,0,0,1,0.81,48,53,5,13.4 +4,893,69100,24,96,707,60,17,0,4,0.64,47,51,4,13.4 +10,8010,36900,2,441,891,3,0,0,0,1,33,51,17,13.4 +10,254,56500,4,71,1020,0,108,0,0,1,32,53,22,13.4 +10,881,47800,2,54,1100,0,102,0,0,3.98,33,58,27,13.4 +10,2060,6440,2,97,549,0,0,0,0,1,48,57,7,13.4 +10,2740,53500,2,46,322,4,211,0,0,1,34,57,27,13.4 +10,210,48900,7,44,1060,30,521,0,0,1,33,48,44,13.4 +9,228,45900,2,44,515,0,128,0,0,1,32,48,72,13.4 +9,13000,45000,2,526,2050,0,0,0,0,1,32,60,24,13.4 +9,12000,45100,4,475,1570,0,0,0,0,1,32,54,12,13.4 +9,2200,58100,6,432,7980,17,0,0,0,0.67,42,37,21,13.4 +9,278,53900,2,34,1120,0,55,0,0,3.93,30,53,38,13.4 +9,414,37700,2,34,843,5,278,0,0,1,31,58,39,13.4 +9,2700,73600,4,238,5050,6,0,0,0,1.37,41,54,12,13.4 +9,17000,53500,4,173,1370,3,0,0,0,1,44,54,5,13.4 +9,2490,57000,2,42,351,3,184,0,0,2.61,32,49,66,13.4 +8,1210,27000,3,166,454,0,43,0,0,1,32,55,18,13.4 +8,5570,22800,2,323,989,0,0,0,0,1,32,38,24,13.4 +8,8470,44500,3,318,569,12,0,0,0,1,32,51,18,13.4 +8,12200,49200,6,646,3020,0,0,0,0,1,32,55,17,13.4 +8,16200,52900,4,434,1890,0,0,0,0,1,32,53,14,13.4 +8,8600,40900,4,580,1750,0,0,0,0,1,32,58,8,13.4 +8,292,47300,3,39,1390,0,79,0,0,1,33,55,28,13.4 +8,117,47900,2,20,491,0,75,0,0,2.18,33,53,15,13.4 +8,352,26900,2,38,506,4,75,0,0,1,33,52,24,13.4 +8,189,39923,1,37,698,3,78,0,0,3.14,33,71,41,13.4 +8,634,49400,2,42,444,3,227,0,0,2.14,32,56,53,13.4 +8,1140,55600,2,42,424,3,158,0,0,2.01,32,52,75,13.4 +7,7290,34700,0,463,975,3,0,0,0,1,32,54,44,13.4 +7,5860,28700,0,360,557,0,0,0,0,1,32,52,19,13.4 +7,8570,38900,5,593,2360,0,0,0,0,1,32,57,42,13.4 +7,10300,50500,6,725,2120,0,0,0,0,1,32,55,16,13.4 +7,1160,46900,4,527,1530,0,0,0,0,1,32,57,13,13.4 +7,420,63600,16,545,10600,7,5,0,1,1.11,45,39,16,13.4 +7,339,43800,2,31,644,0,167,0,0,1,32,56,24,13.4 +7,1200,51100,2,52,1340,0,67,0,0,3.83,28,54,24,13.4 +7,492,9748,1,54,221,0,0,0,1,0.46,47,66,3,13.4 +7,19100,46700,0,47,700,0,0,0,0,1,28,46,16,13.4 +7,4560,43900,5,444,1580,4,0,0,0,1,40,56,29,13.4 +6,4970,52300,5,587,4230,5,0,0,1,0.33,41,47,4,13.4 +6,10200,41700,0,434,908,3,0,0,0,1,41,57,17,13.4 +6,4570,22500,2,451,1500,0,0,0,0,1,32,57,31,13.4 +6,10600,58100,2,575,1370,0,0,0,5,0.24,43,50,2,13.4 +6,9550,49600,6,649,2960,0,0,0,0,1,43,48,14,13.4 +6,7300,44400,7,788,3030,0,0,0,0,1,43,51,12,13.4 +6,9960,53700,6,678,2220,0,0,0,0,1,43,55,10,13.4 +6,6510,37400,4,529,1540,0,0,0,0,1,43,55,9,13.4 +6,11800,44900,4,562,1670,0,0,0,0,1,43,54,12,13.4 +6,5790,30900,5,705,2250,0,0,0,0,1,43,58,9,13.4 +6,11600,44500,5,581,1870,0,0,0,0,1,32,57,11,13.4 +6,177,55400,0,17,413,0,35,0,0,1,33,54,21,13.4 +6,222,42000,2,36,311,0,175,0,0,1,34,56,22,13.4 +5,6410,45800,3,465,2850,0,0,0,0,1,34,60,79,13.4 +5,10800,43300,0,491,1140,3,0,0,0,1,34,53,21,13.4 +5,17400,43000,0,258,1130,0,0,0,0,1,34,49,40,13.4 +5,18200,66100,5,475,846,11,0,0,0,1,55,55,12,13.4 +5,4460,33100,7,689,2410,0,0,0,0,1,55,54,12,13.4 +5,10500,47300,7,696,2820,0,0,0,0,1,55,57,17,13.4 +5,3860,29300,4,739,2030,0,0,0,0,1,33,59,11,13.4 +5,8930,34900,5,466,1930,0,0,0,0,1,33,55,33,13.4 +5,9880,41700,5,582,1720,0,0,0,0,1,33,52,13,13.4 +5,7550,47400,5,746,24200,0,0,0,0,1,33,56,11,13.4 +5,5300,39600,5,685,2090,0,0,0,0,1,32,58,13,13.4 +5,15700,60200,10,507,5330,19,14,0,0,19.7,40,55,17,13.4 +5,1210,54600,0,22,226,0,68,0,0,1,32,51,26,13.4 +5,16100,53200,2,90,93,0,0,0,0,0.78,44,45,4,13.4 +4,17000,72100,5,344,2380,3,0,0,1,0.86,44,55,3,13.4 +4,22200,48400,0,82,499,0,0,0,0,1,36,44,10,13.4 +4,18900,53900,4,152,825,0,0,0,0,0.57,33,54,2,13.4 +4,6890,24800,0,322,825,0,0,0,0,1,33,55,18,13.4 +4,4990,35200,7,760,2600,0,0,0,0,1,33,56,11,13.4 +4,3910,24600,6,599,2310,0,0,0,0,1,33,52,14,13.4 +4,4300,26200,6,656,2090,0,0,0,0,1,33,55,11,13.4 +4,4690,27400,6,595,2130,0,0,0,0,1,33,55,8,13.4 +4,9600,55200,7,785,2690,0,0,0,0,1,33,57,14,13.4 +4,4070,30900,6,664,2440,0,0,0,0,1,33,57,11,13.4 +4,4860,34500,4,735,2010,0,0,0,0,1,32,59,9,13.4 +4,9660,22200,0,51,275,0,0,0,0,1,32,51,31,13.4 +4,7917,72870,4,171,2499,9,1,0,0,0.26,48,68,7,13.4 +4,19100,49000,2,92,736,0,0,0,0,0.17,43,48,4,13.4 +4,10600,49300,1,364,2020,4,0,0,0,1,43,56,76,13.4 +4,425,54300,3,68,508,0,99,0,0,1,33,49,48,13.4 +4,19700,50400,0,69,188,0,0,0,0,1,46,55,5,13.4 +3,8020,50100,6,569,3710,16,0,0,5,0.49,41,27,6,13.4 +3,1940,53800,2,29,650,0,49,0,0,1,31,49,22,13.4 +3,16900,45900,2,61,549,2,0,0,0,1,43,53,10,13.4 +3,309,38500,2,39,791,3,99,0,0,1,33,54,183,13.4 +3,3660,40100,4,669,1720,4,0,0,0,1,33,54,20,13.4 +3,17600,50900,3,426,2480,0,0,0,0,1,33,59,40,13.4 +3,5040,29500,2,510,1230,0,0,0,0,1,32,58,33,13.4 +3,7880,32100,1,368,863,0,0,0,0,1,32,58,23,13.4 +3,11200,36100,0,120,293,0,0,0,0,1,32,53,15,13.4 +3,13900,3600,1,296,5070,17,0,0,0,1,32,60,35,13.4 +3,12200,36300,2,452,6050,0,0,0,0,1,32,55,52,13.4 +3,4070,34800,7,761,2570,0,0,0,0,1,32,55,12,13.4 +3,45100,31200,5,568,2160,3,2,0,0,1,32,54,11,13.4 +3,3710,25100,6,610,2070,0,0,0,0,1,32,54,9,13.4 +3,7951,50923,11,319,3716,10,5,0,0,0.13,42,57,3,13.4 +3,220,54300,2,24,246,0,153,0,0,1.52,33,48,12,13.4 +3,9730,42000,10,532,1320,21,4,0,5,0.84,48,46,4,13.4 +3,5810,31900,9,369,1050,18,3,0,1,1.12,47,55,4,13.4 +3,11200,57300,3,483,1230,0,0,0,1,0.33,42,57,4,13.4 +3,15700,59900,1,103,555,0,0,0,0,0.43,45,43,8,13.4 +2,15700,51300,4,358,2770,2,0,0,5,0.57,46,42,4,13.4 +2,16072,46688,1,70,435,0,0,0,0,0.15,44,51,6,13.4 +2,12704,33134,2,32,801,3,3,0,1,0.39,44,63,5,13.4 +0,23500,50600,0,29,347,0,0,0,0,0.6,44,45,10,13.4 +0,302,51300,4,25,1510,3,292,0,0,1,32,49,33,13.4 +0,20600,46500,2,152,823,8,2,0,0,1,32,49,33,13.4 +0,15115,48813,2,97,915,6,1,0,0,1.45,33,49,14,13.4 +0,19100,58400,0,72,629,0,0,0,0,1,38,53,13,13.4 +0,18600,44400,0,67,511,3,0,0,0,3.47,43,56,19,13.4 +0,21900,46200,0,46,520,3,0,0,0,1.1,41,36,16,13.4 +0,21300,46200,0,51,658,0,0,0,0,0.75,37,41,9,13.4 +0,16443,43308,1,10,348,0,0,0,0,0.83,41,73,5,13.4 +0,20000,54700,3,117,699,0,0,0,0,0.05,34,51,2,13.4 +0,16600,49300,3,105,624,0,0,0,0,0.47,32,55,4,13.4 +0,17000,55600,4,182,1100,0,0,0,0,0.58,34,57,5,13.4 +0,21200,60000,5,123,767,0,0,0,0,0.54,32,50,4,13.4 +0,25600,47100,0,25,467,0,0,0,0,0.33,44,54,3,13.4 +0,789,20300,6,280,502,0,0,0,0,0.31,46,51,3,13.4 +0,21500,45600,6,197,2070,34,15,0,4,0.13,44,55,3,13.4 +0,23100,48600,0,202,2220,6,0,0,6,0.06,45,54,3,13.4 +0,16100,38600,0,251,5620,21,0,0,0,1,45,56,44,13.4 +0,14700,36500,2,284,3820,0,0,0,0,1,45,57,42,13.4 +0,9444,35331,3,358,5507,6,0,0,0,1,45,75,75,13.4 +0,27300,65600,0,56,202,0,0,0,0,1,43,48,3,13.4 +0,1230,10500,2,113,326,0,0,0,0,1,45,56,5,13.4 +0,4330,11200,0,81,192,0,0,0,0,1,57,57,4,13.4 +0,19900,43300,0,114,782,0,0,0,4,1.33,40,54,6,13.4 +0,25800,57100,0,49,427,0,0,0,0,0.07,45,49,11,13.4 +0,22800,46800,0,66,914,0,0,0,0,1,41,51,4,13.4 +0,23200,45800,0,40,620,0,0,0,0,0.76,46,52,5,13.4 +0,24100,49300,0,84,779,6,0,0,0,1.69,36,47,7,13.4 +0,24300,50200,0,54,738,0,0,0,0,1.75,44,55,4,13.4 +0,448,38900,2,24,482,0,99,0,0,4.39,31,53,12,13.4 +0,22800,44600,0,36,585,0,0,0,0,1,31,51,34,13.4 +0,16000,48000,2,426,1360,0,0,0,5,0.6,48,54,4,13.4 +0,23900,45900,0,49,466,0,0,0,5,0.29,45,53,4,13.4 +0,20300,62500,0,78,190,0,0,0,0,1,45,56,5,13.4 +0,19500,54800,0,73,196,0,0,0,0,1,46,56,4,13.4 +0,18400,51700,0,61,304,0,0,0,0,1,43,50,6,13.4 +18,154,42800,5,127,711,3,91,0,0,1,32,53,7,13.4 +11,15600,45000,3,309,2240,0,3,0,147,0.5,39,53,3,13.4 +11,1760,56800,2,41,594,3,49,0,0,1,31,60,27,13.4 +11,1770,48600,0,30,593,0,60,0,0,3.97,31,58,29,13.4 +11,1780,56900,2,29,867,0,54,0,0,2.78,31,50,27,13.4 +11,265,50800,2,54,1050,0,63,0,0,1,30,50,16,13.4 +11,15700,41700,0,62,649,0,0,0,0,1,33,44,16,13.4 +11,222,41000,2,35,309,0,211,0,0,2.53,33,58,30,13.4 +17,262,47400,2,46,1050,4,97,0,0,1,33,57,26,13.4 +17,645,49600,6,87,599,5,211,0,0,4.46,33,56,19,13.4 +17,259,53300,2,31,561,0,56,0,0,2.9,32,54,19,13.4 +17,233,53500,2,40,1230,3,64,0,0,4.18,34,59,42,13.4 +17,232,48600,2,47,796,0,116,0,0,2.15,30,50,23,13.4 +17,564,14600,5,320,2450,0,0,0,1,1.07,45,52,6,13.4 +16,1050,51600,15,122,12000,0,21,0,0,0.23,43,47,5,13.4 +16,2020,56600,6,138,663,0,138,0,0,1,33,58,12,13.4 +16,2270,65400,0,35,604,0,53,0,0,1.83,33,52,22,13.4 +16,2030,53800,4,44,709,17,183,0,0,1,33,55,22,13.4 +12,151,48200,2,34,569,4,48,0,0,1,31,58,20,13.4 +12,1840,61900,2,36,1560,3,72,0,0,4.5,31,55,36,13.4 +12,285,52500,2,35,895,0,51,0,0,3.22,33,54,37,13.4 +12,465,52700,2,52,918,0,84,0,0,3.83,33,55,24,13.4 +12,2150,11100,2,170,1440,0,0,0,1,0.73,45,54,6,13.4 +15,227,52900,3,60,853,3,84,0,0,1,32,56,28,13.4 +15,334,47100,3,64,622,3,108,0,0,1,32,55,12,13.4 +15,1280,35000,2,675,2530,0,0,0,5,0.3,45,58,8,13.4 +15,169,50600,5,77,532,0,72,0,0,1.21,33,54,11,13.4 +15,308,39700,3,64,581,5,27,0,0,1,32,60,18,13.4 diff --git a/src/servers/fmsr/artifacts/health_index_model.pkl b/src/servers/fmsr/artifacts/health_index_model.pkl new file mode 100644 index 000000000..4397c3a32 Binary files /dev/null and b/src/servers/fmsr/artifacts/health_index_model.pkl differ diff --git a/src/servers/fmsr/artifacts/health_index_scalers.pkl b/src/servers/fmsr/artifacts/health_index_scalers.pkl new file mode 100644 index 000000000..0d3f3bbca Binary files /dev/null and b/src/servers/fmsr/artifacts/health_index_scalers.pkl differ diff --git a/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb b/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb new file mode 100644 index 000000000..f46ff01fc --- /dev/null +++ b/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb @@ -0,0 +1,778 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "hjrR9QoPl6wI" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pickle\n", + "import os\n", + "\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split, cross_val_score\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "from sklearn.inspection import permutation_importance\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "np.random.seed(42)\n", + "sns.set_style(\"whitegrid\")\n", + "plt.rcParams['figure.figsize'] = (12, 6)" + ] + }, + { + "cell_type": "code", + "source": [ + "df = pd.read_csv('health_index_dataset.csv')\n", + "\n", + "print(\"Dataset Shape:\", df.shape)\n", + "print(\"\\nColumns:\", list(df.columns))\n", + "print(\"\\nFirst 5 rows:\")\n", + "print(df.head())\n", + "print(\"\\nBasic Statistics:\")\n", + "print(df.describe())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D2XWPARml_ff", + "outputId": "0e99c03e-4e0e-4de2-cbb0-4ab0bb0b0245" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Dataset Shape: (470, 15)\n", + "\n", + "Columns: ['Hydrogen', 'Oxigen', 'Nitrogen', 'Methane', 'CO', 'CO2', 'Ethylene', 'Ethane', 'Acethylene', 'DBDS', 'Power factor', 'Interfacial V', 'Dielectric rigidity', 'Water content', 'Health index']\n", + "\n", + "First 5 rows:\n", + " Hydrogen Oxigen Nitrogen Methane CO CO2 Ethylene Ethane \\\n", + "0 2845 5860 27842 7406 32 1344 16684 5467 \n", + "1 12886 61 25041 877 83 864 4 305 \n", + "2 2820 16400 56300 144 257 1080 206 11 \n", + "3 1099 70 37520 545 184 1402 6 230 \n", + "4 3210 3570 47900 160 360 2130 4 43 \n", + "\n", + " Acethylene DBDS Power factor Interfacial V Dielectric rigidity \\\n", + "0 7 19.0 1.00 45 55 \n", + "1 0 45.0 1.00 45 55 \n", + "2 2190 1.0 1.00 39 52 \n", + "3 0 87.0 4.58 33 49 \n", + "4 4 1.0 0.77 44 55 \n", + "\n", + " Water content Health index \n", + "0 0 95.2 \n", + "1 0 85.5 \n", + "2 11 85.3 \n", + "3 5 85.3 \n", + "4 3 85.2 \n", + "\n", + "Basic Statistics:\n", + " Hydrogen Oxigen Nitrogen Methane CO \\\n", + "count 470.000000 470.000000 470.000000 470.000000 470.000000 \n", + "mean 404.261702 8357.372340 47759.561702 79.695745 244.000000 \n", + "std 2002.142678 14164.233283 13760.451816 489.320336 237.267485 \n", + "min 0.000000 57.000000 3600.000000 0.000000 10.000000 \n", + "25% 4.000000 496.000000 41700.000000 2.000000 66.000000 \n", + "50% 9.000000 3810.000000 49100.000000 3.000000 150.500000 \n", + "75% 34.000000 14875.000000 55875.000000 7.000000 361.750000 \n", + "max 23349.000000 249900.000000 85300.000000 7406.000000 1730.000000 \n", + "\n", + " CO2 Ethylene Ethane Acethylene DBDS \\\n", + "count 470.000000 470.000000 470.000000 470.000000 470.000000 \n", + "mean 1816.414894 162.923404 81.940426 91.491489 17.036596 \n", + "std 2256.790519 1323.811504 342.573636 644.365828 46.735057 \n", + "min 48.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 641.750000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 1125.000000 3.000000 4.000000 0.000000 0.000000 \n", + "75% 2257.500000 6.000000 69.750000 0.000000 2.000000 \n", + "max 24900.000000 16684.000000 5467.000000 9740.000000 227.000000 \n", + "\n", + " Power factor Interfacial V Dielectric rigidity Water content \\\n", + "count 470.000000 470.000000 470.000000 470.000000 \n", + "mean 1.849043 38.434043 53.495745 16.282979 \n", + "std 6.144009 6.178830 6.458906 17.115646 \n", + "min 0.050000 21.000000 27.000000 0.000000 \n", + "25% 0.570000 32.000000 51.000000 5.000000 \n", + "50% 1.000000 39.000000 54.000000 12.000000 \n", + "75% 1.000000 44.000000 56.000000 21.000000 \n", + "max 73.200000 57.000000 75.000000 183.000000 \n", + "\n", + " Health index \n", + "count 470.000000 \n", + "mean 27.504043 \n", + "std 17.741458 \n", + "min 13.400000 \n", + "25% 13.400000 \n", + "50% 13.400000 \n", + "75% 38.550000 \n", + "max 95.200000 \n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Missing values and duplicates\n", + "print(\"\\nMissing Values:\")\n", + "print(df.isnull().sum())\n", + "print(f\"\\nDuplicate rows: {df.duplicated().sum()}\")\n", + "\n", + "# Health Index distribution\n", + "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", + "\n", + "axes[0].hist(df['Health index'], bins=30, edgecolor='black', alpha=0.7, color='steelblue')\n", + "axes[0].set_xlabel('Health Index')\n", + "axes[0].set_ylabel('Frequency')\n", + "axes[0].set_title('Distribution of Health Index')\n", + "\n", + "axes[1].boxplot(df['Health index'])\n", + "axes[1].set_ylabel('Health Index')\n", + "axes[1].set_title('Boxplot of Health Index')\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('health_index_distribution.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(f\"\\nHealth Index Statistics:\")\n", + "print(f\" Mean: {df['Health index'].mean():.2f}\")\n", + "print(f\" Std Dev: {df['Health index'].std():.2f}\")\n", + "print(f\" Min: {df['Health index'].min():.2f}\")\n", + "print(f\" Max: {df['Health index'].max():.2f}\")\n", + "\n", + "# Correlation heatmap\n", + "plt.figure(figsize=(14, 10))\n", + "corr = df.corr()\n", + "sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0)\n", + "plt.title('Feature Correlation Heatmap')\n", + "plt.tight_layout()\n", + "plt.savefig('correlation_heatmap.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(\"\\nFeature Correlation with Health Index:\")\n", + "print(df.corr()['Health index'].sort_values(ascending=False))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "Gk1DmEHNmE6Y", + "outputId": "1ee1922c-7a81-4628-a3ea-1464f7f9b2a6" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Missing Values:\n", + "Hydrogen 0\n", + "Oxigen 0\n", + "Nitrogen 0\n", + "Methane 0\n", + "CO 0\n", + "CO2 0\n", + "Ethylene 0\n", + "Ethane 0\n", + "Acethylene 0\n", + "DBDS 0\n", + "Power factor 0\n", + "Interfacial V 0\n", + "Dielectric rigidity 0\n", + "Water content 0\n", + "Health index 0\n", + "dtype: int64\n", + "\n", + "Duplicate rows: 0\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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qlSpko4ePaqff/5ZktSoUSMNGTJEb775ph588EG1bNlSktSiRQvLHBcuXNDAgQPVrVs39ejRQ/7+/tes6+2335aLi4sGDhyolJQUvf/++3r88cf16aefWq4ILozC1PZ3hmHomWeesYS9zZo10+bNmzV16lSdPXtWY8aMsdr/p59+0pdffqlHHnlEVapU0dKlSzVkyBB9++23uuGGG65a159//qm+ffvq2LFj6tOnjwIDA/X5559r1KhRSk1N1WOPPaZGjRpp6tSpiouLU61atfTEE09IkqpVq3bN55yTk1PgSWdaWlq+seTkZD3wwANycXFRnz59VK1aNX3//fd6+eWXlZ6erscff1ySlJ6ero8//ljdu3fXv/71L126dEmffPKJBgwYoI8//viqS2J06dJFR44c0fr16zV69GhLT/7+HIrbw2uZPHmyfH19NXjwYJ08eVLvv/++Jk6cqJkzZ1r2mTVrlt5++221b99e7du31549e/Tkk08qOzvbaq7MzEw9+uijOnv2rB566CHdeOON2rlzp2bMmKGkpCS9/PLLcnFxUWxsrHr06KFx48Zpzpw5kq6E1gcOHNDSpUvl5eVVrOcCAABKJj093XJulJKSoqVLlyojI0M9evSw7FOYc8DKlSvrtdde08MPP6w33nhDo0ePliRNnDhRaWlpiouLk8lkssxpNps1YMAANW/eXC+99JI2b96s2bNny2w2WwLXghw4cEB9+vRRlSpVNGDAALm5uemjjz5S3759tWzZMjVv3ly33nqr+vbtq6VLl+rpp59Ww4YNJV05972arVu3auDAgQoMDNTgwYP1559/atmyZXr44Ye1evVqBQYG6sEHH1TNmjU1b9489e3bV6Ghoapevfp1e3zp0qUCzz8LCiTXrl2rUaNGKTo6WsOHD1dmZqaWL1+uRx55RGvWrLEs9bB161YdP35cMTExCggI0IEDB7Ry5UodPHhQK1eulIuLS4G1jBkzRpMmTZKXl5eefvppScr3HApzrlgUFy9e1IABA9SlSxfdc889+uKLLzRt2jQFBQWpffv2kq6c/z/22GM6ffq0+vbtqxo1aujTTz8t8CKIhIQEDRw4UCEhIRo8eLBcXFy0evVqPfbYY/rwww8VFhamRo0aaejQoZo6daruuusu3XHHHcrIyNDo0aPVsGHDa77GAJQRAwCuYdWqVUZQUJDx66+/XnWfli1bGvfff7/l9ptvvmkEBQVZbi9evNgICgoyUlJSrjrHr7/+agQFBRmrVq3Kt+3RRx81goKCjOXLlxe47dFHH7Xc3rZtmxEUFGTcfvvtRlpammV848aNRlBQkPH+++9bxjp27GiMHDnyunNeq7aRI0caHTt2tNz+6quvjKCgIOOtt96y2u/55583goODjaNHj1rGgoKCjFtuucVqbO/evUZQUJCxdOnSfI/1d++9954RFBRkfPrpp5axrKws48EHHzTCw8OtnnvHjh2NQYMGXXO+v+8bFBR0za/PPvvMsv+YMWOMtm3bGufPn7eaZ9iwYUbLli2NzMxMwzAMIycnx7h8+bLVPhcvXjSioqKM0aNHW40HBQUZb775puX2woULjaCgIOP48eP56i1JD48fP24EBQUZCxcutIzlvd4ff/xxIzc31zIeGxtrNGvWzEhNTTUMwzBSUlKMW265xRg0aJDVfjNmzDCCgoKsXldz5841wsPDjcOHD1s9/rRp04xmzZoZp06dsoytWLHC8ve6a9cuo1mzZsaUKVOu+TwAAEDpyDsv+OdXSEiIsXr1aqt9i3IOOH36dKNp06bGjz/+aHz22WdGUFCQ8d5771ndb+TIkUZQUJAxadIky1hubq4xaNAg45ZbbrE6r/7nudOzzz5r3HLLLcaxY8csY2fPnjUiIiKMPn36WMbyHnvbtm2F6sd9991nREZGGv/73/8sY3v37jWaNm1qjBgxwjKWdz7+93PGq8nb91pf4eHhlv3T09ONVq1aGWPHjrWaJykpyWjZsqXVeN556N+tX7/eCAoKMn788UfLWN7f89/PNbt162b188A/973eueLV5P2c9Pe/v7yfddasWWMZu3z5stG2bVvj+eeft4zlnf9v3LjRMpaRkWF06dLF6u8xNzfXuPPOO40nn3zSqsbMzEyjU6dOxhNPPGEZM5vNxsMPP2xERUUZ58+fNyZMmGDcfPPN1/zZD0DZYXkEACXm5eWlS5cuXXV73odHffPNN5a3gxdVpUqVivRBAPfff7+8vb0tt++++24FBASU+if9fv/99zKZTPneQvXkk0/KMIx8b9uPiopSvXr1LLebNm0qb29vHT9+/LqPExAQoO7du1vG3N3d1bdvX2VkZOjHH38s9nNo3ry5Fi9enO9r5MiRVvsZhqEvv/xSnTp1kmEYOn/+vOUrOjpaaWlp2rNnjyTJZDJZ1h/Ozc3VhQsXlJOTo5CQEP3222/FrlUqfg+vJe/q4TytWrWS2WzWyZMnJV25ciM7O1uPPvqo1X6PPfZYvrk+//xztWzZUr6+vlY9ioqKktlstvq7evDBBxUdHa3JkydrxIgRqlu3rv79738X+3kAAICSe/XVVy3nQ6+//rpat26tsWPH6ssvv7TsU5RzwMGDB6tx48YaOXKkJkyYoNtuu039+vUr8LH79Olj+XPeO5uys7OVkJBQ4P5ms1k//PCDOnfurLp161rGa9Sooe7du+unn35Senp6kXtw7tw57d27Vz179lTVqlUt402bNlVUVFSJz7Gfe+65As8/o6OjrfbbunWrUlNT1a1bN6vzKldXVzVv3txqeYe/v7vu8uXLOn/+vJo3by5JlnPU4rreuWJReXl56b777rPcrlSpkkJDQ63OZ/PO/++++27LmKenZ753O+7du1dHjhzRvffeq//973+WHmVkZCgyMlI//vij5WcyV1dXxcfHKyMjQwMHDtSHH36oQYMGWa3hDMB+WB4BQIllZGRcc7mCrl276uOPP9bYsWM1ffp0RUZGqkuXLrr77rvl6lq43x3VrFmzSB86Vr9+favbLi4uql+/frFPpArr5MmTqlGjhlVgLP31VrN/Pv6NN96Ybw4/Pz+lpqZe93Hq16+fr395j3Pq1Kki157nhhtuUFRUVL7xv79dT7ryIROpqan66KOP9NFHHxU419/f5rZmzRq9++67Onz4sNUSAiX9tOLi9vBaateubXU77xcPeXPm9femm26y2q9atWry8/OzGjt69Kj279+vyMjIAh/rn28FjI2NVefOnXXx4kWtWLGiSMt5AAAA2wsLC7MKsbp37677779fEydOVIcOHVSpUqUinQNWqlRJsbGx6t27tzw8PBQbG1vgW/VdXV2tgldJatCgQb75/u78+fPKzMy07PfPWnJzc3X69Gk1adKkkM/+irxzn6vNu2XLFmVkZBR7OaegoKACzz///rkZknTkyBFJBf+iXJJV/y9cuKA5c+Zo48aNVp8ZIBW87FdRXO9csahq1aqV7zXg5+en/fv3W27nnf//c79//p3k9eifF1z8XVpamuWctV69eho8eLCmTp2qoKAgPfvss8V6DgBsj9AWQImcOXNGaWlpVlc6/lPlypX1wQcfaPv27dq0aZM2b96sjRs36qOPPtK7776bLwy82hxlxWw2F6omW7ja4xiF+IAJe8v7DX2PHj3Us2fPAvfJ+0C6Tz/9VKNGjVLnzp3Vv39/+fv7y2Qyaf78+SW6IlYqnR5e7ZcJxZkzNzdXbdu21YABAwrc/s/gd/v27Zb1237//XdFREQU+TEBAEDpcXV1VevWrbVkyRIdPXq0yAGoJG3ZskXSlStAjx49mi+cRcHyzsWmTp2qgICAfNv/fl74wgsvaOfOnerfv7+aNWsmLy8v5ebmasCAASU+17bluaJ09fPZ4sirYcSIEVf93Ih/hus//PCDpCtXVF+4cKHA3gIoe4S2AErk008/laR8b136J1dXV0VGRioyMlKjR4/WvHnz9MYbb2j79u2Kioq66gcBFNfRo0etbhuGoaNHj1pCROnqV2OeOnXK6sS5KLXVqVNHCQkJSk9Pt/pN/6FDhyzbbaFOnTrav3+/cnNzrU4a8x7nn7/9Lw3VqlVTlSpVlJubW+CVEX/3xRdfqG7dupozZ45VP998883rPo6tXxu2kNffI0eOWL1Wzp8/r4sXL1rtW69ePWVkZFy3R9KVE+XJkycrOjpa7u7ueu211xQdHW2z1w0AALANs9ks6co7zqSinQPu27dPc+fOVUxMjPbt26exY8dq3bp18vHxsXqM3NxcHT9+3OpKysOHD+eb7++qVasmT09Py35/d+jQIbm6ulrepVSUc6y8c5+rzXvDDTeUyYem5p13+fv7X/Pc6uLFi0pISNDzzz+vwYMHW8bzrkK9Hkc8/6xTp45+//13GYZhVd8//07yeuTt7V2o88/ly5frhx9+0LBhwzR//ny9+uqrevvtt21bPIBiYU1bAMWWkJCgt956S4GBgVafnvtPFy5cyDeW91vfvCsKPT09JRX/LUX/tHbtWqv1uj7//HMlJSWpXbt2lrG6devql19+sfpU2m+//VanT5+2mqsotbVr105ms1kffPCB1fh7770nFxcXq8cviXbt2ikpKUkbN260jOXk5Gjp0qXy8vLSrbfeapPHuRaTyaS77rpLX3zxhX7//fd82//+tv+8qwf+fvXBL7/8ol27dl33cfL6X9K3sdlSVFSU3N3dtWzZMqvn9P777+fb95577tHOnTu1efPmfNtSU1OVk5Njuf3KK68oNzdXU6ZM0cSJE+Xm5qaXX365XFx5DQCAs8jOztYPP/wgd3d3y/IHhT0HzM7O1ujRo1WjRg29/PLLiouLU3JysmJjYwt8rL/PZxiGPvjgA7m7u1912SWTyaS2bdvqm2++0YkTJyzjycnJWr9+vVq2bGkJlYtyjlWjRg01a9ZMa9eutTon/v333/XDDz+offv2153DFm6//XZ5e3tr/vz5Vstt5ck7/7zalasFnasVxNPT02Y/l9hKu3btdO7cOX3++eeWsczMTK1cudJqv5CQENWrV0/vvvtugZ878vdz9OPHj2vq1Km666679PTTT2vkyJH673//q7Vr15ba8wBQeFxpC6BQvv/+ex06dEhms1nJycnavn27fvjhB9WuXVtvv/22PDw8rnrfuXPn6v/+7//Uvn171alTRykpKfrwww9Vq1YttWzZUtKVqxF9fX21YsUKValSRV5eXgoLCyv2W8X8/Pz0yCOPKCYmRikpKXr//fdVv359q4X6//Wvf+mLL77QgAEDdM899+jYsWNat25dvqUeilJbp06d1Lp1a73xxhs6efKkgoOD9cMPP+ibb77RY489ds1lJIriwQcf1EcffaRRo0Zpz549qlOnjr744gv9/PPPGjNmTL711ErLiy++qO3bt+uBBx7Qv/71LzVu3FgXL17Unj17lJCQoB07dkiSOnTooC+//FLPPfecOnTooBMnTmjFihVq3Lix5QqVq7nlllskSW+88Ya6du0qd3d3dezYsUyu5riaatWq6cknn9T8+fP11FNPqX379vrtt9/0/fff64YbbrDat3///vrvf/+rp59+Wj179tQtt9yizMxM/f777/riiy/0zTffqFq1alq1apU2bdqk+Ph41apVS5I0duxYvfTSS/rwww+tPogEAACUnbzzYOlK4LVu3TodOXJEgwYNspxzFfYc8O2339bevXv13nvvydvbW02bNtVzzz2nmTNn6u6777YKPz08PLR582aNHDlSYWFh2rx5szZt2qSnn35a1apVu2q9L7zwgrZu3apHHnlEjzzyiEwmkz766CNlZWXppZdesuzXrFkzmUwmLViwQGlpaapUqZLatGlz1c+qGDFihAYOHKgHH3xQvXv31p9//qlly5bJx8fH6mrW0uTt7a3x48drxIgRiomJUdeuXVWtWjWdOnVK3333nVq0aKFXX31V3t7euvXWW7Vw4UJlZ2erZs2a+uGH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q1Zp48aN8vT01JNPPqnevXvr7NmzmjNnjp599ll98skntqoVAAAAKBWjRo1S//791bVrV2VlZWn48OE6cuSIbrjhBs2YMaPQ8yxYsEC1atVSXFycZezvH+BrGIaWLFmiZ555Rp07d5YkTZ06VVFRUfr666/VrVs32z0pAAAAlFvFCm0XL16s1atX6/Dhw2rXrp3l6lpX1ysX7tatW1fx8fHq1KmTTYsFAAAASkOtWrX06aefasOGDdq/f78yMjLUu3dv3XvvvapcuXKh5/nvf/+r6OhoDRkyRD/++KNq1qypRx55RA888IAk6cSJE0pKSlJUVJTlPj4+PmrevLl27txJaAsAAABJxQxtly9frl69eqlnz56qUaNGgftUq1ZNU6ZMueY8P/74oxYtWqTdu3crKSlJc+fOtVxxIF254mHNmjVW94mOjtaiRYssty9cuKBJkybp22+/laurq+688069/PLLRV57DAAAAM7Nzc1N9913X4nmOH78uJYvX64nnnhCTz/9tBITEzV58mS5u7urZ8+eSkpKkiT5+/tb3c/f31/JyclFfjyz2VyiegHAEeWtMZ6bm8txDkCFU9jjWrFC2y+//PK6+1SqVEk9e/a85j4ZGRkKDg5Wr169NHjw4AL3uf32263eXvbPT/QdPny4kpKStHjxYmVnZ2vMmDF69dVXNX369EI8EwAAADirb775ptD73nHHHYXazzAMhYSE6N///rck6eabb9aBAwe0YsWK654bF8ffP+AMACqKgwcPWr67uZVoVUcAKLeKdfRbtWqVvLy8dM8991iNf/bZZ/rzzz8LfULavn37636wQ6VKlRQQEFDgtj/++EObN2/WJ598otDQUEnS2LFjNWjQII0YMUI1a9YsVB0AAABwPs8995zVbRcXFxmGkW9Mkvbu3VuoOQMCAtSoUSOrsYYNG+qLL76wbJeklJQUq3espaSkqGnTpkV7ApJCQ0NlMpmKfD8AcGQ5OTmSpMaNGys8PNy+xQCAjZnN5kL94r1Yoe0777yjCRMm5Bv39/fXK6+8YtOrCHbs2KHIyEj5+vqqTZs2euGFF3TDDTdIknbu3ClfX19LYCtJUVFRcnV11a+//qouXbrYrA4AAABULPv27bP8eevWrZo2bZqGDRumiIgISVfONWfOnGm5arYwWrRoocOHD1uNHTlyRHXq1JEkBQYGKiAgQAkJCWrWrJkkKT09Xb/88osefvjhIj8Hk8lEaAugwsn7vBxXV1eOcQCcVrFC21OnTikwMDDfeO3atXX69OkSF5Xn9ttvV5cuXRQYGKjjx49rxowZGjhwoD766COZTCYlJyerWrVqVvdxc3OTn5+fZb2woshbU+Kf323tyryGDMPIdzVHUV25vyGz2Vzqa/2Udl/KK/qSHz0pGH3Jj54UjL4UjL7kR09s99xjY2M1fvx4tWrVyjJ2++23y9PTU6+88oo+++yzQs3z2GOP6eGHH9a8efN0zz336Ndff9XKlSs1ceJESVeu3O3Xr5/efvtt1a9fX4GBgZo1a5Zq1Khh9dkOAAAAcG7FCm39/f21f//+fMHtvn37VLVqVVvUJUlWn54bHBys4OBgde7c2XL1ra3989Lk0loj7MSJE8rIzFR6errcPFNLNFd6eroyMjO1d+9epaWl2ajCa2PttILRl/zoScHoS370pGD0pWD0JT96UnLHjh2Tr69vvnFvb2+dPHmy0POEhYVpzpw5mjFjhubOnavAwECNGTNGPXr0sOwzcOBAZWZm6tVXX1VqaqpatmyphQsXysPDwybPBQAAAOVfsULbbt26acqUKapSpYpuvfVWSVeWMYiNjbUKWm2tbt26uuGGG3T06FFFRkaqevXqOn/+vNU+OTk5unjx4lXXwb2WvDXB8taWKK01wnx8fOTl6Slvb+8CfzgoipzMVHl5eqpZs2b51k+ztdLuS3lFX/KjJwWjL/nRk4LRl4LRl/zoSeHXBLue0NBQxcfHa+rUqapevbokKTk5Wa+//rrCwsKKNFfHjh3VsWPHq253cXHR0KFDNXTo0BLVDAAAgIqrWKHt0KFDdfLkST3++OOWT3LMzc3Vfffdp2HDhtm0wL87c+aMLly4YAlkIyIilJqaqt27dyskJESStG3bNuXm5hb55FrKvyZYaa0RdmVOF7m4uFg+3KK4rtzfpUzXM2PttILRl/zoScHoS370pGD0pWD0JT96UnKxsbEaPHiwOnTooBtvvFGSdPr0ad10002aO3eunasDAACAsylWaFupUiXNnDlThw8f1r59+1S5cmUFBQVZPmChsC5duqRjx45Zbp84cUJ79+6Vn5+f/Pz8NGfOHN11112qXr26jh8/rtdff13169fX7bffLklq1KiRbr/9dr3yyiuaMGGCsrOzNWnSJHXr1k01a9YszlMDAACAE6pfv77+85//6IcfftChQ4ckXTnXjIqKKvEv2QEAAICiKlZom6dBgwZq0KBBse+/e/du9evXz3I7Li5OktSzZ0+NHz9ev//+u9auXau0tDTVqFFDbdu21dChQ1WpUiXLfaZNm6ZJkybpsccek6urq+68806NHTu2+E8KAAAATsnFxUXR0dGKjo62dykAAABwcsUKbc1ms1avXq1t27YpJSVFubm5VtuXLFlSqHlat26t/fv3X3X7okWLrjtH1apVNX369EI9HgAAAHA1CQkJSkhIKPD8Nu/iAgAAAKAsFCu0nTJlitasWaP27durSZMmvGUMAAAA5dqcOXM0d+5chYSEKCAggPNbAAAA2FWxQtsNGzZo5syZat++va3rAQAAAMrcihUrFBcXp/vvv9/epQAAAAByLc6d3N3dVa9ePVvXAgAAANhFdna2WrRoYe8yAAAAAEnFDG2ffPJJLVmyRIZh2LoeAAAAoMz17t1b69ats3cZAAAAgKRiLo/w008/afv27fr+++/VpEkTublZTzNnzhybFAcAAACUhcuXL2vlypVKSEhQcHBwvvPb0aNH26kyAAAAOKNihba+vr7q0qWLrWsBAAAA7GL//v1q2rSpJOn333+32saHkgEAAKCsFSu0jYuLs3UdAAAAgN0sXbrU3iUAAAAAFsVa01aScnJytHXrVq1YsULp6emSpLNnz+rSpUs2Kw4AAAAAAAAAnE2xrrQ9efKkBgwYoNOnTysrK0tt27aVt7e3FixYoKysLE2cONHWdQIAAAA2N3jw4ELtx2c2AAAAoCwV60rbKVOmKCQkRDt27JCHh4dlvEuXLtq2bZvNigMAAABKk4+PT6G+AAAAgLJUrCttf/rpJy1fvlyVKlWyGq9Tp47Onj1rk8IAAACA0sZnNQAAAMARFetK29zcXOXm5uYbP3PmjKpUqVLiogAAAAAAAADAWRUrtG3btq3ef/99q7FLly5p9uzZat++vU0KAwAAAAAAAABnVKzQdtSoUfr555/VtWtXZWVlafjw4erUqZPOnj2r4cOH27pGAAAAAAAAAHAaxVrTtlatWvr000+1YcMG7d+/XxkZGerdu7fuvfdeVa5c2dY1AgAAAAAAAIDTKFZoK0lubm667777bFkLAAAAAAAAADi9YoW2a9euveb2+++/vzjT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v248/PDDV93OMdcwJk+ebHTu3NnIzc116tfKoEGDjNGjR1uNDR482HjxxRcNw3DO10pmZqbRrFkz49tvv7Ua79mzpzFjxgyn7AkAoOL758/oAOBsnPpK22s5ceKEkpKSFBUVZRnz8fFR8+bNtXPnTjtWVrbS0tIkyXI13O7du5WdnW3Vl0aNGql27dratWuXPUosc2azWRs2bFBGRoYiIiKcvicTJ05U+/btrZ6/5NyvlaNHjyo6Olp33HGHXnzxRZ06dUqSc/fkv//9r0JCQjRkyBBFRkbq/vvv18qVKy3bnf2Ym5WVpf/85z/q1auXXFxcnPq1EhERoW3btunw4cOSpH379umnn35Su3btJDnnayUnJ0dms1keHh5W4x4eHvr555+dsicAAABARedm7wIcVVJSkiTJ39/fatzf398p1hSUpNzcXMXGxqpFixYKCgqSJCUnJ8vd3V2+vr5W+/r7+1t6VlHt379fDz30kC5fviwvLy/NnTtXjRs31t69e522Jxs2bNBvv/2mTz75JN82Z32thIWFKS4uTg0aNFBSUpLmzp2rPn36aN26dU7bE0k6fvy4li9frieeeEJPP/20EhMTNXnyZLm7u6tnz55Of8z9+uuvlZaWpp49e0py3n8/kjRo0CClp6frnnvukclkktls1rBhw9SjRw9Jzvn/s7e3tyIiIvTWW2+pYcOGql69utavX69du3apXr16TtkTAAAAoKIjtMVVTZgwQQcOHLBaj9OZNWjQQGvXrlVaWpq++OILjRw5UsuWLbN3WXZz+vRpTZkyRe+++26+q7+cWfv27S1/btq0qZo3b66OHTvqs88+U+XKle1YmX0ZhqGQkBD9+9//liTdfPPNOnDggFasWGEJKp3ZqlWr1K5dO9WsWdPepdjdZ599pnXr1mn69OmWX4zFxcWpRo0aTv1amTp1qsaMGaN27drJZDLp5ptvVrdu3bRnzx57lwYAAACgFLA8wlUEBARIklJSUqzGU1JSVL16dXuUVKYmTpyoTZs26f3331etWrUs49WrV1d2drZSU1Ot9k9JSbH0rKKqVKmS6tevr5CQEL344otq2rSplixZ4rQ92bNnj1JSUhQTE6Obb75ZN998s3bs2KGlS5fq5ptvdtq+/JOvr69uuukmHTt2zKl7EhAQoEaNGlmNNWzY0LJ0hDMfc0+ePKmtW7eq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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Health Index Statistics:\n", + " Mean: 27.50\n", + " Std Dev: 17.74\n", + " Min: 13.40\n", + " Max: 95.20\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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z5un2p4S518bXl5emDJ5Mrbv2IFt27bBxsYGs2bNgqOjozJM927dIJPJsMbPDykpKfD29sb8efNU6l6hYR1B9H4iRUkvPEef5MaNG+jTpw9Onz4Ne/uSfaC9+UjYHSolxSYnXNNJEIS/q/bRdBIEwfr+FU0nQTDMRKwjAKCsjOUAANH6TppOAgmInkiYO91qgnnK8/cHKgUydYX/I3ZJeKUjvJ1+NUGSwe8DANjqC3vmV0kyzJRqOgmCYOlZOqcphw3poOkkvJfTlqD3B/qMcOSgwJ0+fRoGBgZwcHDA8+fPsXDhQtSsWbPEOwaJiIiIiIiIiOj/DzsHBS41NRXLly/Hy5cvYWpqigYNGmDKlCmaThYREREREREREf0fYOegwHXq1AmdOnXSdDKIiIiIiIiIiIrd/+NuwELH3YqJiIiIiIiIiIhKKXYOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSrFzkIiIiIiIiIiIqJRi5yAREREREREREVEppa3pBBAREREREREREQGASCzSdBJKHY4cJCIiIiIiIiIiKqXYOUhERERERERERFRKcVoxEREREREREREJgkjMcWwljSVORERERERERERUSrFzkIiIiIiIiIiIqJTitGIiIiIiIiIiIhIE7lZc8jhykIiIiIiIiIiIqJRi5yAREREREREREVEpxc5BIiIiIiIiIiKiUoqdg0RERERERERERKUUOweJiIiIiIiIiIhKKe5WTEREREREREREgiAScxxbSWPnIH0wux2TNJ0EQUgYPE/TSRAE6/tXNJ0EQXjp1VDTSRCMciEnNJ0EQcjQKavpJAiC6Id+mk6CICQ8lWg6CYJQfcNcTSdBMKLKV9N0EgTBMDtR00kQhIoZ4ZpOgiAY6ZloOgmCkA5DTSdBMKxDr2s6CcLgWUvTKaBSgt2xREREREREREREpRQ7B4mIiIiIiIiIiEopTismIiIiIiIiIiJhEIk0nYJShyMHiYiIiIiIiIiISil2DhIREREREREREZVS7BwkIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiU4m7FREREREREREQkCCIxdysuaRw5SEREREREREREVEqxc5CIiIiIiIiIiKiU4rRiIiIiIiIiIiISBJGY49hKGkuciIiIiIiIiIiolGLnIBER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IiIiIiIiKqXYOUhERERERERERFRKcVoxEREREREREREJgoi7FZc4ljgREREREREREVEpxc5BIiIiIiIiIiKiUoqdg0RERERERERERKUUOweJiIiIiIiIiIhKKXYOEhERERERERERlVLcrZiIiIiIiIiIiARBJBZpOgmlDkcOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSnHNQSIiIiIiIiIiEgYxx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFNccpA8mGeyr6SQIgpx96gAAM1G8ppMgCOVCTmg6CYLx0KONppMgCI2XttV0EgQhZflWTSdBEAzlBppOgiBEiVM1nQTBMMhJ0nQSBEEnR6bpJAiCVk6mppMgCOkiQ00ngQQm2ammppMgCPqaTgAVmV27dmHz5s2IjY2Fh4cHZs2ahapVqxYaPikpCatWrcLp06chlUphY2OD6dOno2nTpsWSPnYOEhERERERERERFYNjx45h8eLF8PX1RbVq1bB9+3YMHToUJ06cgLm5+VvhMzMzMXjwYJibm+Onn36CpaUlXr58CSMjo2JLIzsHiYiIiIiIiIhIEERikaaTUKS2bt2KHj16oGvXrgAAX19fXLhwAQEBARg2bNhb4QMCApCYmIi9e/dCR0cHAGBra1usaeT8SCIiIiIiIiIioiKWmZmJe/fuoUGDBspjYrEYDRo0wD///KM2zrlz51C9enXMmzcPDRo0QLt27fDLL78gJyen2NLJkYNEREREREREREQfKDMzE5mZquvG6urqQldXV+WYRCJBTk7OW9OHzc3N8fTpU7XnjoiIwLVr19C+fXv8+uuveP78OXx9fZGdnY0xY8YUbUbysHOQiIiIiIiIiIgEQSQS/iTXDRs2YO3atSrHxowZg7Fjx37yuRUKBczNzTF//nxoaWmhcuXKiImJwebNm9k5SEREREREREREpGnDhw/H4MGDVY69OWoQAExNTaGlpYX4+HiV4/Hx8bCwsFB77vLly0NbWxtaWlrKY87OzoiNjUVmZqbav/OphN8dS0REREREREREJBC6urooW7asyktdp52uri68vb1x9epV5TG5XI6rV6+iRo0aas9ds2ZNPH/+HHK5XHksPDwc5cuXL5aOQYCdg0REREREREREJBRikfBf/8Hg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eppOgkYkrRZ+O9Loe+GsrVkUhLFIBBEREREREREREZU4dg4SERERERERERGVUlxzkIiIiIiIiIiIBEEI+yOUNhw5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFHcrJiIiIiIiIiIiYRBzHFtJY4kTERERERERERGVUuwcJCIiIiIiIiIiKqXYOUhERERERERERFRKcc1BIiIiIiIiIiISBJFYpOkklDocOUhERERERERERFRKsXOQiIiIiIiIiIiolOK0YiIiIiIiIiIiEgYRx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFDsHiYiIiIiIiIiISil2DhIREREREREREZVS3K2YiIiIiIiIiIiEQSzSdApKHXYO0gfTVcg0nQRBSBcZajoJglBWFq/pJAhChk5ZTSdBMBovbavpJAjCpSnHNZ0EQajSfrimkyAIWlrZmk6CICgUbOS/piXndwIAykWFaDoJgvDKvo6mkyAIWQodTSdBECyyozSdBMHQyUzVdBKIShVOKyYiIiIiIiIiIiqlOHKQiIiIiIiIiIgEQSTiOLaSxhInIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESllLamE0BERERERERERAQAEIs0nYJShyMHiYiIiIiIiIiISil2DhIREREREREREZVSnFZMRERERERERESCIBJzHFtJY4kTERERERERERGVUuwcJCIiIiIiIiIiKqU4rZiIiIiIiIiIiIRBxN2KSxpHDhIREREREREREZVS7BwkIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolJKW9MJIPViY2Pxyy+/4MKFC4iJiYG5uTk8PT0xcOBA+Pj4AABu3ryJ9evX49atW5DJZHB0dESXLl0wYMAAaGlpAQAiIyPx888/49q1a4iLi0OFChXQoUMHjBgxArq6uprMIgAg6MhRHAg4iASJBM5OThg1Yjg83N0KDX/x0mVs9/dHTMwr2FhbY+jgQahbpzYAIDs7G9t2+OOvv/9G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/kClQLqo8PVrSpMK6c80nQRByNApq+kkCEbZo1s0nQRBuDTluKaTIAhV7h/SdBIEIUtL7/2BSgGFQrgbGZS0sllSTSdBEExe3H1/oFLglb1wR1uVpESRsJa80RSL7ChNJ0EwyqSr31W6tDGp0UzTSdCI9J0LNJ2E9yrTf6amk1CkOK2YiIiIiIiIiIiolOK0YiIiIiIiIiIiEgYRx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFNccJCIiIiIiIiIiYRCLNJ2CUocjB4mIiIiIiIiIiEopdg4SERERERERERGVUpxWTEREREREREREgiAScRxbSWOJExERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSrFzkIiIiIiIiIiIqJRi5yAREREREREREVEpxd2KiYiIiIiIiIhIGMQiTaeg1OHIQSIiIiIiIiIiolKKnYNERERERERERESlFKcVExERERERERGRMIg4jq2kscSJiIiIiIiIiIhKKXYOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSnFDEvpgltcDNJ0EQXhRr5emkyAI0fpOmk6CIIh+6KfpJAhGyvKtmk6CIFRpP1zTSRCEu16dNJ0EQfDo7arpJAiC9fAhmk6CYERWrKPpJAhCumMDTSdBEMpmJGg6CYKg0OWYFQBI0zXSdBIEw/jVI00ngahUYS1MRERERERERERUSnHkIBERERERERERCYNIpOkUlDocOUhERERERERERFRMdu3ahWbNmqFKlSro3r077ty580Hxjh49Cnd3d4waNapY08fOQSIiIiIiIiIiomJw7NgxLF68GKNHj0ZgYCA8PDwwdOhQxMfHvzNeZGQkli5ditq1axd7Gtk5SEREREREREREwiAWC//1H2zduhU9evRA165d4erqCl9fX+jr6yMgoPBNX3NycjBp0iSMHTsWdnZ2n1qi78XOQSIiIiIiIiIioiKWmZmJe/fuoUGDBspjYrEYDRo0wD///FNovHXr1sHc3Bzdu3cviWRyQxIiIiIiIiIiIqIPlZmZiczMTJVjurq60NXVVTkmkUiQk5MDc3NzlePm5uZ4+vSp2nP//fffOHDgAA4dOlSkaX4Xdg4SEREREREREZEwiIQ/yXXDhg1Yu3atyrEx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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Feature Correlation with Health Index:\n", + "Health index 1.000000\n", + "DBDS 0.468809\n", + "Interfacial V 0.400216\n", + "Hydrogen 0.377388\n", + "Methane 0.361770\n", + "Ethylene 0.271504\n", + "Acethylene 0.240143\n", + "Ethane 0.236507\n", + "CO2 0.168777\n", + "Oxigen 0.121009\n", + "CO 0.112751\n", + "Power factor 0.092729\n", + "Nitrogen 0.089455\n", + "Dielectric rigidity -0.104426\n", + "Water content -0.281165\n", + "Name: Health index, dtype: float64\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "COLUMN_RENAME = {\n", + " 'Hydrogen': 'hydrogen',\n", + " 'Oxigen': 'oxygen',\n", + " 'Nitrogen': 'nitrogen',\n", + " 'Methane': 'methane',\n", + " 'CO': 'co',\n", + " 'CO2': 'co2',\n", + " 'Ethylene': 'ethylene',\n", + " 'Ethane': 'ethane',\n", + " 'Acethylene': 'acetylene',\n", + " 'DBDS': 'dbds',\n", + " 'Power factor': 'power_factor',\n", + " 'Interfacial V': 'interfacial_v',\n", + " 'Dielectric rigidity': 'dielectric_rigidity',\n", + " 'Water content': 'water_content',\n", + " 'Health index': 'health_index',\n", + "}\n", + "\n", + "df = df.rename(columns=COLUMN_RENAME)\n", + "df = df.drop_duplicates()\n", + "\n", + "FEATURE_COLUMNS = [\n", + " 'hydrogen', 'oxygen', 'nitrogen', 'methane', 'co', 'co2',\n", + " 'ethylene', 'ethane', 'acetylene', 'dbds',\n", + " 'power_factor', 'interfacial_v', 'dielectric_rigidity', 'water_content'\n", + "]\n", + "\n", + "X = df[FEATURE_COLUMNS]\n", + "y = df['health_index']\n", + "\n", + "print(f\"\\nFeatures shape: {X.shape}\")\n", + "print(f\"Target shape: {y.shape}\")\n", + "print(f\"Feature names: {FEATURE_COLUMNS}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4RjdE4_HmIBC", + "outputId": "2b33e735-4f01-4a13-ddc2-2fb16aa108df" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Features shape: (470, 14)\n", + "Target shape: (470,)\n", + "Feature names: ['hydrogen', 'oxygen', 'nitrogen', 'methane', 'co', 'co2', 'ethylene', 'ethane', 'acetylene', 'dbds', 'power_factor', 'interfacial_v', 'dielectric_rigidity', 'water_content']\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train, X_temp, y_train, y_temp = train_test_split(\n", + " X, y, test_size=0.30, random_state=42)\n", + "X_val, X_test, y_val, y_test = train_test_split(\n", + " X_temp, y_temp, test_size=0.50, random_state=42)\n", + "\n", + "print(f\"\\nTraining set: {X_train.shape[0]} samples ({X_train.shape[0]/len(X)*100:.1f}%)\")\n", + "print(f\"Validation set: {X_val.shape[0]} samples ({X_val.shape[0]/len(X)*100:.1f}%)\")\n", + "print(f\"Test set: {X_test.shape[0]} samples ({X_test.shape[0]/len(X)*100:.1f}%)\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "E26xVDwbmKxU", + "outputId": "c4292aaa-ef24-438b-9e38-57256f863615" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Training set: 329 samples (70.0%)\n", + "Validation set: 70 samples (14.9%)\n", + "Test set: 71 samples (15.1%)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "scaler_X = StandardScaler()\n", + "X_train_scaled = scaler_X.fit_transform(X_train)\n", + "X_val_scaled = scaler_X.transform(X_val)\n", + "X_test_scaled = scaler_X.transform(X_test)\n", + "\n", + "print(\"\\nFeatures normalized using StandardScaler.\")\n", + "print(f\"X_train scaled shape: {X_train_scaled.shape}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "68p7bRAxmO6E", + "outputId": "6f2fd844-cf62-4c48-ba4e-b75a54883807" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Features normalized using StandardScaler.\n", + "X_train scaled shape: (329, 14)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nModel: RandomForestRegressor\")\n", + "\n", + "model = RandomForestRegressor(\n", + " n_estimators=300,\n", + " max_depth=None,\n", + " min_samples_split=2,\n", + " min_samples_leaf=1,\n", + " random_state=42,\n", + " n_jobs=-1\n", + ")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4sBJ6w1pmRhB", + "outputId": "0a6b0a73-d557-430a-8587-df2c67a17fb0" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Model: RandomForestRegressor\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nTraining RandomForestRegressor...\")\n", + "model.fit(X_train_scaled, y_train)\n", + "print(\"Training complete.\")\n", + "\n", + "# Cross-validation on training set\n", + "cv_scores = cross_val_score(model, X_train_scaled, y_train,\n", + " cv=5, scoring='r2')\n", + "print(f\"\\n5-Fold CV R² on training set: {cv_scores.mean():.4f} ± {cv_scores.std():.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MiDWyMvkmT4t", + "outputId": "77738bf1-b7d9-44eb-c2c8-debc17ee37f8" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Training RandomForestRegressor...\n", + "Training complete.\n", + "\n", + "5-Fold CV R² on training set: 0.6558 ± 0.0735\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_val_pred = model.predict(X_val_scaled)\n", + "\n", + "val_mae = mean_absolute_error(y_val, y_val_pred)\n", + "val_rmse = np.sqrt(mean_squared_error(y_val, y_val_pred))\n", + "val_r2 = r2_score(y_val, y_val_pred)\n", + "\n", + "print(\"\\nValidation Metrics:\")\n", + "print(f\" MAE: {val_mae:.4f}\")\n", + "print(f\" RMSE: {val_rmse:.4f}\")\n", + "print(f\" R²: {val_r2:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fid6UCRUmX27", + "outputId": "28d39896-ea09-4510-c6f6-3bb71bf7bbee" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Validation Metrics:\n", + " MAE: 6.4508\n", + " RMSE: 9.9702\n", + " R²: 0.7512\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_test_pred = model.predict(X_test_scaled)\n", + "\n", + "test_mae = mean_absolute_error(y_test, y_test_pred)\n", + "test_rmse = np.sqrt(mean_squared_error(y_test, y_test_pred))\n", + "test_r2 = r2_score(y_test, y_test_pred)\n", + "\n", + "print(\"\\nTest Metrics:\")\n", + "print(f\" MAE: {test_mae:.4f}\")\n", + "print(f\" RMSE: {test_rmse:.4f}\")\n", + "print(f\" R²: {test_r2:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sks39c5vmbOe", + "outputId": "488e211d-ca78-402e-d226-2aefbdaa1225" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Test Metrics:\n", + " MAE: 6.4817\n", + " RMSE: 9.7757\n", + " R²: 0.7098\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_train_pred = model.predict(X_train_scaled)\n", + "\n", + "metrics_df = pd.DataFrame({\n", + " 'Dataset': ['Training', 'Validation', 'Test'],\n", + " 'Samples': [len(X_train), len(X_val), len(X_test)],\n", + " 'MAE': [mean_absolute_error(y_train, y_train_pred), val_mae, test_mae],\n", + " 'RMSE': [np.sqrt(mean_squared_error(y_train, y_train_pred)), val_rmse, test_rmse],\n", + " 'R²': [r2_score(y_train, y_train_pred), val_r2, test_r2],\n", + "})" + ], + "metadata": { + "id": "djRLTCC3mfPx" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nComprehensive Metrics:\")\n", + "print(metrics_df.to_string(index=False))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TiqXTorwmg5q", + "outputId": "1afa70f3-721a-45bf-bfdf-1e4f5e1baccd" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Comprehensive Metrics:\n", + " Dataset Samples MAE RMSE R²\n", + " Training 329 2.351117 3.710875 0.952014\n", + "Validation 70 6.450814 9.970195 0.751184\n", + " Test 71 6.481746 9.775679 0.709752\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Plot 1: Predicted vs Actual\n", + "fig, axes = plt.subplots(1, 3, figsize=(16, 5))\n", + "\n", + "for ax, actual, pred, title, color in zip(\n", + " axes,\n", + " [y_train, y_val, y_test],\n", + " [y_train_pred, y_val_pred, y_test_pred],\n", + " ['Training', 'Validation', 'Test'],\n", + " ['steelblue', 'orange', 'green']\n", + "):\n", + " r2 = r2_score(actual, pred)\n", + " ax.scatter(actual, pred, alpha=0.6, s=30, color=color)\n", + " mn = min(actual.min(), pred.min())\n", + " mx = max(actual.max(), pred.max())\n", + " ax.plot([mn, mx], [mn, mx], 'r--', lw=2)\n", + " ax.set_xlabel('Actual Health Index')\n", + " ax.set_ylabel('Predicted Health Index')\n", + " ax.set_title(f'{title} Set (R² = {r2:.4f})')\n", + " ax.grid(True, alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('predicted_vs_actual.png', dpi=150)\n", + "plt.show()\n", + "\n", + "# Plot 2: Residuals\n", + "residuals = y_test.values - y_test_pred\n", + "\n", + "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", + "\n", + "axes[0].scatter(y_test_pred, residuals, alpha=0.6)\n", + "axes[0].axhline(y=0, color='r', linestyle='--', lw=2)\n", + "axes[0].set_xlabel('Predicted Health Index')\n", + "axes[0].set_ylabel('Residuals')\n", + "axes[0].set_title('Residuals vs Predicted (Test Set)')\n", + "axes[0].grid(True, alpha=0.3)\n", + "\n", + "axes[1].hist(residuals, bins=20, edgecolor='black', alpha=0.7)\n", + "axes[1].set_xlabel('Residuals')\n", + "axes[1].set_ylabel('Frequency')\n", + "axes[1].set_title('Distribution of Residuals (Test Set)')\n", + "axes[1].grid(True, alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('residuals.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(f\"\\nResiduals (Test Set):\")\n", + "print(f\" Mean: {residuals.mean():.4f}\")\n", + "print(f\" Std Dev: {residuals.std():.4f}\")\n", + "\n", + "# Plot 3: Feature Importance\n", + "importances = model.feature_importances_\n", + "indices = np.argsort(importances)[::-1]\n", + "\n", + "plt.figure(figsize=(12, 6))\n", + "plt.bar(range(len(FEATURE_COLUMNS)),\n", + " importances[indices], align='center', alpha=0.7, color='steelblue')\n", + "plt.xticks(range(len(FEATURE_COLUMNS)),\n", + " [FEATURE_COLUMNS[i] for i in indices], rotation=45, ha='right')\n", + "plt.xlabel('Feature')\n", + "plt.ylabel('Importance')\n", + "plt.title('Random Forest Feature Importances')\n", + "plt.tight_layout()\n", + "plt.savefig('feature_importance.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(\"\\nFeature Importances (ranked):\")\n", + "for i in indices:\n", + " print(f\" {FEATURE_COLUMNS[i]:<25} {importances[i]:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "fK7-YsYbmjDp", + "outputId": "5df10c4b-7fac-4cbf-b039-d5abfc2239ec" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjYAAAHqCAYAAACne3d+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xt8zuUfx/HXvXtnM4eZkTlsjmlhErWU06gMhZBCB6VzopOOFEk6IZJQopxyqJyFDkR+yVCisCFnm8M2O2/3749vu+e2jY1t92Hv5+Oxh32v7334XG72/ez6fK/rMlksFgsiIiIiIiIiIiIiIiJOwM3eAYiIiIiIiIiIiIiIiBSWChsiIiIiIiIiIiIiIuI0VNgQERERERERERERERGnocKGiIiIiIiIiIiIiIg4DRU2RERERERERERERETEaaiwISIiIiIiIiIiIiIiTkOFDRERERERERERERERcRoqbIiIiIiIiIiIiIiIiNNQYUNERERERERERERERJyGChsiV2DYsGG0b9/+sp770Ucf0bBhw2KOyLns2LGDsLAwDh8+bO9QpAB79+6lcePG/PPPP/YORUTEIR06dIiGDRuyaNEia1tRrvENGzbko48+KtaY+vfvT//+/Yv1NZ1JdnY2Xbp0YfLkyfYORS5iyJAhDB482N5hiIiIk9D13fFlZGTQpk0bvvrqK3uHImWEu70DECkJhR1MmDlzJq1atSrhaBzTunXr+Oyzz9i3bx/JyclUqVKFsLAwevbsyS233FLk1/vkk0+oV68ekZGRhX7Ohx9+SFRUFDVq1LC29e/fn//973/WYy8vL2rXrk3Pnj0ZMGAAbm659djnn3+eQ4cOkZmZiZeXF2+88QZ169YtcuxXYu3atUycOJG9e/cSEBBAjx49ePzxx3F3v/SP1wMHDvD++++zadMm0tPTady4MYMHD+aGG26wedywYcNYvHhxnueHhISwcuVK6/G+fftYuHAhv/zyCwcPHqRcuXI0btyYp556imuvvTbP848fP87o0aP55ZdfyM7OplWrVrz88svUrFnT+ph69erRpk0bJkyYwMSJE4vyVyMi4nAeffRRNm3axC+//IKfn1++j3n22WdZtWoV69evp1KlSqUcYeHt3buXFStW0L17d4KDg+0djtWhQ4eYNGkSv/32G8ePH8ff3586derQqlUrnn766SK/3k8//cSOHTt46qmnCv2cpUuXcvToUfr162dtW7RoES+99JL12Gw2ExAQwE033cSQIUMICgqynlu2bBmzZs3C3d2d06dPc//999OrV68ix34lCnONzs+hQ4fo0KFDged79erFqFGjANi8eTMDBgzI93Hz5s2jWbNm1uMNGzawfPlyduzYwb59+6hevTrr1q3L87yi5CIPP/wwPXv2ZPfu3TRq1Oii/RIRcXWlOYaRkpLCtGnTaNmyZaFfS9f34lEa13eA9PR0xo8fz7fffktCQgINGzbkmWee4aabbrJ5XkZGBlOmTGHx4sUcP36coKAgevbsyaBBg/KMaezfv5/x48fz+++/c/bsWapXr06XLl0YOHAgPj4+AHh4ePDAAw/wySefcNddd+Hl5VXUvyKRIlFhQ1zS2LFjbY6//fZbfvnllzztVzoIPnLkSCwWy2U997HHHmPQoEFX9P6Xa/r06YwdO5aWLVvyyCOP4O3tzYEDB9i0aRPLly+/rMLGlClTuPXWWwtd2Ni1axcbN25k7ty5ec5Vq1aNoUOHAnD69GmWLl3K22+/zenTpxkyZIj1cY8//jghISEAvPXWW4wYMYJZs2YVOfbL9dNPP/HEE0/QsmVLXnvtNf755x8mT55MfHw8b7zxxkWfe/ToUfr06YPZbLYmAosWLWLgwIHMmDGD66+/3ubxnp6eNokKQPny5W2OFyxYwIIFC+jUqRP33HMPiYmJzJs3jz59+jBt2jQiIiKsjz137hwDBgwgMTGRRx55BA8PD2bMmEG/fv345ptvbAbz7r77bgYNGsTBgwepVavW5f51iYjYXbdu3fjhhx9Ys2YNd955Z57zKSkprFu3jtatW19RUaM0rvF79+5l4sSJtGzZMk9hY/r06SX63gU5cOCA9ZfYnj17EhwczIkTJ/jrr7+YOnXqZQ98fPXVV0Ua+Jg+fTpRUVF5rpMATz/9NMHBwaSnp7Nt2zYWL17M77//ztKlS62/fDdp0oRZs2bh4eHBrl276N69OzfeeGOpFZCKco2+UOXKlfPkuwDr169nyZIleQY0wLip5MKiw4XX+6VLl7J8+XIaN25M1apVC3z/ouQijRs3JiwsjM8++yzfmEVEypLSGsMAI9+ZOHEiTz75ZKEKG7q+F4/SvL4PGzaMVatWMWDAAOrUqcPixYsZNGgQX3zxBS1atLA+7vnnn2flypX07NmTsLAwtm/fzvjx4zl69CgjR460Pu7o0aP06tWL8uXL069fPypUqMC2bdv46KOP2Llzp80smh49evDee++xZMkS7rrrriv5KxO5NItIGfDGG29YGjRocMnHJScnl0I09pWRkWFp3ry55YEHHsj3fFxc3GW9brNmzSwvvvhioR8/cuRIS9u2bS3Z2dk27f369bNERUXZtKWmplratWtnCQ8Pt2RmZhb4egMGDCh64Fegc+fOlm7dulkyMjKsbR988IGlYcOGlr179170uSNGjLA0btzYsm/fPmtbcnKypU2bNpbu3bvbPPbFF1+0NGvW7JLx/PHHH5akpCSbtlOnTlluuOEGy913323T/umnn1oaNGhg2b59u7Vt7969lquvvtry/vvv2zw2PT3dcv3111vGjRt3yRhERBxZSkqKJTw83PLggw/me37JkiWWBg0aWJYtW1bo1/z3338tDRo0sCxcuPCyYmrQoIFlwoQJRX7eihUrLA0aNLD8+uuvl/W+JSHn2nbo0KE85y43vyhsDpdj586dlgYNGlg2btxo075w4UJLgwYNLDt27LBpf/fddy/6me/cudPSqFGjfPtUUopyjS6s++67z9K8eXNLamqqte3XX3+1NGjQwLJixYpLPv/YsWOW9PR0i8VisQwaNMjSrl27fB9XlFzEYrFYpk+fbmnWrFme54iIlHVFvf4VRXx8fJHyD13fi0dpXd+3b99uadCggWXatGnWttTUVEtkZKSlT58+eR534e/5Y8aMsTRs2NCya9cua9vkyZMtDRo0sPzzzz82j33hhRcsDRo0sJw5c8am/ZFHHrHcc889l9UnkaLQHhtSZvXv358uXbrw559/cu+999K0aVM++OADANasWcOgQYNo3bo1YWFhREZGMmnSJLKysmxe48I9NnLW2Z4+fTrz5s0jMjLSurzTjh07bJ6b3/rbDRs25M0332TNmjV06dKFsLAwoqKi+Pnnn/PEv3nzZnr06MG1115LZGQkc+fOLdSa3qdPnyYpKYnmzZvnez4gIMDmOD09nQkTJtCxY0fCwsJo06YNY8eOJT093Sbu5ORkFi9eTMOGDWnYsCHDhg27aBxr167lhhtuwGQyXfRxYCxHFRYWxrlz54iPj89zftOmTSxYsIBnn332kq9VXPbu3cvevXvp3bu3zRTNe+65B4vF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MTGFKiCJiDiqG264gcDAQJYuXWpT2Fi5ciUZGRnWXw4bNmzIqlWrcHPLneB8xx13cPvtt7NgwQKeeOKJQr/n7t27+e6777jnnnsYPnw4APfeey/PPvssf//9t81j27Zty2233WbT1q5dO/r06cOqVau48847qVmzJi1atGDWrFlERERccn3sefPmsW/fPt599126desGGPsn9e/fn3HjxtGzZ0+bn/mXm8f079+fb7/9lvvvv5+rr76a66+/nlatWnHTTTdZf0kGY5DgrbfeolevXjbrN3fv3p3bbruNKVOmMHLkSMLDw6lTpw6//PJLofILMHKMpk2bFng+KSmJU6dOkZ6ezvbt25k4cSKenp42/UpNTeWxxx4jMDCQMWPGYDabL/m+I0eOzDMDJj8tW7a86H5gl3ONvpTvvvuOwMBAbrjhBpt2Dw8Pbr31Vm655RYqVarEvn37mD59Ovfeey9z584t0g0oF5NfLpLD3d2datWqsXfv3mJ5LxERV7Vlyxa+/vpr3nvvPZuB7FatWvHQQw+xcuVKunbtSnR0NGfPnmX69Ok2ReqcvSp9fX259dZbGTFiBA0bNizU9VXXd+e6vp88efKS7wNY9yvdunWrzeblW7ZssXkcwC233MLgwYOZMmUK69ats7Y/+uijNvug5sh5vb1796qwISVKhQ0p0zw9PfMdvD5/8DwpKYn09HRatGjBvHnziImJoVGjRhd93c6dO9vcjX+xaZAXioiIsJnt0KhRI/z8/KzPzcrKYtOmTURGRtrcLVq7dm1uvvlmfvjhh0u+x9NPP01oaCizZ89mw4YN/Pzzz3z44Yc0btyY9957z3rH58qVK6lbty6hoaE2Mx1yLpybN28ucEmrizl9+jSQ9+6JHDExMXkKEO3bt+ett96yacsZVPriiy/44osv8PPzs9m0Kj+ff/55oWKsV6/eRc+npqYC5Fvk8vLyuuiSUWAUy3744QeGDBnCkCFD8PHxYfbs2da7InJeH8izxFZUVBR16tThww8/ZNWqVXmmjuaIj4/n2WefJTg4mIceesjannPHSUGxn/+YHDmfVc5nJyLirMxmM1FRUcyYMYNDhw5Zi+xLly6lSpUq1uvP+T8js7KySEhIwNfXl5CQEOusvcL66aefAPIsD3XfffexdOlSm7bzc5CMjAySkpKoVasW/v7+/PXXX/luen4p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UERERC6k67tzmDFjBtOmTWPNmjWF2g9G5Epc3sKpImJ3qampNsf79+/n559/vugGjY5m6NChrFixgsOHD9s7FCnAvn37+PHHHxk8eLC9QxERESmUbt26cdVVV/HVV1/ZOxS5iE8//ZRbb71VRQ0RESkUXd8dX0ZGBjNmzOCxxx5TUUNKhWZsiDip1q1b0717d2rWrMnhw4eZO3cu6enpLF68mDp16tg7PBEREREREREREZESoT02RJzUzTffzLJlyzh58iSenp40a9aMoUOHqqghIiIiIiIiIiIiLk0zNkRERERERERERERExGlojw0REREREREREREREXEaKmyIiIiIiIiIiIiIiIjTcPk9NrKzs8nMzMTNzQ2TyWTvcERERJyKxWIhOzsbd3d33NzKzv0Qyh9ERESujHII5RAiIiJFVZT8weULG5mZmfzxxx/2DkNERMSpXXvttXh6eto7jFKj/EFERKR4KIcQERGRoipM/uDyhY2cyk7t2rWpWLGiy98xYbFYSEhIwN/fX311IWWlr2Wln6C+uipX7GtWVhZ//PFHmbrTEnLzh2uvvRaz2exyn60r9ceV+gLqj6NTfxyb+uNYynoOoTEI16O+uib11TWpr86rKPmDyxc2cj5QNzc3zGazS3zAF2OxWNRXF1RW+lpW+gnqq6ty5b66Wn8uJae/ZrPZWthwpc/WlfrjSn0B9cfRqT+OTf1xTM4c++XQGITrUl9dk/rqmtRX51eYvpStWydERERERERERERERMSpqbAhIiIiIiIiIiIiIiJOQ4UNERERERERERERERFxGipsiIiIiIiIiIiIiIiI01BhQ0REREREREREREREnIYKGyIiIiIiIiIiIiIi4jRU2BAREREREREREREREaehwoaIiIiIiIiIiIiIiDgNFTZERERERERERERERMRpqLAhIiIiIiIiIiIiIiJOQ4UNERERERERERERERFxGipsiIiIiIiIiIiIiIiI01BhQ0REREREREREREREnIYKGyIiIiIiIiIiIiIi4jRU2BAREXEFmZlw+LC9oxARERFnc/CgvSMQERERZ3P0KGRk2DUEFTZEREScXVYWdO8Ot9wCJ07YOxoRERFxFtOmQb16sGyZvSMRERERZ/H339CiBTz6KFgsdgtDhQ0RERFnZzZD06YQEwN33WXXxEJEREScyDXXGHlEnz6wd6+9oxERERFnUKMGBAXBZ5/BpEl2C8Pdbu8sIiIixWfkSDh1yihsmEz2jkZEREScwY03wpdfwtatEBpq72hERETEGfj5wdKl8Mwzxs0RdqLChoiIiDOKj4eAgNxjkwk+/th+8YiIiIjjO3UKKlYEt/MWb+jZ0/gSERERyU92Npw5A5Ur57ZddRXMn2+3kEBLUYmIiDifzz+HOnVgwwZ7RyIiIiLOYvduYz3sl16ydyQiIiLiLFJToW9faNcOEhLsHY0NFTZERESchcUCr70GDz4ISUlwxx1w8KC9oxIRERFH99NPxrJTsbEwdizMmGHviERERMTRxcVBZKQxM2PHDrj7bofa01NLUYmIiDiDtDQYOBC++iq3rV8/Y9MuERERkYJ8+aVxU0RGhnHcrBl07GjXkERERMTB7dkDnTvD3r3Gcbly8PjjDrWnp2ZsiIiIOLpTp6BTp9yihskE48bB+PFgNts1NBEREXFQFguMHAn9++cWNTp3hp9/1o0RIiIiUrBffjFmeuYUNapXN/KHLl3sG9cFNGNDRETEkcXEGIMQf/9tHPv4wOzZcOeddg1LREREHFh6OjzyiO2SU48+Ch99BO4aBhAREZECzJsH991nrBoBEBYGy5ZBrVr2jSsfmrEhIiLiqDZvhhtuyC1qVK0KP/6oooaIiIgU7MwZ46aI84saY8fCxx+rqCEiIiL5s1jgnXeMfTRyihqRkbBhg0MWNUAzNkRERBxTQgLcfjucPm0cX321cZdESIh94xIRERHH9thjsHat8b2XF8yaBb162TcmERERcWzffAPDhuUeP/ggfPIJeHjYLaRL0YwNERERR+TvD5MnG9+3bWuscamihoiIiFzKu+/CVVdBlSqwbp2KGiIiInJpd9wBvXsb348aBdOmOXRRAzRjQ0RExHH16QN+ftCxI3h62jsaERERcQbBwbBiBfj6Qr169o5GREREnIGbG3zxBdx/v7F6hBPQjA0RERFHkJQEX36Ztz0qSkUNERERKdjs2ZCYaNvWpImKGiIiIlKw7dvh119t27y9naaoASpsiIiI2N/Ro9CmDfTvb0z3FBEREbmU7Gx49lm4915jlmdmpr0jEhEREWewciW0bg1du8LevfaO5rKpsCEiImJPf/4JN9wAW7cax8OGGRuHi4iIiBQkOdnYO+ODD4zjFStg6VL7xiQiIiKO79NPoUsXY9WIuDgYPtzeEV02FTZERETsZc0auOkmOHjQOK5VC376ydg4XERERCQ/J05Au3awaJFxbDYbgxR33mnXsERERMSBZWcbN1I+8ghkZRltPXrA1Kn2jesKaPNwERERe/j8cxg0KHfZiOuuM+60rFbNvnGJiIiI49q9Gzp3hthY49jPDxYsgFtvtW9cIiIi4rhSU+G++2D+/Ny2Z5+FsWONTcOdlPNGLiIi4owsFnj9dXjwwdyiRteuxkwNFTVERESkID//DBERuUWNGjVgwwYVNURERKRgcXEQGZlb1HBzg4kT4b33nLqoAZqxISIiUnrS0uChh+DLL3PbnnoKPvzQWEZCREREJD+zZ8MDD0B6unHctKkx0zM42L5xiYiIiOPau9eY6blnj3Hs6wvz5hl7bLgA5y7LiIiIOJO4OGNfDQCTyShoTJigosZlSEpK4q233qJdu3Y0adKEu+++mx07dljPWywWxo8fT+vWrWnSpAn3338/+/fvt1/AIiIil8tigcWLc4sat90G69erqCEiIiIX9/vvuUWNatWM2Z8uUtQAFTZERERKT40asGwZBAbCwoXwzDP2jshpvfrqq2zcuJGxY8eyZMkSbrrpJh544AGOHz8OwNSpU5k1axYjRoxg/vz5+Pj4MHDgQNLS0uwcuYiISBGZTDBzJtxwg7Hh55IlUL68vaMSERERR9enD4waBddcA5s3G3t7uhAVNkREREpT8+bG2tjdu9s7EqeVmprK6tWref7557n++uupXbs2Tz31FLVr12b27NlYLBZmzpzJY489RmRkJI0aNWLs2LGcOHGCNTkzZkRERJyJj48x63PyZHDXitIiIiJSSC+/bBQ1atWydyTFThmRiIhISfnmG5gzx1gX+/zlpsqVs1tIriAzM5OsrCy8vLxs2r28vNi6dSuHDh3i5MmTREREWM+VL1+epk2bEh0dTVRUVKHfy2Kx5PlyBa7UH1fqC6g/jk79cWwu05+DB+HBB7FMmYIlICC3P76+xp9O0j9H+xyysrL46KOP+O6774iLi6Nq1ap0796dxx9/HJPJBBgxT5gwga+//pqEhASaN2/OiBEjqFOnjn2DFxERuZTMTGMPz1atjH25cphMLjsGYdfChhILERFxWePGwdChxuBDYCB89JGRUMgV8/PzIzw8nI8//pjQ0FCqVKnC0qVL2bZtG7Vq1eLkyZMABAQE2DwvICCAuLi4Ir1XQkICbm5uWCwWkpOTAaw5ijNzpf64Ul9A/XF06o9jc4X+mLdvp1yfPrgdP052586kLFoEOGd/srOz7R2CjalTpzJnzhzeeecd6tWrx59//slLL71E+fLlGTBggPUxs2bNYsyYMQQHBzN+/HgGDhzI8uXL89xQISIi4jASE6FvX1i5EqZPN2ZndOhg76hKnF0LG0osRETE5WRlweDBRiEjx+nTRruWjig2Y8eO5eWXX+aWW27BbDbTuHFjoqKi2LlzZ7G+j7+/P2az2XrXaYUKFZxycOlCrtQfV+oLqD+OTv1xbE7fn6VLoW9fTOfOAeBmsVAuI4PyTtqfrKwse4dgIzo6mg4dOtC2bVsAgoODWbZsGTt27ADIs5QlGPlGREQEa9asKdKMTxERkVJz+DDlO3fG9OefxrHJBP/d7Ofq7DrCosRCRERcyrlzlOvfH9OKFbltr70Gb7yh2RrFrFatWnz55ZckJyeTlJRE1apVeeaZZ6hZsyaBgYEAxMfHU7VqVetz4uPjadSoUZHex2QyWQeTcr53xsGl/LhSf1ypL6D+ODr1x7E5bX8+/thYPiJnlkNEBHzzDRYPD+fsD443yyQ8PJz58+cTGxtLSEgIu3fv5vfff2fYsGEAxbqUpYiISKnYvh2iojAfPmwcV6oEixdDmzb2jauU2LWwocRCRERcxrFj0KULHr//bhy7u8Onn9qubSnFztfXF19fX86ePcuGDRt4/vnnCQ4OJjAwkE2bNnH11VcDkJSUxPbt2+nbt6+dIxYRETlPdja88AK8/35uW+/e8MUX4OUFZ8/aLzYXM2jQIJKSkrj99tsxm81kZWUxZMgQunXrBlCsS1kCrrHfSyG4zN42haC+uib11TWVib6uWgW9emFKSgLAEhICy5ZBo0ZOsx9Xforymdm1sFGaiYXL/2P+T5n4j/sf9dX1lJV+gvrqcnbuhC5dMB04AIDF3x8WLIDISKdOKMDxNv7MsX79eiwWCyEhIRw8eJCxY8cSGhpKjx49MJlMDBgwgMmTJ1O7dm3rUpZVq1a1zgAVERGxu5QU6N8fFi7MbXvxRRg9GtzcnD6HcDQrVqxgyZIlvP/++9SrV49du3bx9ttvW/f6LG7Jycm4ubk53MyV4uYKe9sUlvrqmtRX1+TqffX84gt8nn0W03/LPqY3a0byvHlQtarT3xRRlD267FrYKM3EQkmF61FfXU9Z6Seor67EvGMHfl27YkpIACDzqqs4N38+lmuucfqEAhxv488ciYmJfPDBBxw7doyKFSvSqVMnhgwZgoeHBwAPP/wwKSkpvP766yQkJHDdddcxbdo07c8lIiKOIT0d2reHX381js1mYzmqQYPsG5cLGzt2LIMGDbKu/NCwYUOOHDnClClT6N69e7EuZQnGrFKn3e+lCJx+b5siUF9dk/rqmly6r++8g+mll6yHljvv5NzEiVSoXt0l+lqUPbrsWtgozcRCSYXrUV9dT1npJ6ivLqV5c2jYEH77DUvz5iR9+SX+DRu6TF8dbePPHJ07d6Zz584FnjeZTAwePJjBgweXYlQiIiKF5OkJt91mFDb8/ODrr41jKTGpqal58jOz2WzNVYt7KUun3e/lMqivrkl9dU3qqwvo0AF8fIyZn0OHGoWOpCSX6WtR+mDXwkZpJhYu+485H+qrayorfS0r/QT11WX4+cGSJTB8OLz7LmRluVRfXaUfIiIiDuf11+HcObj3Xmja1N7RuLx27drxySefcNVVV1lXjPj888/p2bMngJayFBER53D99TBnDvz7Lzz5ZJleutKuhQ0lFiIi4nTS0yE+HqpXz20LCoJPPjESChdYfkpERERKwMGDUKtW7rHJBGPH2i+eMubVV19l/PjxvPHGG9ZVIfr06cMTTzxhfYyWshQREYdz6JAx/mA257bdcYf94nEgdi1sKLEQERGncvo09OgBJ07AL79AxYr2jkhEREQcncVibAj+5puwahW0bWvviMokPz8/XnnlFV555ZUCH6OlLEVExKFs2gTdukG/fvDhh/aOxuHYtbChxEJERJzG/v3QuTPs2mUc9+sHS5faNSQRERFxcBkZ8Oij8NlnxnH37rBzJ1x1lX3jEhEREce2YIEx7pCWBuPGQbNmcN999o7KobjZOwARERGH99tv0KpVblEjMBBee82+MYmIiIhjO3sWoqJyixoAL71ku5yliIiIyPksFnjvPejVyyhqALRvr+Wn8mHXGRsiIiIO79tvoW9fSEkxjhs2hOXLITTUvnGJiIiI4zp40Chq/PmncezlBV98AX362DcuERERcVyZmfD00zB5cm7b/ffDlCng6Wm3sByVZmyIiIgUZPx4Y8mInKLGLbfAxo0qaoiIiEjB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/jcMHrzHp83YZwYVVRVk27PxNnppijbhtDopzC4k15HLjH1m9EHwQoi+1OXExo033shll13Gf//7Xw444AAAVq1axXfffcd9bWvvCyHSh66ricWGDbDvvp16ilW3EDFM7LoFwzQxTTU/0TWNiBHDqrf22AhHDdZW1VPT0IR3m58Mh41BOU7yXU50i4UMu5W6xtRdBBFC9O78IScnh7333pv169czefJkIpEIDQ0N7XZt1NbWdtiTozOvret6y12nubm5Kbm49H3pNJ50GgukwHg2vQrb3wfX3mDLbj0f8WHd/j7O4JR2zavNiy+mYb/9yD7ySJzJOJ4uSvrPp4tkPMkt1cdjGEZcXkfWIIToh0pK4O23Ya+9IDOzU085fMThOKwONmzdgAULWbYswkaYDQ0bGFQ0iMNHHN67MQsh+lyXExtHHnkkb775Jk8//TQejweAY445htNPP52ioqK4ByiESIDHH4cf/hAOOqj1XFZWp5MaADkZNrzbg4S+10A8itlyHVRS4+n31rJ+q49g2MCiQX0gQq2viSEDMtinMJdgOErRwM5NZoQQyak35w9+v58NGzYwaNAgxo4di81mY9myZRx//PEAeDweNm/e3K3+GpqmtSwmNf+ciotLHUmn8aTTWCDJx+P9D2g62F3tz9tzYG0llN8Fd8xqdylWWpq84+mGpP58ukHGk9xSeTzxilnWIISIj1A0RLmnnDJPGV6fl0JXIdPc05jqnorDmsB+V01NsHAhXHdd+yTGD37QpZf57/r/EjWilA4ppbaplkA4QKY9k3xnPlEjyn/X/5eZo2fu+YWEECmjy4kNgKKiIq666qp4xyKESDTTVA3Bb7kFCgvho49gxIhuvljnemx8sm4L5Z9twjChuWKVCYQjMTbVBnDadCyahfHugm7GIYRIFvGaP9xxxx0cffTRFBcXs2XLFu677z4sFguzZs3C5XIxe/ZsFi5cSG5uLtnZ2cyfP5/S0lJpHC5EPDR52+/UaFZRBdeuAF8E9n8Szjqr72MTQqQtWYMQomdC0RAL31/IEs8SdE0n257NKu8qKqoqWF61nLlT5iYmuVFbCyedBO+/rxqGP/usqhjRDWWeMqwWK6PzR+90bW3dWso8ZZLYECLNWPb8kJ0tX76ca665htNPP53q6moAFi9ezPLly+ManBCiD4XDcO65KqkB4PXCM890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t+V9qW3btmfd0/j4eI0bN06SXfc0NzdXL7zwgtq2bauEhAS1b99e06ZNkzHGc44t97UksimWsC1esDkmCPRx38Zx3abx27Yx2sZxOC0tTRMnTlSbNm2UkJCgXr16af369Z76QOtPSWFTzHAutsUUvtgcb5xLoMcjvtgYq/hiUxzji20xji82xj8Fwlhk8eLF5rnnnjNff/21iYuLMwsWLPCqf+2118w111xjFixYYDZt2mQGDhxo2rZta44fP+6nFl+Ye++918yaNcts3brVbNq0yfTv39+0bt3apKene8557LHHTKtWrczSpUvNhg0bzG233WZuv/12P7b6wnzzzTdm8eLF5vfffzdJSUnmueeeM/Xq1TNbt241xtjTzzOtW7fOtGnTxnTu3NlMmDDBU25TX6dOnWo6depkDhw44PlKSUnx1NvS1yNHjpg2bdqYkSNHmnXr1pnk5GSzZMkSs2PHDs85trwvpaSkeN3PH374wcTFxZkff/zRGGPPPTXGmFdeecVcd9115ttvvzU7d+408+fPN1dffbV55513POfYcl9LIptiCdviBVtjAhvGfdvGddvGb9vGaBvH4aFDh5qOHTuaFStWmO3bt5upU6eaRo0amX379hljAq8/JYVNMcO52BZT+GJrvHEuNsQjvtgWq/hiWxzji20xji82xj8FwarExpn+HFi43W7TvHlz8+abb3rKjh07ZurXr2/mzp3rjyYWmJSUFBMXF2dWrFhhjHH6Va9ePTN//nzPOb/99puJi4sza9as8VMrC861115rZsyYYWU/09LSTIcOHcwPP/xg+vTp4wkobOvr1KlTTZcuXfKss6mvTz/9tOndu/df1tv8vjRhwgTTvn1743a7rbqnxhgzYMAAM2rUKK+ywYMHm+HDhxtj7L6vJY1tsYSN8UKgxwS2jPu2jeu2j9+BPkbbNg5nZmaaq666ynz77bde5d27dzfPPfdcwPWnpLItZjgXG2MKXwI93jgXW+IRX2yLVXyxPY7xJdBjHF9si38KilVLUfmya9cuHTx4UM2aNfOURUZGqmHDhlqzZo0fW3bxUlNTJUnly5eXJG3cuFHZ2dlefa1du7ZiYmK0du1afzSxQOTm5mrevHnKyMhQYmKilf0cP368WrVq5dUnyc57umPHDrVo0ULt2rXT8OHDtWfPHkl29XXRokWqX7++hgwZ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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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X64dO3Y0iK2pml2NHXPhwoU677zzNHz4cGVkZGjChAl65ZVXAmqDF198URMnTtShhx6qI444QpMnT9Y777zT5Pa7du3SoEGDGr2VfNOmTUpPT9dLL70kKbA2aomjjjpKUm19WemPtti4caOuv/56HXHEETrnnHP827/11luaPHmyMjMzdeSRR+q6667T9u3bGxz3tdde07hx45SZmanTTz9dX3/9dYNtmqpp++uvv2rmzJk66qijlJmZqfHjx+vhhx/2x1c3onXs2LFKT09Xenq6P/62jrEp77//vpKTk1s8itTlcmnOnDk67rjjlJGRodGjR+vBBx+Uy+Wqt93KlSt19tln6/DDD9fQoUM1fvx4/eMf/5BUW+qi7qLw1ltv9bdBc7WBt2zZotTU1EZHJickJDRYtrc2nDZtmlasWKG8vDz/+Xf/3bLZbDryyCMb/I4DABBKhg8friuvvFJ5eXn1atQ3dm24L3+bp02bppNOOklr167Vueeeq0MPPdS/b1P19H0+n/7xj39o5MiRGjJkiC6//PIG1zNjxozRLbfc0mDf3Y+5t9gauz6uqqrS/fffr9GjRysjI0Pjx4/XvHnzGozITU9P11//+le9//77Oumkk5SRkaGJEyfq448/bq7Z/QoLC3XbbbdpxIgRGjx4sE455RQtXrzYv76uNmtubq5WrFjR6HVfIOLj49W3b19t2bKl3nKfz6fnnntOEydO1ODBgzVixAjdeeedKi0trbfdmjVrNH36dA0bNkyZmZkaM2ZMgzupGqtp+/XXXys7O1uDBw/WuHHj9OqrrzaIrbk5HvY8Zl5enu6++26NHz9emZmZGjZsmGbMmBFQe+Tk5Oiaa67RyJEjNXjwYB1zzDG67rrrVF5e3ux+K1askMfj0YgRI/Z6jj0Fck2+t7jS09NVVVWlxYsX+/u/sdd8nS1btshisWjIkCEN1tnt9gbJ9e+//17Tp0/XYYcdpkMPPVRTp07VN998418fyGePESNG6JtvvlFJSUlLmwgIKQyNAw4AdfWNdk8ObdiwQWeffbYOOuggXXLJJerUqZOWLl2qq666So8++qiOO+44SdLcuXP11FNP6YwzzlBmZqYqKiq0du1a/fjjjxo5cmST5/zLX/6it99+WyeddJKysrL0+eef73MJhQULFqh///4aM2aMrFarPvzwQ82aNUuGYejcc89tcr/XX39d99xzj8aPH6/zzjtPNTU1Wr9+vb7//nudfPLJje7TtWtXHXHEEVq6dGmD276WLFkii8XiHx3b2jZqSt3Fa+fOnestnzlzpg4++GBdd911/gv0J554Qv/85z914okn6vTTT1dRUZFeeuklnXvuuXrzzTf9ff7vf/9bd955p4YOHarzzz9fW7du1RVXXCGHw6GkpKRm4/n555917rnnymq1asqUKUpOTtaWLVv0wQcf6LrrrtNxxx2nnJycBrdg1ZUc6IgYpdrbpA455JDAG1q1HwyuuOIKffPNNzrzzDPVr18//fLLL3r++eeVk5Ojxx9/XFLt78tll12m9PR0zZgxQxEREdq8ebNWr14tSerXr59mzJihOXPmaMqUKTrssMMkNX8LWnJysr799lv98ssvSktLazbOQNrw8ssvV3l5eb3yD3veanbIIYdo+fLlqqioaJNagQAAtIdTTz1V//jHP/Tpp582OQqzLf42l5SU6JJLLtHEiRN1yimnNPql6e6eeOIJmUwmXXLJJSosLNTzzz+vCy64QG+99ZZ/RHAgWnrdYBiGrrjiCn+yd+DAgfrkk0/04IMPaufOnbrtttvqbf/NN9/ov//9r8455xzFxMToxRdf1IwZM/Thhx/Wu1V+T9XV1Zo2bZq2bNmic889VykpKVq2bJluueUWlZWV6fzzz1e/fv304IMPavbs2erevbu/5EFLS015PB7t3LlTDoej3vI777xTixcv1uTJkzVt2jTl5ubq5Zdf1k8//aQFCxbIZrOpsLBQ06dPV5cuXXTppZcqLi5Oubm5+t///tfsOdevX6/p06crPj5e11xzjTwejx599NG99ntz1qxZo2+//VYTJ05U9+7dlZeXpwULFui8887Tu+++q+jo6Eb3c7lcmj59ulwul6ZOnaquXbtq586dWrFihcrKyhQbG9vkOb/99lt17txZycnJLYo1kOvJQOJ68MEHdfvttyszM9P/+9ncoInk5GR5vV699dZbmjRpUrMxrlq1SpdccokyMjJ09dVXy2QyadGiRTr//PP1yiuvKDMzc6+fPaTaa17DMPTtt9/q2GOPbVE7ASHFALDfWLhwoZGWlmZ89tlnRmFhobF9+3Zj2bJlxlFHHWVkZGQY27dv9297/vnnGyeddJJRU1PjX+bz+YwpU6YYxx9/vH/ZKaecYlx66aXNnnfOnDlGWlqa//G6deuMtLQ04+6776633Z///GcjLS3NmDNnjn/ZzTffbBx77LF7PaZhGIbT6Wyw3UUXXWSMHTu23rKpU6caU6dO9T++4oorjIkTJzb7HBrz6quvGmlpacb69evrLZ8wYYJx3nnn+R8H0kaN+fzzz420tDTjjTfeMAoLC42dO3caK1asMI499lgjPT3d+OGHHwzD+KMt/vznP9fbPzc31xg4cKDxxBNP1Fu+fv16Y9CgQf7lLpfLGD58uHHqqafW6+/XXnvNSEtLq9dWW7duNdLS0oyFCxf6l5177rnG0KFDjby8vHrn8fl8/p+fffZZIy0tzdi6dWu7x9gYt9ttpKenG/fff3+z21166aX1Xm9vvvmmMWDAAOOrr76qt92CBQuMtLQ045tvvjEMwzDmz59vpKWlGYWFhU0e+4cffmjQds359NNPjYEDBxoDBw40pkyZYjz44IPGJ598YrhcrnrbBdqGjT2/Pb3zzjtGWlqa8f333wcUIwAA7aHumrXuWqcxhx12mHHaaaf5H+95bbivf5unTp1qpKWlGQsWLGh03e7XHnXXbEcffbRRXl7uX75kyRIjLS3NeP755/3Ljj32WOPmm2/e6zGbi23P6+P//e9/RlpamvH444/X2+6aa64x0tPTjc2bN/uXpaWlGYcccki9ZXXX5i+++GKDc+3uueeeM9LS0oy33nrLv8zlchlTpkwxhgwZUu+5H3vssQFf/x577LHGRRddZBQWFhqFhYXG+vXrjRtvvNFIS0szZs2a5d/uq6++MtLS0oy333673v4ff/xxveV17dHc68cwjAafO6688kpj8ODB9a5pN27caAwcOLDea6ux6+GmjtnY55Nvv/3WSEtLMxYvXuxfVvca+vzzzw3DMIyffvrJSEtLM5YuXdrsc2jM2WefbUyaNKnZbfa8Ng/0ejLQuIYMGdLo67wxBQUFxlFHHWWkpaUZJ5xwgnHnnXca77zzjlFWVlZvO5/PZxx//PHGRRddVO9zhtPpNMaMGWNceOGFTT6/Pe3cudNIS0sznn766YBiBEIV5RGA/dAFF1yg4cOHa/To0ZoxY4aio6P1xBNPqHv37pJqRxV8/vnnOvHEE1VRUaGioiIVFRWpuLhYo0aNUk5Ojnbu3CmpdnTuhg0blJOTE/D5P/roI0lqcFvZ+eefv0/Pa/cRDOXl5SoqKtKRRx6prVu3NnsbUVxcnHbs2KEffvihRec77rjjZLVatWTJEv+yX375RRs3bqxXG7g1bbS72267TcOHD9fRRx+tSy+9VE6nU/fff3+9Gm9S7URSu/vf//4nn8+nE0880d+HRUVF6tq1qw4++GB98cUXkqS1a9eqsLBQZ511Vr0abZMmTWr2W3ypdqbXr776StnZ2erRo0e9dSaTaa/PrSNilKTS0lIZhtHiSdCWLVumfv36qW/fvvXiqytRURdf3XGXL18un8/XonM0ZeTIkXr11Vc1ZswY/fzzz3r22Wc1ffp0HXPMMfVKGATahoGoex7FxcVt8hwAAGgvnTp1qjex0p7a4m9zRESEJk+eHPD2p512Wr07VU444QR169bNf+3bXj7++GNZLJYG19YXXXSRDMNoUPpgxIgR9UY+DhgwQHa7vUGptMbO061bN5100kn+ZTabTdOmTVNVVZW++uqrVj+HTz/9VMOHD9fw4cN18skn+2/Tv+mmm/zbLFu2TLGxsRo5cmS9a55DDjlEnTp18l/z1F0brlixQm63O6Dze71effrppxo3bly9a9p+/fpp1KhRrX5eu38+cbvdKi4uVq9evRQXF6effvqpyf3qXkeffvqpnE5ni85ZUlLSYITy3gR6PbkvcTWla9eueuutt3TWWWeprKxMr776qq6//noNHz5cjz32mP8OwnXr1iknJ0cnn3yyiouL/TFWVVVp+PDh+uqrrwL+Xa9rH655Ee4ojwDsh+6880716dNH5eXlWrhwob766qt6ibAtW7bIMAz985//1D//+c9Gj1FYWKiDDjpIM2bM0JVXXqnx48crLS1No0aN0qmnnlpvNt895eXlyWw2N7hNpm/fvvv0vL755hs9+uij+u677xpcRJSXlzeZ3Lvkkkv02Wef6YwzztDBBx+skSNH6qSTTvLfitaU+Ph4HXXUUVq6dKmuvfZaSbWlEaxWq798hKRWtdHurrrqKh1++OEym83q0qWL+vXr1+hEG3tOIpCTkyPDMHT88cc3ety6Y2zbtk2S/LPL1rHZbOrZs2ezsdVd3O/t9v2mdESMuzNaONPy5s2b9euvv2r48OGNrq+bEGzChAn697//rdtvv13/93//p+HDh+u4447TCSecILO59d9/ZmZmau7cuXK5XPr555/1/vvv67nnntPMmTP15ptvKjU1NeA2DERL2wcAgGCpqqpq9rb1tvjbfNBBB7Vo0rE9r1NMJpMOPvhgfymy9pKXl6fExMQGpY369evnX7+7xspKORwOlZWV7fU8Bx98cIP2qztP3fVaaxx66KG69tpr5fV6tWHDBj3xxBMqKyurNwnV5s2bVV5evtfrsiOPPFLjx4/X3Llz9dxzz+nII4/UuHHjdPLJJzfZn0VFRaqurm7Qh5LUp0+fVifeq6ur9dRTT2nRokXauXNnvWut5gaV9OzZUxdeeKHmz5+vd955R4cffrjGjBmjU045JaABCy29pgv0enJf42pKYmKiZs2apbvvvls5OTn69NNP9cwzz2jOnDlKTEzUGWec4R8Ac/PNNzd5nPLy8oAS1nXtE8ggEyCUkbQF9kOZmZn+UZrjxo3TOeeco+uvv17Lli1TTEyM/xvKiy66SEcffXSjx6hLuB5xxBH63//+p+XLl2vlypV644039Pzzz2vWrFk644wz9jnWpv6Qer3eeo+3bNmiCy64QH379tUtt9yipKQk2Ww2ffTRR3ruueea/da1X79+WrZsmVasWKFPPvlE//3vf/XKK6/oqquu0owZM5qNb+LEibr11lu1bt06DRw4UEuXLtVRRx1Vr2bSvrZRWlpaQBMJ7Fmk3+fzyWQy6ZlnnpHFYmmwfadOnfZ6zPbWUTE6HA6ZTKa9fhhpLL60tLQGE1fUqRudHhUVpZdffllffPGF/3W0ZMkSvfbaa/rXv/7V6HNriYiICGVmZiozM1O9e/fWrbfeqmXLlunqq69u0zasa5/m6tkBABBsO3bsUHl5ebN1Mtvib3NL6tDuK6/Xu8/XC4Fq6jzB/PK2S5cu/uvdo48+Wn379tVll12mF154wV8X1+fzKSEhQQ899FCjx6i7/jaZTJozZ46+++47ffjhh/rkk0902223af78+Xrttdca1PRvqUA/n0jS3/72N3/N1SFDhig2NlYmk6neHBRNueWWWzRp0iT/Z4h77rlHTz31lF5//XX/NWhjOnfu3Kpr3kCvJ1sbVyBMJpP69OmjPn366E9/+pOOP/54vf322zrjjDP87XXTTTdp4MCBje4f6HVv3cR1XPMi3JG0BfZzFotFf/7zn3Xeeefp5Zdf1qWXXuofuWiz2QJKFnbu3FnZ2dnKzs5WZWWlpk6dqkcffbTJhGRycrJ8Pp+2bNlSb3Ttpk2bGmwbFxfX6EXHnt/kf/DBB3K5XHriiSfq3dIU6K3hnTp10oQJEzRhwgS5XC5dc801evLJJ3XZZZc1SIbubty4cbrzzjv9JRJycnJ02WWXNdiupW3UFnr16iXDMJSSkqI+ffo0uV1de23evLneyAW3263c3NxmRwTXvVZ++eWXZmNp6uK2I2KUakcH9OrVq8UzF/fq1Us///yzhg8fvtdv4s1ms/+2vltvvVVPPvmkHn74YX3xxRcaMWJEm32Tn5GRIUnKz8/3xxhIG0p7H02Qm5srs9m81+MAABBMb731liTt9bb1jvrbXGfz5s31HhuGoc2bNys9Pd2/rKkRrdu2bat391BLYktOTtaqVasaTCRad23d0gmpmjvP+vXr5fP56o22rTvPnqWy9sWf/vQnHXnkkXryySc1ZcoUderUSb169dKqVauUlZUVUEJ9yJAhGjJkiK677jq98847uuGGG7RkyZJGr7/j4+MVFRXVoA8l6bfffqv3uG4k55792NhI4/fee0+nnXaabrnlFv+ympqaZkfZ7i49PV3p6em68sortXr1ap199tlasGCBrrvuuib36du3r/773/8GdPw6LbmebG1cLdWzZ0/FxcWpoKDA/1iqLdGwt8+ogVzzSn+MEgfCFTVtgQPAsGHDlJmZqeeff141NTVKSEjQkUceqddee82fGNpdUVGR/+c96wDFxMSoV69ecrlcTZ7vmGOOkSS9+OKL9ZY///zzDbbt1auXysvL9fPPP/uX5efnN5j9te4b4T1vOVq4cGGTcTT1HCIiItSvXz8ZhrHXOlhxcXEaNWqUli5dqnfffVc2m03jxo1r9viBtFFbOP7442WxWDR37twG3+QbhuGPKyMjQ/Hx8Xr11VfrxbR48eK9fksfHx+vI444QgsXLmxwobr7Oetmxt3zArUjYqwzZMgQrV27NqBt65x44onauXOnXn/99QbrqqurVVVVJam2dtie6kYA1MVb1waBxvv55583OgKj7va8ui88Am3Duhia+5Dw448/KjU1dZ9ubwMAoD2tWrVKjz/+uFJSUnTKKac0uV17/G3emzfffFMVFRX+x8uWLVNBQYH/2leqTTx9//339a5nPvzwQ23fvr3esVoS2zHHHCOv16uXX3653vLnnntOJpOp3vn3xTHHHKOCgoJ68zl4PB69+OKL6tSpk4444og2OU+diy++WCUlJf7rsBNPPFFer1ePP/54g209Ho+/rermMtjdnn2/J4vFolGjRun999+vd03766+/6tNPP623rd1uV5cuXfT111/XW/7KK680etw9vfjii42Oyt1dRUWFPB5PvWVpaWkym817/QwxZMgQlZaW7rVG8e4CvZ4MNK5OnToF/Hv1/fff+6+pd/fDDz+opKTEn0TOyMhQr1699K9//avReta7f0Zt6rNHnR9//FEmk0lDhgwJKEYgVDHSFjhATJ8+XTNnztSiRYt09tln66677tI555yjk08+WWeeeaZ69uypXbt26bvvvtOOHTv09ttvS6otD3DkkUfqkEMOUefOnbVmzRq99957mjp1apPnGjhwoE466SS98sorKi8v19ChQ/X55583+s32hAkT9NBDD+nqq6/WtGnTVF1drQULFqhPnz768ccf/duNHDlSNptNl19+uc466yxVVlbq3//+txISEvzfzjb33Lt27aqsrCwlJCRo06ZNeumllzR69OgGtcEaM2HCBN1444165ZVXNGrUqAaTXbWmjdpCr169dO211+r//u//lJeXp3HjxikmJka5ubl6//33deaZZ2r69Omy2Wy69tprdeedd+r888/XhAkTlJubq0WLFgVUL/b222/X2WefrUmTJmnKlClKSUlRXl6eVqxY4R8Jc8ghh0iSHn74YU2YMEE2m03HHntsh8UoSWPHjtVbb72l3377LeCRpKeeeqqWLl2qu+66S1988YWysrLk9Xq1adMmLVu2TM8++6wGDx6sxx57TF9//bVGjx6t5ORkFRYW6pVXXlH37t39tZHrJp149dVXFRMTo06dOikzM7PJ+O+55x45nU4dd9xx6tu3r9xut1avXq2lS5cqOTnZPzFKoG1Y1w9LlizR7NmzNXjwYHXq1EljxoyRVDtq+auvvtLZZ58dUNsAANDePv74Y23atEler1e7du3SF198oZUrV6pHjx564oknmr0bqj3+Nu+Nw+HQOeeco8mTJ6uwsFDPP/+8Dj74YJ155pn+bc444wy99957uvjii3XiiSdqy5YteueddxqUemhJbGPGjNGwYcP08MMPKy8vT+np6Vq5cqWWL1+u888/v9kyEi0xZcoUvfbaa7rlllv0448/Kjk5We+9955Wr16t2267LaDr5pYYPXq00tLS9Nxzz+ncc8/VkUceqSlTpuipp57SunXr/Nf/OTk5WrZsmf7yl7/ohBNO0OLFi7VgwQKNGzdOvXr1UmVlpV5//XXZ7fZmE9jXXHONPvnkE5177rk6++yz5fV69dJLLyk1NVXr16+vt+0ZZ5yhp59+Wn/5y1+UkZGhr7/+usGIXKl2xPBbb70lu92u1NRUfffdd/rss8/UuXPnZp/7559/rr/+9a864YQT1Lt3b3m9Xr311luyWCwaP358s/v+6U9/ktVq1WeffaYpU6Y0u22dQK8nA43rkEMO0apVqzR//nwlJiYqJSVFhx56aKPnfuutt/TOO+9o3LhxysjIkM1m06+//qqFCxcqMjJSl19+uaTakfP33HOPLrnkEp100kmaPHmyDjroIO3cuVNffPGF7Ha7nnzySf/5pYafPerKJ3z22WfKysqiPALCHklb4ABx/PHH+7+5PPPMM5WamqqFCxdq7ty5Wrx4sUpKShQfH69Bgwbpqquu8u83bdo0ffDBB1q5cqVcLpd69Oiha6+91p8kasp9992nLl266J133tHy5cs1bNgwPf300xo9enS97bp06aK5c+fq/vvv19///nelpKToz3/+szZv3lwvadu3b1/NmTNHjzzyiB544AF17dpVZ599tuLj43Xbbbc1G8uUKVP0zjvvaP78+aqqqlL37t01bdo0XXnllQG13ZgxYxQVFaXKykpNmDChwfrWtlFbuPTSS9W7d28999xzeuyxxyTV1mEdOXKkP1kn1baB1+vVvHnz9OCDDyotLU1PPPFEkxPR7W7AgAF6/fXX9c9//lMLFixQTU2NevTooRNPPNG/TWZmpmbOnKlXX31Vn3zyiXw+n5YvX65OnTp1SIySdOyxx6pLly5aunRpwH1rNpv12GOP6bnnntNbb72l//3vf4qOjlZKSoqmTZvmT/6OGTNGeXl5WrhwoYqLi9WlSxcdeeSRuuaaa/yjVm02m+6//3794x//0N133y2Px6PZs2c3+cHwpptu0rJly/TRRx/ptddek9vtVo8ePXTOOefoiiuuqPflQKBteM4552jdunVatGiRnnvuOSUnJ/vXr1q1SiUlJZo0aVJAbQMAQHubM2eOpNq/oZ07d1ZaWppuu+02TZ48ea8Jwvb427w3l19+udavX6+nn35alZWVGj58uO666y7/qD+ptl7rLbfcovnz5+u+++5TRkaGnnzyST3wwAP1jtWS2Mxms5544gnNmTNHS5Ys0aJFi5ScnKybbrpJF110UaueS2OioqL04osv6qGHHtLixYtVUVGhPn36aPbs2f4vk9vaRRddpFtuuUXvvPOOJk+erL/+9a/KyMjQq6++qocfflgWi0XJyck65ZRTlJWVJal2IrI1a9ZoyZIl2rVrl2JjY5WZmamHHnqo2b4dMGCA5s2bp9mzZ2vOnDnq3r27rrnmGhUUFDRI2l511VUqKirSe++9p6VLl+qYY47Rs88+22CStL/85S8ym8165513VFNTo6ysLM2fP18XX3xxs887PT1do0aN0ocffqidO3cqOjpa6enpeuaZZ/Y6OrRr16465phjtHTp0oCTtlJg15OBxnXLLbfozjvv1COPPKLq6mpNmjSpyaTtlClTFBUVpc8//1wffPCBKioq1KVLF40cOVKXXXaZBg0a5N922LBheu211/T444/rpZdeUlVVlbp166bMzMx6z7W5zx7l5eX69NNPdddddwXcNkCoMhlMJQ0A2E889thjWrRokf773/922GQf4eLKK6+UyWTyX6QDAAAgPH399deaNm2ali5dqt69ewc7nJDy3HPP6dlnn9X777/foZMNAu2BmrYAgP3GBRdcoKqqKr377rvBDiWk/Prrr1qxYoVmzpwZ7FAAAACwjw4//HCNHDlSzz77bLBDCSlut1vPPfecrrjiChK22C8w0hYAAAAAAAAAQggjbQEAAAAAAAAghJC0BQAAAAAAAIAQQtIWAAAAAAAAAEIISVsAAAAAAAAACCHWYAcQanw+nzwej8xms0wmU7DDAQAAwO8Mw5DP55PVapXZzNiD5nBNCwAAEJoCvaYlabsHj8ejNWvWBDsMAAAANGHw4MGKiIgIdhghjWtaAACA0La3a1qStnuoy3APHjxYFoslyNHsfwzDUFlZmeLi4hj10QFo745Hm3cs2rtj0d4di/ZuyOv1as2aNYyyDUCoX9Py+g5P9Fv4ou/CE/0Wvui78NRR/RboNS1J2z3UdYrFYgnJC9xwZxiGzGazLBYLb1wdgPbueLR5x6K9Oxbt3bFo76bRHnsX6te0vL7DE/0Wvui78ES/hS/6Ljx1dL/t7RwMUwAAAAAAAACAEELSFgAAAAAAAABCCElbAAAAAAAAAAghJG0BAAAAAAAAIISQtAUAAAAAAACAEELSFgAA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xx9XTEyMv05tbGysoqKiFBsbq+zsbN1///1yOByy2+265557NHToUJK2baR3QoxSE+1ak1uq1Eh7vdEuhmFoe6lTmSmd1TshJohRhi/aFwAAAAAAAFIYJW0XLFggSZo2bVq95bNnz9bkyZMlSbfddpvMZrNmzJghl8ulUaNG6a677urwWPdXZrNJ2Vkpyit2amN+hZIc0YqOsMjp8mp7qVPxMRGanJUss5lbF1uD9gUAAAAAAIAURknb9evX73WbyMhI3XXXXSRq21FGskMzxvbXwtW52phfoZ1lPkXazMpM6azJWcnKSHYEO8SwRvsCAAAAAAAgbJK2CB0ZyQ4NSopTTmGlyqs9io2yqndCDCNA2wjtCwBA+Pjqq680b948rV27VgUFBXrsscc0btw4//pbbrlFixcvrrfPqFGjNG/evGaP+/LLL2vevHkqKCjQgAEDdMcddygzM7NdngMAAABCD0lbtIrZbFLfbvZgh7Hfon0BAAgPVVVVSk9PV3Z2tq6++upGtzn66KM1e/Zs/+OIiIhmj7lkyRLNnj1bs2bN0qGHHqrnn39e06dP17Jly5SQkNCm8QMAACA0kbQFAAAAWmn06NEaPXp0s9tERESoW7duAR9z/vz5OvPMM5WdnS2pdkLeFStWaOHChbr00kv3KV4AAACEB3OwAwAAAAD2Z19++aWGDx+u8ePH66677lJxcXGT27pcLv34448aMWKEf5nZbNaIESP07bffdkS4AAAACAGMtAUAAADaydFHH63jjjtOKSkp2rp1q/7xj3/okksu0WuvvSaLxdJg++LiYnm93gZlEBISErRp06YWn98wDBmG0er420tdXKEYG5pGv4UuwzCk2n9qvHcM/38N7ftcGcbv/8froX3xOxe+6Lvw1FH9FujxSdoCAAAA7WTixIn+n9PT05Wenq5x48b5R9+2t7KyMpnNoXdznWEYqqqqkiSZTEy2Gi7ot9BVXl4ur9crr9stj9vd6DZer7fNzud1u+X1elVeXq7S0tI2Oy7q43cufNF34amj+s3n8wW0HUlbAAAAoIP07NlTXbp00ebNmxtN2nbp0kUWi0WFhYX1lhcWFqpr164tPl9cXFyjI3qDrW6EicPh4MNsGKHfQldsbKwsFossNpusNlsjW9T2ndVmldpgpK3FZpPFYlFsbKwcDsc+Hw+N43cufNF34amj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f/nll7VhwwZ98MEHNb4nJSVF06ZN06233upetnjxYs2ePVvr1q2rU730aQEAAPzbufq0jLT9maCgIHXu3Flms5lRLQAAAH6kavRxUFDgdGGbNGkii8VS46FjBQUFNUbTVomLi6sxqvZs5WtDnxYAAMA/1bVPGzg9Xi8xm80BM3IDAAAA/i04OFidOnXS+vXr1a9fP0mnphJYv369hgwZUuv3dO3aVf/+97/1wAMPuJetW7dOXbt2rXO99GkBAAACGw8iAwAAADzowQcf1NKlS7VixQrt3btXEydOVEVFhQYOHChJGjdunP7whz+4yw8bNkz//Oc/NW/ePO3du1ezZs3Stm3bzpjkBQAAQMPDSFsAAADAg2655RYVFhZq5syZysvLU4cOHfTWW2+5pzs4cuSIzOafxlJ069ZN06dP14wZM/Tqq6+qVatWmj17tpKSkny1CwAAAPAyHkQGAAAAAAAAAH6E6REAAAAAAAAAwI+QtAUAAAAAAAAAP0LSFgAAAAAAAAD8CElbAAAAAAAAAPAjJG3hEXPmzNGgQYOUlpamHj166NFHH9W+ffuqlamsrNSkSZPUvXt3paWl6YknnlB+fr6PIg5s7777rgYMGKBu3bqpW7duuueee/T111+719PWnvXnP/9ZycnJevHFF93LaPP6M2vWLCUnJ1f7279/f/d62rr+HT16VGPHjlX37t2VmpqqAQMGaOvWre71hmHo9ddfV3p6ulJTU/XAAw8oOzvbdwEHsD59+tQ4v5OTkzVp0iRJnN9oeHJzczVhwgT16dNHqamp6tevn2bOnCmbzVat3A8//KD7779fnTt3Vq9evTR37lwfRYwqb775pu6991516dJFV199da1lDh8+rIcfflhdunRRjx499NJLL8nhcHg5Uvzc4sWL1adPH3Xu3Fl33XWXtmzZ4uuQ8DMbNmzQb37zG6Wnpys5OVlr1qyptp6+l38i7xG4AiWHQtIWHvHtt99q8ODBWrp0qebPny+Hw6ERI0aovLzcXWbq1Kn68ssvNWPGDC1cuFDHjh3T448/7sOoA9dll12msWPHavny5Vq2bJmuu+46PfbYY9q9e7ck2tqTtmzZoiVLlig5Obnactq8frVr105r1651/3333Xfd62jr+lVUVKT77rtPVqtVc+fO1cqVKzV+/HhFR0e7y8ydO1cLFy7UxIkTtXTp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rwMAgPNx/fXXKysrSzabTV9//bUyMzNltVr1yCOP1Chrs9kUHBxcL/U2bty4XrYDAAAABKqqvrjD4dD27ds1fvx4mUwmPf300xe1XYvFovj4+HqKEgAaBkbaAggowcHBio+PV0JCgu6//3717NlTf//73yX9NOrzzTffVHp6uvr37y9JOnLkiJ588kldffXVuvbaa/Xb3/5Wubm57m06nU5lZWXp6quvVvfu3fXyyy/LMIxq9f58egSbzaZXXnlFvXr1co/6/eCDD5Sbm6thw4ZJkq655holJyfrmWeekSS5XC7NmTNHffr0UWpqqm677TatXr26Wj1ff/21brrpJqWmpmro0KE6dOhQvbbfBx98oJtvvlmdO3dW//79tXjx4mrrX3nlFd10003q0qWL+vbtqxkzZshut9e6rVmzZmnFihX64osv3KMuvvnmG/f6gwcPaujQoerSpYtuu+02bdq06bxiTU5O1gcffKDHHntMXbp00Y033qgvvviiWpm6tNd3332n+++/X6mpqerVq5emTJmi8vJySdJHH32ktLQ0ZWdnu8tPnDhR/fv3V0VFxXnFCwAA0NBV9cWbN2+ufv36qWfPnlq3bp2kc/d1i4qKNGbMGF133XVKTU3VjTfeqGXLlkmqfXqEc/Xzarur7C9/+Yv69Onjfr1lyxY9+OCD6t69u6666ioNGTJE27dvP+P+2Ww2ZWZmKj09XZ07d1bv3r01Z86cC28wALgIjLQFENBCQkJ04sQJ9+v169crIiJC8+fPlyTZ7XaNGDFCXbt21eLFixUUFKQ//vGPGjlypD7++GMFBwdr3rx5WrFihaZOnao2bdpo3rx5+vzzz3Xdddedsd5x48Zp8+bN+v3vf6/27dsrNzdXx48fV/PmzTVr1iw98cQTWr16tSIiIhQaGipJmjNnjj7++GNNmjRJrVq10oYNG/T0008rJiZG1157rY4cOaLHH39cgwcP1t13361t27bppZdeqre2+vjjj/X666/r//2//6cOHTpox44dev7559WoUSNlZGRIksLDw5WVlaWmTZtq165dev755xUeHq6HHnqoxvaGDx+uvXv3qrS0VFlZWZKk6OhoHTt2TJL02muvafz48WrZsqVee+01jRkzRn/7298UFFT3j5433nhDTz/9tMaNG6eFCxdq7Nix+vLLL9W4ceM6tdeBAwf00EMP6cknn9TUqVNVWFioyZMna/LkycrKytIdd9yhL7/8UmPHjtWSJUu0du1affjhh1qyZInCwsIutKkBAAAavF27dmnTpk1q0aKFpHP3dV9//XXt3btXc+fOVZMmTXTgwAGdPHmy1m3XV7+4rKxMd9xxh37/+99LkubNm6eHH35Yf/3rXxUREVGj/MKFC/X3v/9dM2bMUPPmzXXkyBH9+OOP510vANQHkrYAApJhGFq/fr3Wrl2rIUOGuJc3atRIU6ZMcU+L8L//+79yuVx68cUXZTKZJElZWVm65ppr9O233yo9PV3vvPOOHn74Yd14442SpEmTJmnt2rVnrHv//v367LPPNH/+fPXs2VOSdPnll7vXR0dHS5JiY2MVFRUl6dRv7efMmaP58+crLS3N/T3/93//p/fff1/XXnut3nvvPV1xxRXukblXXnmldu3apblz556zPaZPn67XX3+92jK73a42bdq4X8+aNUvPPPOMez8vv/xy7dmzR++//747aXv6/LSJiYnav3+/Vq5cWWvSNjw8XKGhobLZbLXezjZ8+HD98pe/lCSNGjVK//M//6OcnJxqMZ1LRkaGbr31VknS6NGjtXDhQm3ZskU33HBDndprzpw5GjBggB544AFJUqtWrfTcc89p6NChmjhxokJCQpSZmanbbrtNU6ZM0eeff67HH39cKSkpdY4RAADgUvHVV18pLS1NDodDNptNZrNZzz//fJ36uocPH1aHDh3UuXNnSaf6mmdyMf3i0/Xo0aPa68mTJ+vqq6/Whg0b1Lt37xrljxw5opYtW+qqq66SyWRSQkLCedUHAPWJpC2AgFLVUbTb7TIMQ7feequeeOIJ9/qkpKRq89j+8MMPOnDggLp161ZtO5WVlTpw4IBKSkqUl5enLl26uNcFBQUpJSWlxhQJVXbs2CGLxaJrrrmmznHn5OSooqJCw4cPr7bcbrerQ4cOkqS9e/cqNTW12vquXbvWafsjRozQwIEDqy1buHChNmzYIEkqLy/XgQMH9Nxzz+n55593l3E4HIqMjHS/XrVqlRYsWKCDBw+qvLxcDoej1lEIdZGcnOz+uiqpW1hYeF5J29O30ahRI0VERKiwsFBS3drrhx9+0M6dO/XJJ5+4lxmGIZfLpdzcXLVp00bR0dF68cUXNWLECKWlpenhhx+uc3wAAACXku7du2vixImq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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Residuals (Test Set):\n", + " Mean: 0.6886\n", + " Std Dev: 9.7514\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAxVJJREFUeJzs3XmcTvX///HnNRvDSPZkbB+aBTNEki3RJHuWENmXJCF7CeEnsoaIrFlD2coWI9kpJWQNEdlnhlmZMfP+/eE7VzOhawzOxczjfru51ZzrXOe8zmvOdV3nes4572MzxhgBAAAAAAAAFnJxdgEAAAAAAABIfwilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAABIp95//31Vq1bN2WUAAAAgnSKUAgDgIVu2bJl8fX3t/4oVK6bKlSvr/fff18WLF51d3iPj331K+m/MmDHOLu+Opk6dquDg4BTNe/bs2btuX5MmTR5KfRcvXtRnn32mw4cPP5Tl34/EfsycOdPZpaTa5s2b9dlnnzm7DAAAHltuzi4AAID0olu3bvL29lZsbKx+++03LV++XL/88otWrVqlDBkyOLu8R0Zin5Ly8fFxUjX/7YsvvtCrr76qoKCgFD+nTp06evHFF5NNy549+4MuTZJ06dIlTZo0Sfny5ZO/v/9DWUd6tnnzZi1YsEBdu3Z1dikAADyWCKUAALDIiy++qICAAElS48aNlS1bNk2fPl0bN25UrVq1nFzdoyNpnx6k6OhoZcqU6YEv914VK1ZMr732mrPLuC83btyQu7u7XFzS50n3j8q+BADA4y59HkkAAPAIeO655yRJZ86csU+LjY3VhAkT1LBhQ5UpU0alSpVS8+bNtWvXrmTPTXrp0+LFixUUFKQSJUqoUaNG2r9//23rCg4OVp06dRQQEKA6depow4YNd6wpOjpan3zyiapUqaISJUro1Vdf1cyZM2WMSTafr6+vhg4dqrVr16pWrVoKDAxU06ZNdfToUUnSokWL9MorryggIEAtW7bU2bNn76tXSe3cuVPNmzdXqVKl9Nxzz6lz5846ceJEsnk+++wz+fr66vjx4+rVq5fKli2r5s2b2x9fuXKlGjZsqMDAQD3//PPq0aOHzp8/n2wZp06dUteuXVWxYkUFBAToxRdfVI8ePRQREWHvQXR0tJYvX26/DO/999+/7+07ceKEunXrpueff14BAQFq2LChNm7cmGyeq1evauTIkapbt66effZZlS5dWh06dNCRI0fs8+zevVuvv/66JOmDDz6w17hs2TJJUrVq1e5Yb8uWLdWyZctky/H19dXq1av16aefqnLlyipZsqQiIyMlSfv27VP79u1VpkwZlSxZUi1atNAvv/ySqm1PvIRzz549GjZsmF544QU999xzGjRokGJjYxUeHq6+ffuqbNmyKlu2rEaNGpVs30z6uvjyyy9VtWpVBQYGqkWLFjp27Nht67uffen999/XggULJCnZpZiJZs6cqTfeeEPlypVTYGCgGjZsqHXr1t1WQ+JrKfE1WqJECdWuXVtbtmy5bd6LFy+qf//+qlSpkkqUKKFq1arpo48+UmxsrH2e8PBwffzxx/bX8CuvvKJp06YpISEh2bJWr16thg0b2vefunXras6cOSn8TQEA8GBwphQAAE7y999/S5KeeOIJ+7TIyEh9/fXXqlOnjho3bqyoqCh988036tChg77++uvbLsFatWqVoqKi1LRpU9lsNs2YMUNdu3ZVcHCw3N3dJUnbtm1T165dVbRoUfXq1UthYWH64IMP9NRTTyVbljFGnTt3tocZ/v7+2rp1q0aNGmX/MpzUnj179MMPP9jDnmnTpuntt99Whw4dtHDhQjVv3lzXrl3TjBkz1L9/f82dOzdFfYmMjFRoaGiyaYmXt+3YsUMdO3aUt7e33n33XV2/fl3z589Xs2bNtGzZstsu++vevbsKFiyoHj162MOLKVOmaMKECapZs6Zef/11hYaGav78+XrzzTe1YsUKPfHEE4qNjVX79u0VGxurFi1aKGfOnLp48aJ+/PFHhYeHK0uWLBo1apQGDBigwMBA+5hQBQoUcLh9MTExt21flixZ5O7urj/++EPNmjVTnjx51LFjR2XKlElr165Vly5d9Nlnn+mVV16RdCvIDA4OVo0aNeTt7a0rV65o8eLFatGihVavXq08efKoSJEi6tatmyZOnKimTZuqTJkykqTSpUun6Pfwb59//rnc3d3tfXF3d9fOnTvVsWNHlShRQu+++65sNpuWLVum1q1ba+HChQoMDEzVuoYNG6acOXOqa9eu2rdvnxYvXqwsWbJo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df36db377rvKkiWLRowYoUKFCmnz5s2aNGmS/P397WdypGVJ96GJEydq4cKFqlixoi5evKjDhw9r5MiRCgoK0h9//KFhw4YpJCREWbNmlbe3t4YNGyZ3d/d08YeExNeJozvs/vXXX+rSpYtKlCihVatW6auvvrL/gSo9Wb9+vYYPHy53d3d5eXnp3Xff1csvv6w//vhDrVu3Vu7cueXi4qLcuXNr3759mjlzZrr83uZshFKwGz9+vPbu3ZvsbjGnT59W06ZNFRAQoP79+6tw4cI6dOiQcufObT/7JT05cOCAOnbsqDfeeEPu7u765ptvVKxYMXXu3Fn+/v7auXOnvv32W0VGRqpgwYJq3LjxbV900qqkBxMrVqzQuHHj1LNnT507d05ff/21ypQpo3feeUfe3t765ZdftGLFCmXOnFlPPfWU2rVrJzc3t3RxMJFo9OjRWrlypRo0aKBr167p+++/12uvvab+/fvrzJkzWrRokTZt2qQ6deronXfecXa5j5SkX1zOnz+vffv22cfcSo+3hN6xY4eGDBmiWbNmKV++fLd9OTx48KC2b9+up556SvXq1VORIkWcXLG1jhw5ou7duyskJESLFy9OdmOFa9euqUWLFgoPD9eCBQvk7e3t7HItcenSJa1fv15Nmza1v2ZWrlyp0NBQbdu2TR4eHurevbv8/Pzs4dy/g4OOHTuqRIkS6t69u5O3xhqbNm3S4MGD9fnnn6t48eL65Zdf9Oabb2rMmDGqU6eOpFsDevfp00clS5a0X8afHiR9Tx43bpw2bdqky5cvy8fHR7ly5dKQIUPk4eGhyZMna/r06Ro9erRq165912WkRf/evo8//liXL1/W+PHj7a+xsLAwNWrUSKVLl9aYMWMkSfv27VNAQECaP/MnqbNnz2rFihWqVKmSSpUqpfPnz2vatGn66quvNHnyZL388su6ceOGrl+/Ljc3N2XOnFmS0tUx5I4dO9SpUyf16dNH2bJlU2hoqEaNGqVGjRqpf//+ypgxo06cOKHatWsra9as6e4P5EmvQGjUqJHeffddeXp66tdff7UHwjVq1FBoaKhWrlypS5cuqVChQipfvrwKFCjg7PLTJ4N0LyEhwRhjzNChQ03Tpk3t069fv26MMWbFihXG19fXtGzZ0vz1119OqfFR8Ndff5kZM2aYyZMn26f99ttvpkGDBqZz585m7969zivuEfLbb7+ZTz75xKxcudI+7ccffzS1a9c2PXv2NIcPH77j827evGlViU63fft2U7VqVXPw4EFjzK2e+fr6mu+++84+z7lz58zAgQNNjx497K/RtGzq1Klm3759KZ7/bj2JjY19UCU9NjZs2GCqVKlizp49a4wxJj4+3v562rVrlzlz5owzy7NUfHz8HacfO3bMVKpUybRr186EhoYaY/7Zh0JDQ02vXr3SzXtQVFSUMeaf18r8+fPNlClT7I+vXLnStGrVyrz99tvmyJEj9unbtm0zMTEx9p+bNm1qhg8fblHVzvfNN9+Y7t27G2OMWb16tSlVqpRZuHChMcaYa9eumXPnzhljbr13320/TOtmzpxpXnjhBbN7925jjDEDBgwwJUuWND///LMx5ta+N27cOOPr62u2bdvmzFKd5sqVK8YYY9577z3Trl07+/TEY+41a9aYSpUqmb///jvZ89LLPrVhwwbj6+trqlevbo4fP26ffvnyZTN48GDj7+9vNm7ceNvz0sNxkjH/bOdHH31kevbsmeyxXbt2GT8/PzNr1ixjjDE3btwwPXr0MMeOHbO8zkfBzp07zYIFC8zo0aPt065cuWKGDRtmfH19zerVq40x6ee19ahLP7E77MwdBqGWpKCgIB08eFArVqyQJGXIkEGSlClTJpUrV07nz59PV3+pSWSMUUhIiN58801NmjRJV69etT9WsmRJDRo0SOfPn9fs2bO1devWZM9Lb44cOaKWLVtq/vz5unbtmn16lSpV1KdPHx07dkyzZ8/Wnj17bntuWr5M5t9iYmKUP39+FStWTKtWrVLbtm01aNAg1alTR5GRkfr999+VN29evfvuu/YxW9Ly/rR3716tWbNGU6dO1eHDh1P0nH//RT2xP+nxTClfX1+FhYVpyZIlkiQXFxf76yk4OFjLli1TbGysM0u0RNIzxDZv3qwFCxZo5cqVOnTokJ555hnNmDFDR48eVd++fRUWFmYfBDZbtmwaM2aM/dLQtGzMmDGqXr26IiIi5O7urqtXr+rUqVNaunSppk6dKkmqV6+eXn/9dd24cUOjRo3Sxo0b1aFDB40ZM8Z+XHD48GEdP378tvGB0rLo6Gj7GWYDBw5Unz597Dfr2LBhg8aMGaOIiAjlzZs33Q1MbYxRTEyM9uzZox49euj555/Xli1btGrVKn344Yd67rnn7LdY79Kliz766COVK1fO2WVbYsuWLfZBzD/55BPNnTtXklS/fn398ssvWrp0qaR/jrmNMfY7piWVXo6/8+XLp/r16+vvv//WlStXJN3qSc6cOdWlSxc1b95c77zzjvbu3ZvseWn5LDvpn2OclN5h98qVK/Lw8NC4ceP0zDPPOKVmZ4qJidHSpUs1dOhQHTt2zD49R44c6ty5s1q1aqW+fftq1apV6ea19ajjt5CO3Lx5U9I/two9ffq09uzZozNnzujatWsqX7683njjDU2aNEnLly+XdGvsiAMHDuiFF17Q6tWrlS9fPqfV7yw2m005cuTQ//t//09Zs2bV4cOHdeTIEfvjpUqV0uDBg3XgwAF99913un79uv15aV3ih2Tif/38/PTxxx/Ly8tLe/bs0Z9//mmfNzGY2rJli3bv3u2Uep3hTl9MwsLCFBERoR07duijjz5Sr1697GMBbd26VYsWLVJISIhy586dLsbZePbZZ9W5c2ddv35dEyZM0KFDh1L0PHOH8W7So/z582vgwIGaOXOmRo0apWPHjunEiRMaPXq0VqxYodq1a8vDw8PZZT50iQeWo0aN0pAhQ7Ru3TqtWbNG7du31+bNm+Xr66tZs2bp6NGjev/99xUaGnrbwWhaD8fLly8vb29vtWrVSuHh4XryySfVqlUr1alTRytWrNDnn38uSapbt66aNGkiDw8Pffzxx4qNjdWSJUvsr7MCBQpo/fr1aX5ssm3bttm/BL7wwgtKSEhQjx497F+OpVthVXBwsDw9PZMFCWn9i86/33/d3d0VExOjwoUL68cff1T37t3Vt29fNW7cWHFxcVq5cqV27dolDw8PNWvWzH7JfloWFhamlStX6pNPPlG3bt20YMEC1axZU5IUGBioZs2a6fPPP9dXX32l6OhoXbx4UStXrtRTTz2lLFmyOLn6h+9Ox0f+/v7q3LmzXnzxRXXt2lX79u2zHwflzJlTb731lvr166eAgAAnVOwciceA93KH3fR0I5M78fT0VPv27dW4cWPt2LEj2R/Ds2fPrrffflv169fX0KFD7WNywcmsPjULzvHVV1+ZxYsX20/bX7NmjXnhhRdMxYoVTdWqVU379u3NiRMnTEREhBk+fLgpXry4qVevnmnQoIEpXbq0OXTokJO3wFp3Ow1406ZNpkqVKubDDz+87XTYffv2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T5pixYqZBg0amHnz5pkbN24YY27dfadOnTrm4sWLzizXUklPtz59+rR57bXXzPbt240xty5tLFOmTLLL0YwxZu7cuaZz585p+jT0u5kxY4YpU6aM2b17t9m/f79Zvny5KVOmjOnbt2+ySz1PnjxpwsPD7acUp/VT0pPuCytWrDAjRowwEydOND/88IN9+qpVq0zr1q3N22+/bb98OOlln1999ZUpXbq0WbdunXWF45Hx448/mj///NMYY8yoUaPMwIEDjTHGLFy40JQtW9aULFky2XtReHi4adeunRk7dqwzyn0kHDx40FSqVMns2LHDPm3Tpk2mQYMGpn79+iY8PNwYY8yff/5pFi1alC4vs75x44Zp27at+eyzz5JNX716tSlWrJgZOXJksjsQJkpvn2/Dhw83NWrUMMOHDzddu3Y1FStWTHa3xnPnzpkpU6aYyZMnm2XLltn3pbT+2Zb0EqLRo0ebypUrm2+++cb+2tq/f7/p06ePqVOnjtmwYYMxxpi3337bfPHFF06p10rLly+331EwsU8LFy40HTp0MMbceo2VLl3aLFiwwBhza5iDxLs1nz17Nt29xpLiDrv/bf/+/eall16yf+afOnXKlC1b1vj6+poBAwbY5zty5IgZOHCgOXnypLNKxX8glErjLl68aLp162beeOMN+60vhwwZYkqVKmW+/PJL+welMcYcPnzYVKlSJd2NQZLUzZs3zcyZM82wYcOMMbfG2Xj55ZdNnz59zNtvv21/00sMpiIjI51ZrmV69Ohh/yKTeDCxb98+U6lSJWPMrS82pUqVso8hERERkewLYeJz0tNBRUJCgunUqZMZOnRosukbNmwwJUqUMH379rUfcCWV1nuU9KB91KhRpmLFiqZXr16mQ4cOpn79+mb27Nn2x1etWmXatWtn3njjDXsAYcytcYKef/55Aql06vr166Z+/fqmWrVqpl+/fqZ06dL2L8PGGNO/f39TvHhxs3nzZnPy5Elz4sQJ065dO9OgQYM0/6U40RtvvGG2bt2abNquXbtMqVKlkr2WYmNjzerVq03x4sVN8+bNTVhYWLLnpLdgKiIiwlSvXt2MHDnSPi0+Pt4kJCSY999/3/j6+ppx48bZH0sP40f9288//2wqVqxofvnlF/u0ZcuWmebNm5tOnTrZP9f+3Zv0tC99+eWXpkKFCmbv3r23hZj7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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Feature Importances (ranked):\n", + " dbds 0.3235\n", + " methane 0.2575\n", + " acetylene 0.0887\n", + " hydrogen 0.0539\n", + " interfacial_v 0.0483\n", + " co 0.0344\n", + " water_content 0.0318\n", + " dielectric_rigidity 0.0317\n", + " oxygen 0.0248\n", + " nitrogen 0.0225\n", + " power_factor 0.0225\n", + " ethylene 0.0216\n", + " co2 0.0211\n", + " ethane 0.0176\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "os.makedirs('artifacts', exist_ok=True)\n", + "\n", + "MODEL_PATH = 'artifacts/health_index_model.pkl'\n", + "SCALER_PATH = 'artifacts/health_index_scalers.pkl'\n", + "\n", + "# Save model\n", + "with open(MODEL_PATH, 'wb') as f:\n", + " pickle.dump(model, f)\n", + "print(f\"\\nModel saved to: {MODEL_PATH}\")\n", + "\n", + "# Save scaler — only scaler_X needed since RF predicts in original y scale\n", + "with open(SCALER_PATH, 'wb') as f:\n", + " pickle.dump({'scaler_X': scaler_X}, f)\n", + "print(f\"Scaler saved to: {SCALER_PATH}\")\n", + "\n", + "print(f\"\\nModel size: {os.path.getsize(MODEL_PATH) / 1024:.1f} KB\")\n", + "print(f\"Scaler size: {os.path.getsize(SCALER_PATH) / 1024:.1f} KB\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qRSt2DShmoXG", + "outputId": "f747ab63-d349-4940-c43c-8f2d36a30079" + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Model saved to: artifacts/health_index_model.pkl\n", + "Scaler saved to: artifacts/health_index_scalers.pkl\n", + "\n", + "Model size: 3323.1 KB\n", + "Scaler size: 1.0 KB\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/servers/fmsr/failure_modes.yaml b/src/servers/fmsr/failure_modes.yaml index 16712b8ee..4c02afdcc 100644 --- a/src/servers/fmsr/failure_modes.yaml +++ b/src/servers/fmsr/failure_modes.yaml @@ -13,3 +13,14 @@ ahu: - "Belts or sheaves Wear" - "Improper switch position" - "Solenoid Valves Bound due to hardened grease" + +smart grid transformer: + - "Partial Discharge in Oil" + - "Thermal Fault — Oil Overheating" + - "Thermal Fault — Core/Winding" + - "Low-Energy Arcing (Sparking)" + - "High-Energy Arcing" + - "Tap Changer Mechanical Wear" + - "Oil Contamination / Moisture Ingress" + - "Cellulose Insulation Ageing" + - "Oil Dielectric Degradation" \ No newline at end of file diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index 1638b7629..f136906ab 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -28,6 +28,18 @@ from mcp.server.fastmcp import FastMCP from pydantic import BaseModel +from .models import ( + DGAInterpretationResult, + HealthIndexResult, + WindingTemperatureResult, + LoadProfileResult, +) +from .prompt_templates import ( + _INTERPRET_DGA_PROMPT, + _ASSESS_WINDING_PROMPT, + _ASSESS_LOAD_PROMPT, +) + load_dotenv() _log_level = getattr(logging, os.environ.get("LOG_LEVEL", "WARNING").upper(), logging.WARNING) @@ -41,6 +53,9 @@ with _FAILURE_MODES_FILE.open() as _f: _ASSET_FAILURE_MODES: dict[str, list[str]] = yaml.safe_load(_f) +_ASSET_FAILURE_MODE_ALIASES = { + "transformer": "smart grid transformer", +} # ── Prompt templates ────────────────────────────────────────────────────────── @@ -72,6 +87,27 @@ def _parse_numbered_list(text: str) -> list[str]: return items +def _normalize_asset_key(asset_name: str) -> str: + """Normalize an asset name for curated failure-mode lookup.""" + normalized = re.sub(r"\d+", "", asset_name or "").strip().lower() + normalized = re.sub(r"[^a-z0-9]+", " ", normalized).strip() + return normalized + + +def _resolve_failure_mode_asset_key(asset_name: str) -> str: + """Resolve an asset name to a curated failure-mode key when possible.""" + asset_key = _normalize_asset_key(asset_name) + if asset_key in _ASSET_FAILURE_MODES: + return asset_key + if asset_key in _ASSET_FAILURE_MODE_ALIASES: + return _ASSET_FAILURE_MODE_ALIASES[asset_key] + + for known_key in _ASSET_FAILURE_MODES: + if asset_key and (asset_key in known_key or known_key in asset_key): + return known_key + return asset_key + + def _parse_relevancy(text: str) -> dict: """Parse a 3-line relevancy response into {answer, reason, temporal_behavior}.""" lines = [ln for ln in text.strip().splitlines() if ln.strip()] @@ -85,6 +121,58 @@ def _parse_relevancy(text: str) -> dict: temporal = lines[2] if (answer == "Yes" and len(lines) >= 3) else "Unknown" return {"answer": answer, "reason": reason, "temporal_behavior": temporal} +def _parse_dga_response(text: str) -> dict: + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "fault_type": result.get("Fault Type", "Unknown"), + "r1": float(result.get("R1 (CH4/H2)", 0) or 0), + "r2": float(result.get("R2 (C2H2/C2H4)", 0) or 0), + "r3": float(result.get("R3 (C2H4/C2H6)", 0) or 0), + "code": result.get("Code (R1,R2,R3)", "Unknown"), + "confidence": result.get("Confidence", "Unknown"), + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + + +def _parse_winding_response(text: str) -> dict: + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "thermal_status": result.get("Thermal Status", "Unknown"), + "hot_spot_rise_c": float(result.get("Hot-Spot Rise (C)", 0) or 0), + "ageing_rate": float(result.get("Ageing Rate", 1.0) or 1.0), + "alarm_active": result.get("Alarm Active", "No") == "Yes", + "trip_active": result.get("Trip Active", "No") == "Yes", + "risk_level": result.get("Risk Level", "Unknown"), + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + + +def _parse_load_response(text: str) -> dict: + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "load_mva": float(result.get("Load MVA", 0) or 0), + "load_factor_pct": float(result.get("Load Factor (%)", 0) or 0), + "loading_status": result.get("Loading Status", "Unknown"), + "current_imbalance_pct": float(result.get("Current Imbalance (%)", 0) or 0), + "neutral_current_flag": result.get("Neutral Current Flag", "No") == "Yes", + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + # ── LLM backend (lazy init; graceful degradation if creds are absent) ───────── @@ -131,7 +219,7 @@ def _call_asset2fm(asset_name: str) -> list[str]: last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - result = _parse_numbered_list(_llm.generate(prompt)) + result = _parse_numbered_list(_llm.generate(prompt).text) _asset2fm_cache[asset_name] = result return result except Exception as exc: @@ -147,12 +235,140 @@ def _call_relevancy(asset_name: str, failure_mode: str, sensor: str) -> dict: last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - return _parse_relevancy(_llm.generate(prompt)) + return _parse_relevancy(_llm.generate(prompt).text) + except Exception as exc: + last_exc = exc + raise last_exc + +def _call_dga( + asset_name: str, + hydrogen: float, + methane: float, + acetylene: float, + ethylene: float, + ethane: float, +) -> dict: + prompt = _INTERPRET_DGA_PROMPT.format( + asset_name=asset_name, + hydrogen=hydrogen, + methane=methane, + acetylene=acetylene, + ethylene=ethylene, + ethane=ethane, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt).text + return _parse_dga_response(raw) + except Exception as exc: + last_exc = exc + raise last_exc + +def _call_winding( + asset_name: str, wti: float, oti: float, ati: float, oti_a: int, oti_t: int +) -> dict: + prompt = _ASSESS_WINDING_PROMPT.format( + asset_name=asset_name, + wti=wti, + oti=oti, + ati=ati, + oti_a=oti_a, + oti_t=oti_t, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt).text + return _parse_winding_response(raw) + except Exception as exc: + last_exc = exc + raise last_exc + + +def _call_load( + asset_name: str, + vl1: float, + vl2: float, + vl3: float, + il1: float, + il2: float, + il3: float, + vl12: float, + vl23: float, + vl31: float, + inut: float, + rated_mva: float, +) -> dict: + prompt = _ASSESS_LOAD_PROMPT.format( + asset_name=asset_name, + vl1=vl1, + vl2=vl2, + vl3=vl3, + il1=il1, + il2=il2, + il3=il3, + vl12=vl12, + vl23=vl23, + vl31=vl31, + inut=inut, + rated_mva=rated_mva, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt).text + return _parse_load_response(raw) except Exception as exc: last_exc = exc raise last_exc +def _call_predict_health_index( + hydrogen: float, oxygen: float, nitrogen: float, + methane: float, co: float, co2: float, + ethylene: float, ethane: float, acetylene: float, + dbds: float, power_factor: float, interfacial_v: float, + dielectric_rigidity: float, water_content: float, +) -> float: + import pickle + import numpy as np + + base_path = Path(__file__).parent / "artifacts" + + with (base_path / "health_index_model.pkl").open("rb") as f: + model = pickle.load(f) + + with (base_path / "health_index_scalers.pkl").open("rb") as f: + scaler_X = pickle.load(f)["scaler_X"] + + feature_values = np.array( + [[ + hydrogen, + oxygen, + nitrogen, + methane, + co, + co2, + ethylene, + ethane, + acetylene, + dbds, + power_factor, + interfacial_v, + dielectric_rigidity, + water_content, + ]] + ) + + scaled = scaler_X.transform(feature_values) + score = model.predict(scaled)[0] + return float(score) + + # ── Result models ───────────────────────────────────────────────────────────── class ErrorResult(BaseModel): @@ -195,7 +411,7 @@ class FailureModeSensorMappingResult(BaseModel): def get_failure_modes(asset_name: str) -> Union[FailureModesResult, ErrorResult]: """Returns a list of known failure modes for the given asset. For chillers and AHUs returns a curated list. For other assets queries the LLM.""" - asset_key = re.sub(r"\d+", "", asset_name).strip().lower() + asset_key = _resolve_failure_mode_asset_key(asset_name) if not asset_key or asset_key == "none": return ErrorResult(error="asset_name is required") @@ -243,6 +459,15 @@ def get_failure_mode_sensor_mapping( fm2sensor: Dict[str, List[str]] = {} sensor2fm: Dict[str, List[str]] = {} + total_calls = len(failure_modes) * len(sensors) + logger.info( + "Starting FM-sensor mapping for asset '%s' with %d failure modes and %d sensors (%d total calls)", + asset_name, + len(failure_modes), + len(sensors), + total_calls, + ) + try: pairs = [(s, fm) for s in sensors for fm in failure_modes] with ThreadPoolExecutor() as executor: @@ -281,6 +506,168 @@ def get_failure_mode_sensor_mapping( ) +@mcp.tool() +def interpret_dga( + asset_name: str, + hydrogen: float, + methane: float, + acetylene: float, + ethylene: float, + ethane: float, +) -> Union[DGAInterpretationResult, ErrorResult]: + """Interpret dissolved gas analysis readings for a transformer.""" + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_dga(asset_name, hydrogen, methane, acetylene, ethylene, ethane) + return DGAInterpretationResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_dga failed: %s", exc) + return ErrorResult(error=str(exc)) + + +@mcp.tool() +def assess_winding_temperature( + asset_name: str, + wti: float, + oti: float, + ati: float, + oti_a: int, + oti_t: int, +) -> Union[WindingTemperatureResult, ErrorResult]: + """Assess transformer winding temperature condition.""" + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_winding(asset_name, wti, oti, ati, oti_a, oti_t) + return WindingTemperatureResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_winding failed: %s", exc) + return ErrorResult(error=str(exc)) + + +@mcp.tool() +def assess_load_profile( + asset_name: str, + vl1: float, + vl2: float, + vl3: float, + il1: float, + il2: float, + il3: float, + vl12: float, + vl23: float, + vl31: float, + inut: float, + rated_mva: float, +) -> Union[LoadProfileResult, ErrorResult]: + """Assess transformer loading condition.""" + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_load( + asset_name, + vl1, + vl2, + vl3, + il1, + il2, + il3, + vl12, + vl23, + vl31, + inut, + rated_mva, + ) + return LoadProfileResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_load failed: %s", exc) + return ErrorResult(error=str(exc)) + + +@mcp.tool() +def predict_health_index( + asset_name: str, + hydrogen: float, + oxygen: float, + nitrogen: float, + methane: float, + co: float, + co2: float, + ethylene: float, + ethane: float, + acetylene: float, + dbds: float, + power_factor: float, + interfacial_v: float, + dielectric_rigidity: float, + water_content: float, +) -> Union[HealthIndexResult, ErrorResult]: + """Predict a transformer health index from condition data.""" + if not asset_name: + return ErrorResult(error="asset_name is required") + + try: + score = _call_predict_health_index( + hydrogen, + oxygen, + nitrogen, + methane, + co, + co2, + ethylene, + ethane, + acetylene, + dbds, + power_factor, + interfacial_v, + dielectric_rigidity, + water_content, + ) + + if score >= 85: + condition = "Very Good" + elif score >= 70: + condition = "Good" + elif score >= 50: + condition = "Fair" + elif score >= 30: + condition = "Poor" + else: + condition = "Very Poor" + + return HealthIndexResult( + asset_name=asset_name, + health_index=score, + condition=condition, + ) + + except Exception as exc: + logger.error("_call_predict_health_index failed: %s", exc) + return ErrorResult(error=str(exc)) + + def main(): mcp.run(transport="stdio") diff --git a/src/servers/fmsr/models.py b/src/servers/fmsr/models.py new file mode 100644 index 000000000..3bc91986d --- /dev/null +++ b/src/servers/fmsr/models.py @@ -0,0 +1,42 @@ +from pydantic import BaseModel + + +class HealthIndexResult(BaseModel): + asset_name: str + health_index: float + condition: str + + +class DGAInterpretationResult(BaseModel): + asset_name: str + fault_type: str + r1: float + r2: float + r3: float + code: str + confidence: str + reasoning: str + recommended_action: str + + +class WindingTemperatureResult(BaseModel): + asset_name: str + thermal_status: str + hot_spot_rise_c: float + ageing_rate: float + alarm_active: bool + trip_active: bool + risk_level: str + reasoning: str + recommended_action: str + + +class LoadProfileResult(BaseModel): + asset_name: str + load_mva: float + load_factor_pct: float + loading_status: str + current_imbalance_pct: float + neutral_current_flag: bool + reasoning: str + recommended_action: str diff --git a/src/servers/fmsr/prompt_templates.py b/src/servers/fmsr/prompt_templates.py new file mode 100644 index 000000000..8b934ce65 --- /dev/null +++ b/src/servers/fmsr/prompt_templates.py @@ -0,0 +1,88 @@ +"""Prompt templates for transformer diagnostics and assessment.""" + +_INTERPRET_DGA_PROMPT = ( + "You are a transformer diagnostic expert. Analyse the following " + "dissolved gas analysis (DGA) readings for asset {asset_name} " + "and determine the fault type using IEC 60599 ratio method.\n\n" + "DGA Readings:\n" + " Hydrogen (H2): {hydrogen} ppm\n" + " Methane (CH4): {methane} ppm\n" + " Acetylene (C2H2): {acetylene} ppm\n" + " Ethylene (C2H4): {ethylene} ppm\n" + " Ethane (C2H6): {ethane} ppm\n\n" + "Steps to follow:\n" + "1. Compute R1=CH4/H2, R2=C2H2/C2H4, R3=C2H4/C2H6\n" + "2. Convert to IEC codes:\n" + " R1: <0.1->0, 0.1-3->1, >3->2\n" + " R2: <0.1->1, 0.1-1->0, >1->2\n" + " R3: <1->0, 1-3->1, >3->2\n" + "3. Map code combination to fault type:\n" + " (0,0,0)->NF, (0,1,0)->PDLED, (1,1,0)->PDHED,\n" + " (1or2,0,1or2)->LED, (1,0,2)->HED,\n" + " (0,0,1)->LTH1, (0,2,0)->LTH4, (0,2,1)->MTH,\n" + " (0,2,2)->HTH, other->UD\n" + "4. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Fault Type: \n" + "R1 (CH4/H2): \n" + "R2 (C2H2/C2H4): \n" + "R3 (C2H4/C2H6): \n" + "Code (R1,R2,R3): \n" + "Confidence: \n" + "Reasoning: \n" + "Recommended Action: " +) + +_ASSESS_WINDING_PROMPT = ( + "You are a transformer thermal assessment expert. Evaluate the " + "winding temperature condition of asset {asset_name} using " + "IEC 60076-7.\n\n" + "Temperature Readings:\n" + " Winding Temperature (WTI): {wti} C\n" + " Oil Temperature (OTI): {oti} C\n" + " Ambient Temperature (ATI): {ati} C\n" + " Alarm flag (OTI_A): {oti_a}\n" + " Trip flag (OTI_T): {oti_t}\n\n" + "Steps to follow:\n" + "1. Compute hot-spot rise = WTI - ATI.\n" + "2. Thermal status: <=98C Normal, <=140C Warning, " + "<=160C Critical, >160C or trip=1 Trip.\n" + "3. Ageing rate = 2^((WTI-98)/6).\n" + "4. Check alarm and trip flags.\n" + "5. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Thermal Status: \n" + "Hot-Spot Rise (C): \n" + "Ageing Rate: \n" + "Alarm Active: \n" + "Trip Active: \n" + "Risk Level: \n" + "Reasoning: \n" + "Recommended Action: " +) + +_ASSESS_LOAD_PROMPT = ( + "You are a transformer load assessment expert. Evaluate the " + "loading condition of asset {asset_name}.\n\n" + "Electrical Readings:\n" + " Phase voltages: VL1={vl1}V, VL2={vl2}V, VL3={vl3}V\n" + " Phase currents: IL1={il1}A, IL2={il2}A, IL3={il3}A\n" + " Line voltages: VL12={vl12}V, VL23={vl23}V, VL31={vl31}V\n" + " Neutral current: INUT={inut}A\n" + " Rated Capacity: {rated_mva} MVA\n\n" + "Steps to follow:\n" + "1. load_mva = (VL12*IL1+VL23*IL2+VL31*IL3)/(sqrt(3)*1e6)\n" + "2. load_factor_pct = (load_mva/rated_mva)*100\n" + "3. <=100% Normal, <=110% Overloaded, >110% Severely Overloaded\n" + "4. imbalance = (max-min)/mean of IL1,IL2,IL3 * 100\n" + "5. INUT > 10% of mean phase current indicates imbalance.\n" + "6. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Load MVA: \n" + "Load Factor (%): \n" + "Loading Status: \n" + "Current Imbalance (%): \n" + "Neutral Current Flag: \n" + "Reasoning: \n" + "Recommended Action: " +) \ No newline at end of file diff --git a/src/servers/fmsr/tests/conftest.py b/src/servers/fmsr/tests/conftest.py index 4a1959c69..a60ab8deb 100644 --- a/src/servers/fmsr/tests/conftest.py +++ b/src/servers/fmsr/tests/conftest.py @@ -41,3 +41,62 @@ def mock_asset2fm_chain(): with patch("servers.fmsr.main._call_asset2fm", mock): with patch("servers.fmsr.main._llm_available", True): yield mock + + +@pytest.fixture +def mock_dga_chain(): + """Patch _call_dga to return a fixed DGAInterpretationResult.""" + mock = MagicMock( + return_value={ + "fault_type": "Partial Discharge", + "r1": 0.1, + "r2": 0.2, + "r3": 0.3, + "code": "0.1,0.2,0.3", + "confidence": "High", + "reasoning": "Based on gas ratios", + "recommended_action": "Inspect insulation", + } + ) + with patch("servers.fmsr.main._call_dga", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock + + +@pytest.fixture +def mock_winding_chain(): + """Patch _call_winding to return a fixed WindingTemperatureResult.""" + mock = MagicMock( + return_value={ + "thermal_status": "Normal", + "hot_spot_rise_c": 45.0, + "ageing_rate": 1.0, + "alarm_active": False, + "trip_active": False, + "risk_level": "Low", + "reasoning": "Within limits", + "recommended_action": "None", + } + ) + with patch("servers.fmsr.main._call_winding", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock + + +@pytest.fixture +def mock_load_chain(): + """Patch _call_load to return a fixed LoadProfileResult.""" + mock = MagicMock( + return_value={ + "load_mva": 50.0, + "load_factor_pct": 80.0, + "loading_status": "Normal", + "current_imbalance_pct": 3.0, + "neutral_current_flag": False, + "reasoning": "Balanced load", + "recommended_action": "None", + } + ) + with patch("servers.fmsr.main._call_load", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock \ No newline at end of file diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index 3bbc3129d..cd0b64993 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -35,6 +35,12 @@ async def test_ahu_returns_hardcoded(self): assert "failure_modes" in data assert len(data["failure_modes"]) == 5 + @pytest.mark.anyio + async def test_transformer_returns_hardcoded(self): + data = await call_tool(mcp, "get_failure_modes", {"asset_name": "Smart Grid Transformer"}) + assert "failure_modes" in data + assert len(data["failure_modes"]) == 9 + @pytest.mark.anyio async def test_empty_asset_name_returns_error(self): data = await call_tool(mcp, "get_failure_modes", {"asset_name": ""}) @@ -134,3 +140,221 @@ async def test_integration(self): assert "full_relevancy" in data assert len(data["full_relevancy"]) == 1 assert data["full_relevancy"][0]["relevancy_answer"] in ("Yes", "No", "Unknown") + +class TestInterpretDGA: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_dga_chain): + """Test correct parsing of a mocked LLM response.""" + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "fault_type" in data + assert isinstance(data["r1"], float) + assert isinstance(data["r2"], float) + assert isinstance(data["r3"], float) + assert isinstance(data["confidence"], str) + mock_dga_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "fault_type" in data + assert len(data["reasoning"]) > 0 + + +class TestAssessWindingTemperature: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_winding_chain): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "thermal_status" in data + assert isinstance(data["ageing_rate"], float) + assert isinstance(data["alarm_active"], bool) + assert isinstance(data["trip_active"], bool) + mock_winding_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "thermal_status" in data + assert len(data["recommended_action"]) > 0 + + +class TestAssessLoadProfile: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_load_chain): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "load_mva" in data + assert isinstance(data["load_factor_pct"], float) + assert isinstance(data["current_imbalance_pct"], float) + assert isinstance(data["neutral_current_flag"], bool) + mock_load_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "load_mva" in data + assert len(data["reasoning"]) > 0 + + +class TestTransformerHealthIndexModel: + VALID_FEATURES = { + "hydrogen": 100, + "oxygen": 10, + "nitrogen": 200, + "methane": 50, + "co": 5, + "co2": 20, + "ethylene": 15, + "ethane": 8, + "acetylene": 3, + "dbds": 0.5, + "power_factor": 0.95, + "interfacial_v": 15, + "dielectric_rigidity": 30, + "water_content": 0.2, + } + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "", + **self.VALID_FEATURES + }) + assert "error" in data + + @pytest.mark.anyio + async def test_predicts_without_llm(self, no_llm): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "Transformer1", + **self.VALID_FEATURES + }) + assert "asset_name" in data + assert "health_index" in data + assert "condition" in data + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "Transformer1", + **self.VALID_FEATURES + }) + assert "asset_name" in data + assert "health_index" in data + assert "condition" in data + assert data["asset_name"] == "Transformer1" + assert data["condition"] in ["Very Poor", "Poor", "Fair", "Good", "Very Good"] diff --git a/src/servers/iot/main.py b/src/servers/iot/main.py index 9e4732087..79e786b0b 100644 --- a/src/servers/iot/main.py +++ b/src/servers/iot/main.py @@ -42,6 +42,8 @@ # Static site as per original requirement SITES = ["MAIN"] +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + class ErrorResult(BaseModel): error: str @@ -131,14 +133,117 @@ def get_sensor_list(asset_id: str) -> List[str]: return [] +def get_asset_time_range(asset_id: str) -> Dict[str, Any]: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + if not db: + return {"start": None, "end": None, "total_observations": 0} + + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) and doc.get("timestamp") is not None + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def get_asset_coverage() -> List[Dict[str, Any]]: + """Return discovered IoT coverage for all assets. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching asset coverage: {e}") + return [] + + grouped: Dict[tuple[str, str], Dict[str, Any]] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update( + key for key in doc.keys() if key not in _ASSET_META_FIELDS + ) + timestamp = doc.get("timestamp") + if timestamp is None: + continue + if isinstance(timestamp, str): + if timestamp.strip(): + group["timestamps"].append(timestamp.strip()) + elif hasattr(timestamp, "isoformat"): + group["timestamps"].append(timestamp.isoformat()) + else: + group["timestamps"].append(str(timestamp)) + + coverage: List[Dict[str, Any]] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted( + coverage, + key=lambda item: (item["site_name"].lower(), item["asset_id"].lower()), + ) + + @mcp.tool(title="List Sites") -def sites() -> SitesResult: +def get_sites() -> SitesResult: """Retrieves a list of sites. Each site is represented by a name.""" return SitesResult(sites=SITES) @mcp.tool(title="List Assets") -def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: +def get_assets(site_name: str) -> Union[AssetsResult, ErrorResult]: """Returns a list of assets for a given site. Each asset includes an id and a name.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -153,7 +258,7 @@ def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: @mcp.tool(title="List Sensors") -def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: +def get_sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: """Lists the sensors available for a specified asset at a given site.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -172,7 +277,7 @@ def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: @mcp.tool(title="Get Sensor History") -def history( +def get_history( site_name: str, asset_id: str, start: str, final: Optional[str] = None ) -> Union[HistoryResult, ErrorResult]: """Returns a list of historical sensor values for the specified asset(s) at a site within a given time range (start to final).""" diff --git a/src/servers/iot/tests/test_tools.py b/src/servers/iot/tests/test_tools.py index 20b24b593..d22f48ef4 100644 --- a/src/servers/iot/tests/test_tools.py +++ b/src/servers/iot/tests/test_tools.py @@ -10,26 +10,26 @@ # --------------------------------------------------------------------------- -# sites +# get_sites # --------------------------------------------------------------------------- class TestSites: @pytest.mark.anyio async def test_returns_main(self): - data = await call_tool(mcp, "sites", {}) + data = await call_tool(mcp, "get_sites", {}) assert data["sites"] == ["MAIN"] # --------------------------------------------------------------------------- -# assets +# get_assets # --------------------------------------------------------------------------- class TestAssets: @pytest.mark.anyio async def test_invalid_site(self): - data = await call_tool(mcp, "assets", {"site_name": "INVALID"}) + data = await call_tool(mcp, "get_assets", {"site_name": "INVALID"}) assert "error" in data assert "unknown site" in data["error"] @@ -38,7 +38,7 @@ async def test_with_mock_db(self, mock_db): mock_db.find.return_value = { "docs": [{"asset_id": "Chiller 1"}, {"asset_id": "Chiller 2"}] } - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert data["total_assets"] == 2 assert "Chiller 1" in data["assets"] @@ -47,21 +47,21 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_db_disconnected(self, no_db): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) # Should still return valid JSON (empty assets), not crash assert "assets" in data or "error" in data @requires_couchdb @pytest.mark.anyio async def test_discovery_integration(self): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert "assets" in data assert "Chiller 6" in data["assets"] assert data["total_assets"] > 0 # --------------------------------------------------------------------------- -# sensors +# get_sensors # --------------------------------------------------------------------------- @@ -69,14 +69,14 @@ class TestSensors: @pytest.mark.anyio async def test_invalid_site(self): data = await call_tool( - mcp, "sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} ) assert "error" in data @pytest.mark.anyio async def test_unknown_asset(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "INVALID"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "INVALID"} ) assert "error" in data assert "no sensors found" in data["error"] @@ -96,7 +96,7 @@ async def test_with_mock_db(self, mock_db): ] } data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} ) assert data["total_sensors"] == 2 @@ -110,7 +110,7 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_success_integration(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} ) assert "sensors" in data assert len(data["sensors"]) > 0 @@ -118,7 +118,7 @@ async def test_success_integration(self): # --------------------------------------------------------------------------- -# history +# get_history # --------------------------------------------------------------------------- @@ -127,7 +127,7 @@ class TestHistory: async def test_invalid_date_range(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -142,7 +142,7 @@ async def test_invalid_date_range(self): async def test_malformed_date(self): data = await call_tool( mcp, - "history", + "get_history", {"site_name": "MAIN", "asset_id": "Chiller 6", "start": "not-a-date"}, ) assert "error" in data @@ -151,7 +151,7 @@ async def test_malformed_date(self): async def test_db_disconnected(self, no_db): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -171,7 +171,7 @@ async def test_with_mock_db(self, mock_db): } data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 1", @@ -188,7 +188,7 @@ async def test_with_mock_db(self, mock_db): async def test_open_ended_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -203,7 +203,7 @@ async def test_open_ended_integration(self): async def test_bounded_range_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", diff --git a/src/servers/vibration/couchdb_client.py b/src/servers/vibration/couchdb_client.py index 04aa4a4a0..6e513a54b 100644 --- a/src/servers/vibration/couchdb_client.py +++ b/src/servers/vibration/couchdb_client.py @@ -24,6 +24,16 @@ COUCHDB_USER = os.environ.get("COUCHDB_USERNAME") COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") +# Static site as per IoT benchmark; documents are not filtered by a per-document site field. +SITES = ["MAIN"] + +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + + +def get_site_list() -> list[str]: + """Sites accepted for vibration (aligned with IoT ``SITES``).""" + return list(SITES) + def _get_db() -> Optional[couchdb3.Database]: """Lazy CouchDB connection with error handling.""" @@ -143,3 +153,95 @@ def list_sensor_fields(asset_id: str) -> list[str]: except Exception as e: logger.error(f"Error listing sensors for {asset_id}: {e}") return [] + +def get_asset_time_range(asset_id: str) -> dict: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + db = _get_db() + if not db: + return {"start": None, "end": None, "total_observations": 0} + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) + and doc.get("timestamp") + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching vibration time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def list_asset_coverage() -> list[dict]: + """Return vibration asset coverage, sensors, and time ranges. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + db = _get_db() + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching vibration asset coverage: {e}") + return [] + + grouped: dict[tuple[str, str], dict] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update(k for k in doc.keys() if k not in _ASSET_META_FIELDS) + timestamp = doc.get("timestamp") + if isinstance(timestamp, str) and timestamp: + group["timestamps"].append(timestamp) + + coverage: list[dict] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted(coverage, key=lambda item: (item["site_name"].lower(), item["asset_id"].lower())) diff --git a/uv.lock b/uv.lock index f12494f10..d2ece9433 100644 --- a/uv.lock +++ b/uv.lock @@ -10,6 +10,18 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] +[[package]] +name = "aiofile" +version = "3.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "caio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", size = 19539, upload-time = "2024-10-08T10:39:32.955Z" }, +] + [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -21,7 +33,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.3" +version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -32,76 +44,76 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, - { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, - { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, - { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, - { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, - { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, - { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, - { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, - { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, - { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, - { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, - { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, - { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, - { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, - { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, - { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" }, + { url = "https://files.pythonhosted.org/packages/f5/1b/428a7c64687b3b2e9cd293186695affc0e1e54a445d0361743b231f11066/aiohttp-3.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15c933ad7920b7d9a20de151efcd05a6e38302cbf0e10c9b2acb9a42210a2416", size = 499557, upload-time = "2026-03-31T21:57:38.236Z" }, + { url = "https://files.pythonhosted.org/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d3/3c6d610e66b495657622edb6ae7c7fd31b2e9086b4ec50b47897ad6042a9/aiohttp-3.13.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55b3bdd3292283295774ab585160c4004f4f2f203946997f49aac032c84649e9", size = 1721013, upload-time = "2026-03-31T21:57:43.904Z" }, + { url = "https://files.pythonhosted.org/packages/49/a0/24409c12217456df0bae7babe3b014e460b0b38a8e60753d6cb339f6556d/aiohttp-3.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2b2355dc094e5f7d45a7bb262fe7207aa0460b37a0d87027dcf21b5d890e7d5", size = 1781501, upload-time = "2026-03-31T21:57:46.285Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/b65ec649adc5bccc008b0957a9a9c691070aeac4e41cea18559fef49958b/aiohttp-3.13.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b38765950832f7d728297689ad78f5f2cf79ff82487131c4d26fe6ceecdc5f8e", size = 1878981, upload-time = "2026-03-31T21:57:48.734Z" }, + { url = "https://files.pythonhosted.org/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" }, + { url = "https://files.pythonhosted.org/packages/31/04/d3f8211f273356f158e3464e9e45484d3fb8c4ce5eb2f6fe9405c3273983/aiohttp-3.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33add2463dde55c4f2d9635c6ab33ce154e5ecf322bd26d09af95c5f81cfa286", size = 1566671, upload-time = "2026-03-31T21:57:53.326Z" }, + { url = "https://files.pythonhosted.org/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/7dfba71a2f9fd97b15c95c06819de7eb38113d2cdb6319669195a7d64270/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7c35b0bf0b48a70b4cb4fc5d7bed9b932532728e124874355de1a0af8ec4bc88", size = 1743049, upload-time = "2026-03-31T21:57:57.341Z" }, + { url = "https://files.pythonhosted.org/packages/18/71/901db0061e0f717d226386a7f471bb59b19566f2cae5f0d93874b017271f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:df23d57718f24badef8656c49743e11a89fd6f5358fa8a7b96e728fda2abf7d3", size = 1749557, upload-time = "2026-03-31T21:57:59.626Z" }, + { url = "https://files.pythonhosted.org/packages/08/d5/41eebd16066e59cd43728fe74bce953d7402f2b4ddfdfef2c0e9f17ca274/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:02e048037a6501a5ec1f6fc9736135aec6eb8a004ce48838cb951c515f32c80b", size = 1558931, upload-time = "2026-03-31T21:58:01.972Z" }, + { url = "https://files.pythonhosted.org/packages/30/e6/4a799798bf05740e66c3a1161079bda7a3dd8e22ca392481d7a7f9af82a6/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31cebae8b26f8a615d2b546fee45d5ffb76852ae6450e2a03f42c9102260d6fe", size = 1774125, upload-time = "2026-03-31T21:58:04.007Z" }, + { url = "https://files.pythonhosted.org/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" }, + { url = "https://files.pythonhosted.org/packages/98/de/cf2f44ff98d307e72fb97d5f5bbae3bfcb442f0ea9790c0bf5c5c2331404/aiohttp-3.13.5-cp312-cp312-win32.whl", hash = "sha256:8bd3ec6376e68a41f9f95f5ed170e2fcf22d4eb27a1f8cb361d0508f6e0557f3", size = 433534, upload-time = "2026-03-31T21:58:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ca/eadf6f9c8fa5e31d40993e3db153fb5ed0b11008ad5d9de98a95045bed84/aiohttp-3.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:110e448e02c729bcebb18c60b9214a87ba33bac4a9fa5e9a5f139938b56c6cb1", size = 460446, upload-time = "2026-03-31T21:58:10.945Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/4b7b70223deaebd9bb85984d01a764b0d7bd6526fcdc73cca83bcbe7243e/aiohttp-3.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bb6bf5811620003614076bdc807ef3b5e38244f9d25ca5fe888eaccea2a9832", size = 496927, upload-time = "2026-03-31T21:58:15.073Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" }, + { url = "https://files.pythonhosted.org/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e5/4e161f84f98d80c03a238671b4136e6530453d65262867d989bbe78244d0/aiohttp-3.13.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5e5f7debc7a57af53fdf5c5009f9391d9f4c12867049d509bf7bb164a6e295b", size = 1706507, upload-time = "2026-03-31T21:58:21.094Z" }, + { url = "https://files.pythonhosted.org/packages/d4/56/ea11a9f01518bd5a2a2fcee869d248c4b8a0cfa0bb13401574fa31adf4d4/aiohttp-3.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c719f65bebcdf6716f10e9eff80d27567f7892d8988c06de12bbbd39307c6e3a", size = 1773465, upload-time = "2026-03-31T21:58:23.159Z" }, + { url = "https://files.pythonhosted.org/packages/eb/40/333ca27fb74b0383f17c90570c748f7582501507307350a79d9f9f3c6eb1/aiohttp-3.13.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d97f93fdae594d886c5a866636397e2bcab146fd7a132fd6bb9ce182224452f8", size = 1873523, upload-time = "2026-03-31T21:58:25.59Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/fb/56/3f653d7f53c89669301ec9e42c95233e2a0c0a6dd051269e6e678db4fdb0/aiohttp-3.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe6970addfea9e5e081401bcbadf865d2b6da045472f58af08427e108d618540", size = 1562351, upload-time = "2026-03-31T21:58:29.918Z" }, + { url = "https://files.pythonhosted.org/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" }, + { url = "https://files.pythonhosted.org/packages/98/fc/bfb437a99a2fcebd6b6eaec609571954de2ed424f01c352f4b5504371dd3/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:676e5651705ad5d8a70aeb8eb6936c436d8ebbd56e63436cb7dd9bb36d2a9a46", size = 1730618, upload-time = "2026-03-31T21:58:34.728Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b6/c8534862126191a034f68153194c389addc285a0f1347d85096d349bbc15/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9b16c653d38eb1a611cc898c41e76859ca27f119d25b53c12875fd0474ae31a8", size = 1745185, upload-time = "2026-03-31T21:58:36.909Z" }, + { url = "https://files.pythonhosted.org/packages/0b/93/4ca8ee2ef5236e2707e0fd5fecb10ce214aee1ff4ab307af9c558bda3b37/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:999802d5fa0389f58decd24b537c54aa63c01c3219ce17d1214cbda3c2b22d2d", size = 1557311, upload-time = "2026-03-31T21:58:39.38Z" }, + { url = "https://files.pythonhosted.org/packages/57/ae/76177b15f18c5f5d094f19901d284025db28eccc5ae374d1d254181d33f4/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ec707059ee75732b1ba130ed5f9580fe10ff75180c812bc267ded039db5128c6", size = 1773147, upload-time = "2026-03-31T21:58:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" }, + { url = "https://files.pythonhosted.org/packages/e4/85/fc8601f59dfa8c9523808281f2da571f8b4699685f9809a228adcc90838d/aiohttp-3.13.5-cp313-cp313-win32.whl", hash = "sha256:329f292ed14d38a6c4c435e465f48bebb47479fd676a0411936cc371643225cc", size = 432637, upload-time = "2026-03-31T21:58:46.167Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/ac685a8882896acf0f6b31d689e3792199cfe7aba37969fa91da63a7fa27/aiohttp-3.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:69f571de7500e0557801c0b51f4780482c0ec5fe2ac851af5a92cfce1af1cb83", size = 458896, upload-time = "2026-03-31T21:58:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" }, + { url = "https://files.pythonhosted.org/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" }, + { url = "https://files.pythonhosted.org/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" }, + { url = "https://files.pythonhosted.org/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" }, + { url = "https://files.pythonhosted.org/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" }, + { url = "https://files.pythonhosted.org/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" }, + { url = "https://files.pythonhosted.org/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" }, + { url = "https://files.pythonhosted.org/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" }, + { url = "https://files.pythonhosted.org/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" }, + { url = "https://files.pythonhosted.org/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" }, + { url = "https://files.pythonhosted.org/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" }, + { url = "https://files.pythonhosted.org/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" }, + { url = "https://files.pythonhosted.org/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" }, + { url = "https://files.pythonhosted.org/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" }, + { url = "https://files.pythonhosted.org/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" }, + { url = "https://files.pythonhosted.org/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" }, + { url = "https://files.pythonhosted.org/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" }, + { url = "https://files.pythonhosted.org/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" }, + { url = "https://files.pythonhosted.org/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" }, + { url = "https://files.pythonhosted.org/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" }, ] [[package]] @@ -137,7 +149,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.96.0" +version = "0.98.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -149,22 +161,22 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/7e/672f533dee813028d2c699bfd2a7f52c9118d7353680d9aa44b9e23f717f/anthropic-0.96.0.tar.gz", hash = "sha256:9de947b737f39452f68aa520f1c2239d44119c9b73b0fb6d4e6ca80f00279ee6", size = 658210, upload-time = "2026-04-16T14:28:02.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/b9/1702127c175338407033ceb94c61f5eb538adbbf59d5d1baec7ccf8ad502/anthropic-0.98.0.tar.gz", hash = "sha256:b6943df4299dc09d1f1fdcdcae66cd4e9f7a2827d9d1d519ed0a7b0d47e8b787", size = 725023, upload-time = "2026-05-04T17:13:51.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/5a/72f33204064b6e87601a71a6baf8d855769f8a0c1eaae8d06a1094872371/anthropic-0.96.0-py3-none-any.whl", hash = "sha256:9a6e335a354602a521cd9e777e92bfd46ba6e115bf9bbfe6135311e8fb2015b2", size = 635930, upload-time = "2026-04-16T14:28:01.436Z" }, + { url = "https://files.pythonhosted.org/packages/01/73/cdc9d5b1c4601cc77a7bb21d54cfc0b86a2372b2e97bc49feeb952eabb57/anthropic-0.98.0-py3-none-any.whl", hash = "sha256:e79f4908a04582186b2f18cee2fff3c068c8d2ee4fe134e9aab423aaf74b7c80", size = 699604, upload-time = "2026-05-04T17:13:49.715Z" }, ] [[package]] name = "anyio" -version = "4.12.1" +version = "4.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] [[package]] @@ -172,8 +184,10 @@ name = "assetopsbench-mcp" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "certifi" }, { name = "claude-agent-sdk" }, { name = "couchdb3" }, + { name = "datasets" }, { name = "deepagents" }, { name = "fastmcp" }, { name = "langchain-mcp-adapters" }, @@ -185,9 +199,11 @@ dependencies = [ { name = "pandas" }, { name = "pendulum" }, { name = "pydantic" }, + { name = "pypdf" }, { name = "python-dotenv" }, { name = "pyyaml" }, { name = "requests" }, + { name = "scikit-learn" }, { name = "scipy" }, ] @@ -212,8 +228,10 @@ tsfm = [ [package.metadata] requires-dist = [ + { name = "certifi", specifier = ">=2024.8.30" }, { name = "claude-agent-sdk", specifier = ">=0.0.14" }, { name = "couchdb3", specifier = ">=2.0.2" }, + { name = "datasets", specifier = ">=4.8.4" }, { name = "deepagents", specifier = ">=0.5.3" }, { name = "fastmcp", specifier = ">=2.14.5" }, { name = "langchain-mcp-adapters", specifier = ">=0.2.2" }, @@ -225,9 +243,11 @@ requires-dist = [ { name = "pandas", specifier = ">=2.0" }, { name = "pendulum", specifier = ">=3.2.0" }, { name = "pydantic", specifier = ">=2.12.5" }, + { name = "pypdf", specifier = ">=6.9.2" }, { name = "python-dotenv", specifier = ">=1.0" }, { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.5" }, + { name = "scikit-learn", specifier = ">=1.8.0" }, { name = "scipy", specifier = ">=1.10.0" }, ] @@ -252,23 +272,24 @@ tsfm = [ [[package]] name = "attrs" -version = "25.4.0" +version = "26.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] [[package]] name = "authlib" -version = "1.6.8" +version = "1.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, + { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/6c/c88eac87468c607f88bc24df1f3b31445ee6fc9ba123b09e666adf687cd9/authlib-1.6.8.tar.gz", hash = "sha256:41ae180a17cf672bc784e4a518e5c82687f1fe1e98b0cafaeda80c8e4ab2d1cb", size = 165074, upload-time = "2026-02-14T04:02:17.941Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/f2/e05664d5275ce811fd4e9df0a2b3f0086ee19a8a80358d95499fa82fd50c/authlib-1.7.1.tar.gz", hash = "sha256:8c09b0f9d080c823e594b52316af70f79a1fa4eed64d0363a076233c04ef063a", size = 175884, upload-time = "2026-05-04T08:11:25.033Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/73/f7084bf12755113cd535ae586782ff3a6e710bfbe6a0d13d1c2f81ffbbfa/authlib-1.6.8-py2.py3-none-any.whl", hash = "sha256:97286fd7a15e6cfefc32771c8ef9c54f0ed58028f1322de6a2a7c969c3817888", size = 244116, upload-time = "2026-02-14T04:02:15.579Z" }, + { url = "https://files.pythonhosted.org/packages/e0/82/730650ee5e5b598b7bfdc291b784bc2f6fe02a5671695485403365101088/authlib-1.7.1-py2.py3-none-any.whl", hash = "sha256:8470f4aa6b5590ac41bd81d6e6ee12448ce36a0da0af19bbed69fb53fb4e8ad9", size = 258826, upload-time = "2026-05-04T08:11:23.208Z" }, ] [[package]] @@ -291,20 +312,41 @@ wheels = [ [[package]] name = "cachetools" -version = "7.0.1" +version = "7.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/e2/85f227594656000ff4d8adadae91a21f536d4a84c6c716a86bd6685874be/cachetools-7.1.1.tar.gz", hash = "sha256:27bdf856d68fd3c71c26c01b5edc312124ed427524d1ddb31aa2b7746fe20d4b", size = 40202, upload-time = "2026-05-03T20:00:29.391Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/0f/f897abe4ea0a8c408ae65c8c83bffab4936ad65d6032d4fb4cd35bbdc3ee/cachetools-7.1.1-py3-none-any.whl", hash = "sha256:0335cd7a0952d2b22327441fb0628139e234c565559eeb91a8a4ac7551c5353d", size = 16775, upload-time = "2026-05-03T20:00:27.857Z" }, +] + +[[package]] +name = "caio" +version = "0.9.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/07/56595285564e90777d758ebd383d6b0b971b87729bbe2184a849932a3736/cachetools-7.0.1.tar.gz", hash = "sha256:e31e579d2c5b6e2944177a0397150d312888ddf4e16e12f1016068f0c03b8341", size = 36126, upload-time = "2026-02-10T22:24:05.03Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781, upload-time = "2025-12-26T15:21:36.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/9e/5faefbf9db1db466d633735faceda1f94aa99ce506ac450d232536266b32/cachetools-7.0.1-py3-none-any.whl", hash = "sha256:8f086515c254d5664ae2146d14fc7f65c9a4bce75152eb247e5a9c5e6d7b2ecf", size = 13484, upload-time = "2026-02-10T22:24:03.741Z" }, + { url = "https://files.pythonhosted.org/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", size = 36983, upload-time = "2025-12-26T15:21:36.075Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", size = 82012, upload-time = "2025-12-26T15:22:20.983Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", size = 81502, upload-time = "2026-03-04T22:08:22.381Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", size = 80200, upload-time = "2026-03-04T22:08:23.382Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979, upload-time = "2025-12-26T15:21:35.484Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900, upload-time = "2025-12-26T15:22:21.919Z" }, + { url = "https://files.pythonhosted.org/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523, upload-time = "2026-03-04T22:08:25.187Z" }, + { url = "https://files.pythonhosted.org/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243, upload-time = "2026-03-04T22:08:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", size = 36978, upload-time = "2025-12-26T15:21:41.055Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", size = 81832, upload-time = "2025-12-26T15:22:22.757Z" }, + { url = "https://files.pythonhosted.org/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", size = 81565, upload-time = "2026-03-04T22:08:27.483Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", size = 80071, upload-time = "2026-03-04T22:08:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087, upload-time = "2025-12-26T15:22:00.221Z" }, ] [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +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/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, + { 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]] @@ -366,97 +408,105 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] name = "claude-agent-sdk" -version = "0.1.56" +version = "0.1.72" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "mcp" }, + { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/c1/c7afb1a08cecef0644693ccd9975651e45cf23a50272b94b6eca2c1a7dc8/claude_agent_sdk-0.1.56.tar.gz", hash = "sha256:a95bc14e59f9d6c8e7fa2e6581008a3f24f10e1b57302719823f62cfb5beccdc", size = 121659, upload-time = "2026-04-04T00:56:30.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/b7/ce35a79f4891797ef60b5cf437453bf22e3e420f5946007312c9e144f5e0/claude_agent_sdk-0.1.72.tar.gz", hash = "sha256:e737f919301d5fc65a3ebc6f438911b73e237b16fa9fa3061420e79727cfa307", size = 241286, upload-time = "2026-05-01T02:17:34.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/73/4e3d13c4d43614de35a113c87ec96b3db605baa23f9f5c4a38536837e18e/claude_agent_sdk-0.1.56-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f5a7c87617101e6bb0f23408104ac6f40f9b5adec91dcfe5b8de5f65a7df73a", size = 58585662, upload-time = "2026-04-04T00:56:34.935Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6d/78347c2efa1526f1f6e7edecabe636575f622bcaa7921965457f95dd12dc/claude_agent_sdk-0.1.56-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:824f4a10340f46dd26fee8e74aeed4fc64fec95084e327ab1ebb6058b349e1c3", size = 60419564, upload-time = "2026-04-04T00:56:39.64Z" }, - { url = "https://files.pythonhosted.org/packages/87/c1/708262318926c8393d494a5dcaafd9bc7d6ba547c0a5fad4eff5f9aa0ecd/claude_agent_sdk-0.1.56-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:ff60dedc06b62b52e5937a9a2c4b0ec4ad0dd6764c20be656d01aeb8b11fba1d", size = 71893844, upload-time = "2026-04-04T00:56:44.402Z" }, - { url = "https://files.pythonhosted.org/packages/1b/4f/24918a596b0d61c3a691af2a9ee52b8c54f1769ce2c5fef1d64350056e53/claude_agent_sdk-0.1.56-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:fe866b2119f69e99d9637acc27b588670c610fed1c4a096287874db5744d029b", size = 72030943, upload-time = "2026-04-04T00:56:49.892Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d8/5ded242e55f0b5f295d4ee2cbe5ae3bca914eb0a2a291f81e38b68d3ef58/claude_agent_sdk-0.1.56-py3-none-win_amd64.whl", hash = "sha256:5934e082e1ccf975d65cd7412f2eaf2c5ffa6b9019a2ca2a9fb228310df7ddc8", size = 74141451, upload-time = "2026-04-04T00:56:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/e8/de/098dd15dec8ce3c5ed9c9c2415a290fb5c24ad9cd1214cfc3e20c3be0342/claude_agent_sdk-0.1.72-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a16ee041db0734e8f82d1fca7bd7c122227c0d8c150a301b365ab3f0a83a27b", size = 63695454, upload-time = "2026-05-01T02:17:38.468Z" }, + { url = "https://files.pythonhosted.org/packages/55/de/bea82fdd65244bab9cf6aa3492c2b6cc5d97213836730febd89c0a342975/claude_agent_sdk-0.1.72-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:4b3c630b5b07cd4f3d57631d833539b77045937093ec4975f47ee29de6b9a9df", size = 65539313, upload-time = "2026-05-01T02:17:43.129Z" }, + { url = "https://files.pythonhosted.org/packages/1c/26/78e45a08c4acb262b8f99f6885fb5b96ccf32f27be008610403b86cc3da8/claude_agent_sdk-0.1.72-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:6fd7c6cbab95928ceb39fe82f413bd124e83dc5ed9bf63b6dffb9dc2b83f67bc", size = 76872182, upload-time = "2026-05-01T02:17:48.616Z" }, + { url = "https://files.pythonhosted.org/packages/58/6d/9641f9a3119adec03d33cb40be8a194801cde0c15b3c497f07e36b38dab1/claude_agent_sdk-0.1.72-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:e2cf7beb573b608832cf2c644b330e51b79cfdab85286f064cf92f8f63c66382", size = 77032401, upload-time = "2026-05-01T02:17:54.322Z" }, + { url = "https://files.pythonhosted.org/packages/88/a1/35eeda6bac78c5c236c0f3c36fb8634503514ff78ada4e46b77397922ed7/claude_agent_sdk-0.1.72-py3-none-win_amd64.whl", hash = "sha256:9159ac974b496bb50d05027f49b44b76a595f1b4df3bfdef1136b56c95fc956d", size = 78421027, upload-time = "2026-05-01T02:18:00.614Z" }, ] [[package]] name = "click" -version = "8.3.1" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - -[[package]] -name = "cloudpickle" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, + { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, ] [[package]] @@ -470,80 +520,67 @@ wheels = [ [[package]] name = "couchdb3" -version = "2.0.2" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/c5/cacddbbaecfd97641c360a64dbc6546ccd5f3396e2653013f82eed51a523/couchdb3-2.0.2.tar.gz", hash = "sha256:cc1336ba63cdb870aba4d3105bb96f0ace86d53d95e462084dc49fb4a865ae5e", size = 25625, upload-time = "2025-07-09T16:07:30.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/1d/8f3c492e2b93ac2711ed07ebcbde66e2d30c8bd21d13f8f2f4013942f914/couchdb3-2.0.2-py3-none-any.whl", hash = "sha256:aa719136e2d432f4c1abd3920f5b3b94ecdd1fe95a7be59e5f3dad640c63989e", size = 30804, upload-time = "2025-07-09T16:07:28.904Z" }, -] - -[[package]] -name = "croniter" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, - { name = "pytz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ad/2f/44d1ae153a0e27be56be43465e5cb39b9650c781e001e7864389deb25090/croniter-6.0.0.tar.gz", hash = "sha256:37c504b313956114a983ece2c2b07790b1f1094fe9d81cc94739214748255577", size = 64481, upload-time = "2024-12-17T17:17:47.32Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/e1/d769e4650257b8476b955122a7d29204e5624c86d583045cfe7dc08ee2e0/couchdb3-3.0.1.tar.gz", hash = "sha256:a084ecda52de863b278c12eb6fbda46e6072dadc3b09562be0d96ebc1bb5465a", size = 24260, upload-time = "2026-03-28T10:46:36.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/4b/290b4c3efd6417a8b0c284896de19b1d5855e6dbdb97d2a35e68fa42de85/croniter-6.0.0-py2.py3-none-any.whl", hash = "sha256:2f878c3856f17896979b2a4379ba1f09c83e374931ea15cc835c5dd2eee9b368", size = 25468, upload-time = "2024-12-17T17:17:45.359Z" }, + { url = "https://files.pythonhosted.org/packages/55/74/f0293fc87ad27f76d7f48ac2356e20a06bd82ed2508d1b79083c20845996/couchdb3-3.0.1-py3-none-any.whl", hash = "sha256:3656a6cfbf0c35488792fc9620a6979f251ac12b076a1462173d82d81d734f8a", size = 30366, upload-time = "2026-03-28T10:46:34.81Z" }, ] [[package]] name = "cryptography" -version = "46.0.5" +version = "47.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, - { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, - { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, - { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, - { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, - { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, - { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, - { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, - { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, - { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, - { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, - { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, - { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, - { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, - { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/98/40dfe932134bdcae4f6ab5927c87488754bf9eb79297d7e0070b78dd58e9/cryptography-47.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:160ad728f128972d362e714054f6ba0067cab7fb350c5202a9ae8ae4ce3ef1a0", size = 7912214, upload-time = "2026-04-24T19:53:03.864Z" }, + { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973", size = 4644617, upload-time = "2026-04-24T19:53:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8", size = 4668186, upload-time = "2026-04-24T19:53:09.053Z" }, + { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b", size = 4651244, upload-time = "2026-04-24T19:53:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/5d/5e/13ed0cdd0eb88ba159d6dd5ebfece8cb901dbcf1ae5ac4072e28b55d3153/cryptography-47.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:34b4358b925a5ea3e14384ca781a2c0ef7ac219b57bb9eacc4457078e2b19f92", size = 5252906, upload-time = "2026-04-24T19:53:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7", size = 4701842, upload-time = "2026-04-24T19:53:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93", size = 4289313, upload-time = "2026-04-24T19:53:17.755Z" }, + { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac", size = 4650964, upload-time = "2026-04-24T19:53:20.062Z" }, + { url = "https://files.pythonhosted.org/packages/86/53/5395d944dfd48cb1f67917f533c609c34347185ef15eb4308024c876f274/cryptography-47.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a9b761f012a943b7de0e828843c5688d0de94a0578d44d6c85a1bae32f87791f", size = 5207817, upload-time = "2026-04-24T19:53:22.498Z" }, + { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8", size = 4701544, upload-time = "2026-04-24T19:53:24.356Z" }, + { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318", size = 4783536, upload-time = "2026-04-24T19:53:26.665Z" }, + { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001", size = 4926106, upload-time = "2026-04-24T19:53:28.686Z" }, + { url = "https://files.pythonhosted.org/packages/54/ed/5f524db1fade9c013aa618e1c99c6ed05e8ffc9ceee6cda22fed22dda3f4/cryptography-47.0.0-cp311-abi3-win32.whl", hash = "sha256:7fda2f02c9015db3f42bb8a22324a454516ed10a8c29ca6ece6cdbb5efe2a203", size = 3258581, upload-time = "2026-04-24T19:53:31.058Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/1b901990b174786569029f67542b3edf72ac068b6c3c8683c17e6a2f5363/cryptography-47.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:f5c3296dab66202f1b18a91fa266be93d6aa0c2806ea3d67762c69f60adc71aa", size = 3775309, upload-time = "2026-04-24T19:53:33.054Z" }, + { url = "https://files.pythonhosted.org/packages/14/88/7aa18ad9c11bc87689affa5ce4368d884b517502d75739d475fc6f4a03c7/cryptography-47.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:be12cb6a204f77ed968bcefe68086eb061695b540a3dd05edac507a3111b25f0", size = 7904299, upload-time = "2026-04-24T19:53:35.003Z" }, + { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7", size = 4631180, upload-time = "2026-04-24T19:53:37.517Z" }, + { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1", size = 4653529, upload-time = "2026-04-24T19:53:39.775Z" }, + { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c", size = 4638570, upload-time = "2026-04-24T19:53:42.129Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/300327b0a47f6dc94dd8b71b57052aefe178bb51745073d73d80604f11ab/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3fb8fa48075fad7193f2e5496135c6a76ac4b2aa5a38433df0a539296b377829", size = 5238019, upload-time = "2026-04-24T19:53:44.577Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7", size = 4686832, upload-time = "2026-04-24T19:53:47.015Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923", size = 4269301, upload-time = "2026-04-24T19:53:48.97Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab", size = 4638110, upload-time = "2026-04-24T19:53:51.011Z" }, + { url = "https://files.pythonhosted.org/packages/8e/d7/0b3c71090a76e5c203164a47688b697635ece006dcd2499ab3a4dbd3f0bd/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:f9a034b642b960767fb343766ae5ba6ad653f2e890ddd82955aef288ffea8736", size = 5194988, upload-time = "2026-04-24T19:53:52.962Z" }, + { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7", size = 4686563, upload-time = "2026-04-24T19:53:55.274Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52", size = 4770094, upload-time = "2026-04-24T19:53:57.753Z" }, + { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd", size = 4913811, upload-time = "2026-04-24T19:54:00.236Z" }, + { url = "https://files.pythonhosted.org/packages/31/98/dc4ad376ac5f1a1a7d4a83f7b0c6f2bcad36b5d2d8f30aeb482d3a7d9582/cryptography-47.0.0-cp314-cp314t-win32.whl", hash = "sha256:6eebcaf0df1d21ce1f90605c9b432dd2c4f4ab665ac29a40d5e3fc68f51b5e63", size = 3237158, upload-time = "2026-04-24T19:54:02.606Z" }, + { url = "https://files.pythonhosted.org/packages/bc/da/97f62d18306b5133468bc3f8cc73a3111e8cdc8cf8d3e69474d6e5fd2d1b/cryptography-47.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:51c9313e90bd1690ec5a75ed047c27c0b8e6c570029712943d6116ef9a90620b", size = 3758706, upload-time = "2026-04-24T19:54:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e0/34/a4fae8ae7c3bc227460c9ae43f56abf1b911da0ec29e0ebac53bb0a4b6b7/cryptography-47.0.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:14432c8a9bcb37009784f9594a62fae211a2ae9543e96c92b2a8e4c3cd5cd0c4", size = 7904072, upload-time = "2026-04-24T19:54:06.411Z" }, + { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27", size = 4635767, upload-time = "2026-04-24T19:54:08.519Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10", size = 4654350, upload-time = "2026-04-24T19:54:10.795Z" }, + { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b", size = 4643394, upload-time = "2026-04-24T19:54:13.275Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/2c5fbeea70adbbca2bbae865e1d605d6a4a7f8dbd9d33eaf69645087f06c/cryptography-47.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9af828c0d5a65c70ec729cd7495a4bf1a67ecb66417b8f02ff125ab8a6326a74", size = 5225777, upload-time = "2026-04-24T19:54:15.18Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515", size = 4688771, upload-time = "2026-04-24T19:54:17.835Z" }, + { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc", size = 4270753, upload-time = "2026-04-24T19:54:19.963Z" }, + { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca", size = 4642911, upload-time = "2026-04-24T19:54:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/a5/51/661cbee74f594c5d97ff82d34f10d5551c085ca4668645f4606ebd22bd5d/cryptography-47.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a49a3eb5341b9503fa3000a9a0db033161db90d47285291f53c2a9d2cd1b7f76", size = 5181411, upload-time = "2026-04-24T19:54:24.376Z" }, + { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe", size = 4688262, upload-time = "2026-04-24T19:54:26.946Z" }, + { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31", size = 4775506, upload-time = "2026-04-24T19:54:28.926Z" }, + { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7", size = 4912060, upload-time = "2026-04-24T19:54:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/bd/0a9d3edbf5eadbac926d7b9b3cd0c4be584eeeae4a003d24d9eda4affbbd/cryptography-47.0.0-cp38-abi3-win32.whl", hash = "sha256:ed67ea4e0cfb5faa5bc7ecb6e2b8838f3807a03758eec239d6c21c8769355310", size = 3248487, upload-time = "2026-04-24T19:54:33.494Z" }, + { url = "https://files.pythonhosted.org/packages/60/80/5681af756d0da3a599b7bdb586fac5a1540f1bcefd2717a20e611ddade45/cryptography-47.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:835d2d7f47cdc53b3224e90810fb1d36ca94ea29cc1801fb4c1bc43876735769", size = 3755737, upload-time = "2026-04-24T19:54:35.408Z" }, ] [[package]] @@ -566,10 +603,10 @@ wheels = [ [[package]] name = "cuda-pathfinder" -version = "1.5.0" +version = "1.5.4" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/66/0c02bd330e7d976f83fa68583d6198d76f23581bcbb5c0e98a6148f326e5/cuda_pathfinder-1.5.0-py3-none-any.whl", hash = "sha256:498f90a9e9de36044a7924742aecce11c50c49f735f1bc53e05aa46de9ea4110", size = 49739, upload-time = "2026-03-24T21:14:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/11/d0/c177e29701cf1d3008d7d2b16b5fc626592ce13bd535f8795c5f57187e0e/cuda_pathfinder-1.5.4-py3-none-any.whl", hash = "sha256:9563d3175ce1828531acf4b94e1c1c7d67208c347ca002493e2654878b26f4b7", size = 51657, upload-time = "2026-04-27T22:42:07.712Z" }, ] [[package]] @@ -617,7 +654,7 @@ nvtx = [ [[package]] name = "cyclopts" -version = "4.5.3" +version = "4.11.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -625,14 +662,39 @@ dependencies = [ { name = "rich" }, { name = "rich-rst" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/16/06e35c217334930ff7c476ce1c8e74ed786fa3ef6742e59a1458e2412290/cyclopts-4.5.3.tar.gz", hash = "sha256:35fa70971204c450d9668646a6ca372eb5fa3070fbe8dd51c5b4b31e65198f2d", size = 162437, upload-time = "2026-02-16T15:07:11.96Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/f7/3ee212c1bc314551094fc8fda7b4b63c647ac5c32d06daa285d04d33edfc/cyclopts-4.11.2.tar.gz", hash = "sha256:8c9b77921660fa1ee52c150e2217ced672323efb3434e9b338077de1bc551ff4", size = 175935, upload-time = "2026-05-04T00:11:57.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/18/4cedda786e7da429e7489549a9e5461530d4133130e541f25fb94f015776/cyclopts-4.11.2-py3-none-any.whl", hash = "sha256:838020120b939549ff7c8423aca29c86764b5dd1d8a5d7f3753a6327861f537b", size = 213537, upload-time = "2026-05-04T00:11:56.103Z" }, +] + +[[package]] +name = "datasets" +version = "4.8.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/34/14cd8e76f907f7d4dca2334cfeec9f81d30fd15c25a015f99aaea694eaed/datasets-4.8.5.tar.gz", hash = "sha256:0f0c1c3d56ffff2c93b2f4c63c95bac94f3d7e8621aea2a2a576275233bba772", size = 605649, upload-time = "2026-04-27T15:43:57.384Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/1f/d8bce383a90d8a6a11033327777afa4d4d611ec11869284adb6f48152906/cyclopts-4.5.3-py3-none-any.whl", hash = "sha256:50af3085bb15d4a6f2582dd383dad5e4ba6a0d4d4c64ee63326d881a752a6919", size = 200231, upload-time = "2026-02-16T15:07:13.045Z" }, + { url = "https://files.pythonhosted.org/packages/65/99/00f3196036501b53032c4b1ab8337a0b978dee832ed276dae3815df4e8b5/datasets-4.8.5-py3-none-any.whl", hash = "sha256:5079900781719c0e063a8efdd2cd95a31ad0c63209178669cd23cf1b926149ff", size = 528973, upload-time = "2026-04-27T15:43:53.702Z" }, ] [[package]] name = "deepagents" -version = "0.5.3" +version = "0.5.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain" }, @@ -642,18 +704,18 @@ dependencies = [ { name = "langsmith" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/c5/fbf36ff707f7ad4ff2d1590ba8c3b44622370955c74f0c84e4bb1b101d7d/deepagents-0.5.3.tar.gz", hash = "sha256:cbe63bd482c37d3aef883326f5dde70effcd489e67fc91834ffe7a8769796a5f", size = 122654, upload-time = "2026-04-15T13:06:34.875Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/b6/8bff546e96d33fa16b3f20038db4329f0c4b7c6e3e510855f477bc55e9a8/deepagents-0.5.6.tar.gz", hash = "sha256:9906b3695affb0175742eb681377158d197c5cfbb70ab31cc6633da0deb080d9", size = 163816, upload-time = "2026-05-01T15:24:36.111Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/8f/40c91a29e4f094e5a1375e33309a3d0ca2e5204816d1dcdcd41ac38410d8/deepagents-0.5.3-py3-none-any.whl", hash = "sha256:f1f1c968f17a5bfb0a6d588d00c2e83264cdac0faa91f7b522892d5a2bd303cb", size = 138475, upload-time = "2026-04-15T13:06:33.593Z" }, + { url = "https://files.pythonhosted.org/packages/35/32/d21ef2cd5f17e98bc3fb83cd7303661caf3dab00b7f622b415ab8ef0d900/deepagents-0.5.6-py3-none-any.whl", hash = "sha256:3dc2f2ac4f0a0eb2735dedb62c9e00ac066312fcaedd9ef8d6c11c0fb7c153f5", size = 186304, upload-time = "2026-05-01T15:24:34.729Z" }, ] [[package]] -name = "diskcache" -version = "5.6.3" +name = "dill" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, ] [[package]] @@ -676,11 +738,11 @@ wheels = [ [[package]] name = "docstring-parser" -version = "0.17.0" +version = "0.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, ] [[package]] @@ -717,51 +779,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] -[[package]] -name = "fakeredis" -version = "2.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "redis" }, - { name = "sortedcontainers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/44/c403963727d707e03f49a417712b0a23e853d33ae50729679040b6cfe281/fakeredis-2.34.0.tar.gz", hash = "sha256:72bc51a7ab39bedf5004f0cf1b5206822619c1be8c2657fd878d1f4250256c57", size = 177156, upload-time = "2026-02-16T15:56:34.318Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/8e/af19c00753c432355f9b76cec3ab0842578de43ba575e82735b18c1b3ec9/fakeredis-2.34.0-py3-none-any.whl", hash = "sha256:bc45d362c6cc3a537f8287372d8ea532538dfbe7f5d635d0905d7b3464ec51d2", size = 122063, upload-time = "2026-02-16T15:56:21.227Z" }, -] - -[package.optional-dependencies] -lua = [ - { name = "lupa" }, -] - [[package]] name = "fastmcp" -version = "2.14.5" +version = "3.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, { name = "cyclopts" }, { name = "exceptiongroup" }, + { name = "griffelib" }, { name = "httpx" }, { name = "jsonref" }, { name = "jsonschema-path" }, { name = "mcp" }, { name = "openapi-pydantic" }, + { name = "opentelemetry-api" }, { name = "packaging" }, { name = "platformdirs" }, - { name = "py-key-value-aio", extra = ["disk", "keyring", "memory"] }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, { name = "pydantic", extra = ["email"] }, - { name = "pydocket" }, { name = "pyperclip" }, { name = "python-dotenv" }, + { name = "pyyaml" }, { name = "rich" }, + { name = "uncalled-for" }, { name = "uvicorn" }, + { name = "watchfiles" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/32/982678d44f13849530a74ab101ed80e060c2ee6cf87471f062dcf61705fd/fastmcp-2.14.5.tar.gz", hash = "sha256:38944dc582c541d55357082bda2241cedb42cd3a78faea8a9d6a2662c62a42d7", size = 8296329, upload-time = "2026-02-03T15:35:21.005Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/13/29544fbc6dfe45ea38046af0067311e0bad7acc7d1f2ad38bb08f2409fe2/fastmcp-3.2.4.tar.gz", hash = "sha256:083ecb75b44a4169e7fc0f632f94b781bdb0ff877c6b35b9877cbb566fd4d4d1", size = 28746127, upload-time = "2026-04-14T01:42:24.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/c1/1a35ec68ff76ea8443aa115b18bcdee748a4ada2124537ee90522899ff9f/fastmcp-2.14.5-py3-none-any.whl", hash = "sha256:d81e8ec813f5089d3624bec93944beaefa86c0c3a4ef1111cbef676a761ebccf", size = 417784, upload-time = "2026-02-03T15:35:18.489Z" }, + { url = "https://files.pythonhosted.org/packages/cf/76/b310d52fa0e30d39bd937eb58ec2c1f1ea1b5f519f0575e9dd9612f01deb/fastmcp-3.2.4-py3-none-any.whl", hash = "sha256:e6c9c429171041455e47ab94bb3f83c4657622a0ec28922f6940053959bd58a9", size = 728599, upload-time = "2026-04-14T01:42:26.85Z" }, ] [[package]] @@ -807,11 +855,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.24.3" +version = "3.29.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/92/a8e2479937ff39185d20dd6a851c1a63e55849e447a55e798cc2e1f49c65/filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa", size = 37935, upload-time = "2026-02-19T00:48:20.543Z" } +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/9c/0f/5d0c71a1aefeb08efff26272149e07ab922b64f46c63363756224bd6872e/filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d", size = 24331, upload-time = "2026-02-19T00:48:18.465Z" }, + { 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]] @@ -921,17 +969,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + [[package]] name = "google-auth" -version = "2.49.2" +version = "2.50.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyasn1-modules" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/fc/e925290a1ad95c975c459e2df070fac2b90954e13a0370ac505dff78cb99/google_auth-2.49.2.tar.gz", hash = "sha256:c1ae38500e73065dcae57355adb6278cf8b5c8e391994ae9cbadbcb9631ab409", size = 333958, upload-time = "2026-04-10T00:41:21.888Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/18/238d7021d151bdab868f23433817b027dd759135202f4dfce0670d1230ca/google_auth-2.50.0.tar.gz", hash = "sha256:f35eafb191195328e8ce10a7883970877e7aeb49c2bfaa54aa0e394316d353d0", size = 336523, upload-time = "2026-04-30T21:19:29.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/76/d241a5c927433420507215df6cac1b1fa4ac0ba7a794df42a84326c68da8/google_auth-2.49.2-py3-none-any.whl", hash = "sha256:c2720924dfc82dedb962c9f52cabb2ab16714fd0a6a707e40561d217574ed6d5", size = 240638, upload-time = "2026-04-10T00:41:14.501Z" }, + { url = "https://files.pythonhosted.org/packages/37/cf/4880c2137c14280b2f59975cdf12cc442bc0ae1f9ea473a26eaa0c146786/google_auth-2.50.0-py3-none-any.whl", hash = "sha256:04382175e28b94f49694977f0a792688b59a668def1499e9d8de996dc9ce5b15", size = 246495, upload-time = "2026-04-30T21:19:27.664Z" }, ] [package.optional-dependencies] @@ -941,7 +994,7 @@ requests = [ [[package]] name = "google-genai" -version = "1.73.1" +version = "1.74.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -955,9 +1008,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/d8/40f5f107e5a2976bbac52d421f04d14fc221b55a8f05e66be44b2f739fe6/google_genai-1.73.1.tar.gz", hash = "sha256:b637e3a3b9e2eccc46f27136d470165803de84eca52abfed2e7352081a4d5a15", size = 530998, upload-time = "2026-04-14T21:06:19.153Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c8/4a8f1de0a3268d526a345b8c74456b3e1e6ffd200982626326cf7ca83e5b/google_genai-1.74.0.tar.gz", hash = "sha256:c4c473cebdeb6e5adbb0639326de66a3a85a2209e0d32de7d66bf05c698abae8", size = 536772, upload-time = "2026-04-29T22:16:35.881Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/65/af/508e0528015240d710c6763f7c89ff44fab9a94a80b4377e265d692cbfd6/google_genai-1.73.1-py3-none-any.whl", hash = "sha256:af2d2287d25e42a187de19811ef33beb2e347c7e2bdb4dc8c467d78254e43a2c", size = 783595, upload-time = "2026-04-14T21:06:17.464Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2b/539c328b66f7bfef2df869371a1789361228e5a7694ba02a642608367b46/google_genai-1.74.0-py3-none-any.whl", hash = "sha256:87d0b311c67d4b2a0ca741e9fc6891330c29defae81d46d8db41079aa1a3d80a", size = 790433, upload-time = "2026-04-29T22:16:33.979Z" }, ] [[package]] @@ -992,31 +1045,34 @@ wheels = [ [[package]] name = "hf-xet" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020, upload-time = "2025-10-24T19:04:32.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870, upload-time = "2025-10-24T19:04:11.422Z" }, - { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584, upload-time = "2025-10-24T19:04:09.586Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004, upload-time = "2025-10-24T19:04:00.314Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636, upload-time = "2025-10-24T19:03:58.111Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448, upload-time = "2025-10-24T19:04:20.951Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401, upload-time = "2025-10-24T19:04:22.549Z" }, - { url = "https://files.pythonhosted.org/packages/4e/64/48fffbd67fb418ab07451e4ce641a70de1c40c10a13e25325e24858ebe5a/hf_xet-1.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382", size = 2900866, upload-time = "2025-10-24T19:04:33.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861, upload-time = "2025-10-24T19:04:19.01Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699, upload-time = "2025-10-24T19:04:17.306Z" }, - { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885, upload-time = "2025-10-24T19:04:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550, upload-time = "2025-10-24T19:04:05.55Z" }, - { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010, upload-time = "2025-10-24T19:04:28.598Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264, upload-time = "2025-10-24T19:04:30.397Z" }, - { url = "https://files.pythonhosted.org/packages/17/b5/33764714923fa1ff922770f7ed18c2daae034d21ae6e10dbf4347c854154/hf_xet-1.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc", size = 2901071, upload-time = "2025-10-24T19:04:37.463Z" }, - { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099, upload-time = "2025-10-24T19:04:15.366Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178, upload-time = "2025-10-24T19:04:13.695Z" }, - { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214, upload-time = "2025-10-24T19:04:03.596Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054, upload-time = "2025-10-24T19:04:01.949Z" }, - { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812, upload-time = "2025-10-24T19:04:24.585Z" }, - { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920, upload-time = "2025-10-24T19:04:26.927Z" }, - { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735, upload-time = "2025-10-24T19:04:35.928Z" }, +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/92/ec9ad04d0b5728dca387a45af7bc98fbb0d73b2118759f5f6038b61a57e8/hf_xet-1.4.3.tar.gz", hash = "sha256:8ddedb73c8c08928c793df2f3401ec26f95be7f7e516a7bee2fbb546f6676113", size = 670477, upload-time = "2026-03-31T22:40:07.874Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/43/724d307b34e353da0abd476e02f72f735cdd2bc86082dee1b32ea0bfee1d/hf_xet-1.4.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:7551659ba4f1e1074e9623996f28c3873682530aee0a846b7f2f066239228144", size = 3800935, upload-time = "2026-03-31T22:39:49.618Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d2/8bee5996b699262edb87dbb54118d287c0e1b2fc78af7cdc41857ba5e3c4/hf_xet-1.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bee693ada985e7045997f05f081d0e12c4c08bd7626dc397f8a7c487e6c04f7f", size = 3558942, upload-time = "2026-03-31T22:39:47.938Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a1/e993d09cbe251196fb60812b09a58901c468127b7259d2bf0f68bf6088eb/hf_xet-1.4.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21644b404bb0100fe3857892f752c4d09642586fd988e61501c95bbf44b393a3", size = 4207657, upload-time = "2026-03-31T22:39:39.69Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/9eb6d21e5c34c63e5e399803a6932fa983cabdf47c0ecbcfe7ea97684b8c/hf_xet-1.4.3-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:987f09cfe418237812896a6736b81b1af02a3a6dcb4b4944425c4c4fca7a7cf8", size = 3986765, upload-time = "2026-03-31T22:39:37.936Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/8ad6f16fdb82f5f7284a34b5ec48645bd575bdcd2f6f0d1644775909c486/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:60cf7fc43a99da0a853345cf86d23738c03983ee5249613a6305d3e57a5dca74", size = 4188162, upload-time = "2026-03-31T22:39:58.382Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c4/39d6e136cbeea9ca5a23aad4b33024319222adbdc059ebcda5fc7d9d5ff4/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2815a49a7a59f3e2edf0cf113ae88e8cb2ca2a221bf353fb60c609584f4884d4", size = 4424525, upload-time = "2026-03-31T22:40:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/46/f2/adc32dae6bdbc367853118b9878139ac869419a4ae7ba07185dc31251b76/hf_xet-1.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:42ee323265f1e6a81b0e11094564fb7f7e0ec75b5105ffd91ae63f403a11931b", size = 3671610, upload-time = "2026-03-31T22:40:10.42Z" }, + { url = "https://files.pythonhosted.org/packages/e2/19/25d897dcc3f81953e0c2cde9ec186c7a0fee413eb0c9a7a9130d87d94d3a/hf_xet-1.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:27c976ba60079fb8217f485b9c5c7fcd21c90b0367753805f87cb9f3cdc4418a", size = 3528529, upload-time = "2026-03-31T22:40:09.106Z" }, + { url = "https://files.pythonhosted.org/packages/ec/36/3e8f85ca9fe09b8de2b2e10c63b3b3353d7dda88a0b3d426dffbe7b8313b/hf_xet-1.4.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5251d5ece3a81815bae9abab41cf7ddb7bcb8f56411bce0827f4a3071c92fdc6", size = 3801019, upload-time = "2026-03-31T22:39:56.651Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9c/defb6cb1de28bccb7bd8d95f6e60f72a3d3fa4cb3d0329c26fb9a488bfe7/hf_xet-1.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1feb0f3abeacee143367c326a128a2e2b60868ec12a36c225afb1d6c5a05e6d2", size = 3558746, upload-time = "2026-03-31T22:39:54.766Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/8d001191893178ff8e826e46ad5299446e62b93cd164e17b0ffea08832ec/hf_xet-1.4.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b301fc150290ca90b4fccd079829b84bb4786747584ae08b94b4577d82fb791", size = 4207692, upload-time = "2026-03-31T22:39:46.246Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/6790b402803250e9936435613d3a78b9aaeee7973439f0918848dde58309/hf_xet-1.4.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d972fbe95ddc0d3c0fc49b31a8a69f47db35c1e3699bf316421705741aab6653", size = 3986281, upload-time = "2026-03-31T22:39:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/51/56/ea62552fe53db652a9099eda600b032d75554d0e86c12a73824bfedef88b/hf_xet-1.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c5b48db1ee344a805a1b9bd2cda9b6b65fe77ed3787bd6e87ad5521141d317cd", size = 4187414, upload-time = "2026-03-31T22:40:04.951Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f5/bc1456d4638061bea997e6d2db60a1a613d7b200e0755965ec312dc1ef79/hf_xet-1.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:22bdc1f5fb8b15bf2831440b91d1c9bbceeb7e10c81a12e8d75889996a5c9da8", size = 4424368, upload-time = "2026-03-31T22:40:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/e4/76/ab597bae87e1f06d18d3ecb8ed7f0d3c9a37037fc32ce76233d369273c64/hf_xet-1.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0392c79b7cf48418cd61478c1a925246cf10639f4cd9d94368d8ca1e8df9ea07", size = 3672280, upload-time = "2026-03-31T22:40:16.401Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/2e462d34e23a09a74d73785dbed71cc5dbad82a72eee2ad60a72a554155d/hf_xet-1.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:681c92a07796325778a79d76c67011764ecc9042a8c3579332b61b63ae512075", size = 3528945, upload-time = "2026-03-31T22:40:14.995Z" }, + { url = "https://files.pythonhosted.org/packages/ac/9f/9c23e4a447b8f83120798f9279d0297a4d1360bdbf59ef49ebec78fe2545/hf_xet-1.4.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d0da85329eaf196e03e90b84c2d0aca53bd4573d097a75f99609e80775f98025", size = 3805048, upload-time = "2026-03-31T22:39:53.105Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f8/7aacb8e5f4a7899d39c787b5984e912e6c18b11be136ef13947d7a66d265/hf_xet-1.4.3-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e23717ce4186b265f69afa66e6f0069fe7efbf331546f5c313d00e123dc84583", size = 3562178, upload-time = "2026-03-31T22:39:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/df/9a/a24b26dc8a65f0ecc0fe5be981a19e61e7ca963b85e062c083f3a9100529/hf_xet-1.4.3-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc360b70c815bf340ed56c7b8c63aacf11762a4b099b2fe2c9bd6d6068668c08", size = 4212320, upload-time = "2026-03-31T22:39:42.922Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/46d493db155d2ee2801b71fb1b0fd67696359047fdd8caee2c914cc50c79/hf_xet-1.4.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39f2d2e9654cd9b4319885733993807aab6de9dfbd34c42f0b78338d6617421f", size = 3991546, upload-time = "2026-03-31T22:39:41.335Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f5/067363e1c96c6b17256910830d1b54099d06287e10f4ec6ec4e7e08371fc/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:49ad8a8cead2b56051aa84d7fce3e1335efe68df3cf6c058f22a65513885baac", size = 4193200, upload-time = "2026-03-31T22:40:01.936Z" }, + { url = "https://files.pythonhosted.org/packages/42/4b/53951592882d9c23080c7644542fda34a3813104e9e11fa1a7d82d419cb8/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7716d62015477a70ea272d2d68cd7cad140f61c52ee452e133e139abfe2c17ba", size = 4429392, upload-time = "2026-03-31T22:40:03.492Z" }, + { url = "https://files.pythonhosted.org/packages/8a/21/75a6c175b4e79662ad8e62f46a40ce341d8d6b206b06b4320d07d55b188c/hf_xet-1.4.3-cp37-abi3-win_amd64.whl", hash = "sha256:6b591fcad34e272a5b02607485e4f2a1334aebf1bc6d16ce8eb1eb8978ac2021", size = 3677359, upload-time = "2026-03-31T22:40:13.619Z" }, + { url = "https://files.pythonhosted.org/packages/8a/7c/44314ecd0e89f8b2b51c9d9e5e7a60a9c1c82024ac471d415860557d3cd8/hf_xet-1.4.3-cp37-abi3-win_arm64.whl", hash = "sha256:7c2c7e20bcfcc946dc67187c203463f5e932e395845d098cc2a93f5b67ca0b47", size = 3533664, upload-time = "2026-03-31T22:40:12.152Z" }, ] [[package]] @@ -1058,7 +1114,7 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "1.4.1" +version = "1.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -1067,23 +1123,22 @@ dependencies = [ { name = "httpx" }, { name = "packaging" }, { name = "pyyaml" }, - { name = "shellingham" }, { name = "tqdm" }, - { name = "typer-slim" }, + { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload-time = "2026-02-06T09:20:03.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/89/ff/ec7ed2eb43bd7ce8bb2233d109cc235c3e807ffe5e469dc09db261fac05e/huggingface_hub-1.13.0.tar.gz", hash = "sha256:f6df2dac5abe82ce2fe05873d10d5ff47bc677d616a2f521f4ee26db9415d9d0", size = 781788, upload-time = "2026-04-30T11:57:33.858Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload-time = "2026-02-06T09:20:00.728Z" }, + { url = "https://files.pythonhosted.org/packages/93/db/4b1cdae9460ae1f3ca020cd767f013430ce23eb1d9c890ae3a0609b38d26/huggingface_hub-1.13.0-py3-none-any.whl", hash = "sha256:e942cb50d6a08dd5306688b1ac05bda157fd2fcc88b63dae405f7bd0d3234005", size = 660643, upload-time = "2026-04-30T11:57:31.802Z" }, ] [[package]] name = "idna" -version = "3.11" +version = "3.13" 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/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } 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/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, ] [[package]] @@ -1121,11 +1176,11 @@ wheels = [ [[package]] name = "jaraco-context" -version = "6.1.0" +version = "6.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/9c/a788f5bb29c61e456b8ee52ce76dbdd32fd72cd73dd67bc95f42c7a8d13c/jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", size = 15850, upload-time = "2026-01-13T02:53:53.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda", size = 7065, upload-time = "2026-01-13T02:53:53.031Z" }, + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, ] [[package]] @@ -1163,70 +1218,95 @@ wheels = [ [[package]] name = "jiter" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/30/7687e4f87086829955013ca12a9233523349767f69653ebc27036313def9/jiter-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0a2bd69fc1d902e89925fc34d1da51b2128019423d7b339a45d9e99c894e0663", size = 307958, upload-time = "2026-02-02T12:35:57.165Z" }, - { url = "https://files.pythonhosted.org/packages/c3/27/e57f9a783246ed95481e6749cc5002a8a767a73177a83c63ea71f0528b90/jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505", size = 318597, upload-time = "2026-02-02T12:35:58.591Z" }, - { url = "https://files.pythonhosted.org/packages/cf/52/e5719a60ac5d4d7c5995461a94ad5ef962a37c8bf5b088390e6fad59b2ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152", size = 348821, upload-time = "2026-02-02T12:36:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/61/db/c1efc32b8ba4c740ab3fc2d037d8753f67685f475e26b9d6536a4322bcdd/jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726", size = 364163, upload-time = "2026-02-02T12:36:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/55/8a/fb75556236047c8806995671a18e4a0ad646ed255276f51a20f32dceaeec/jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0", size = 483709, upload-time = "2026-02-02T12:36:03.41Z" }, - { url = "https://files.pythonhosted.org/packages/7e/16/43512e6ee863875693a8e6f6d532e19d650779d6ba9a81593ae40a9088ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089", size = 370480, upload-time = "2026-02-02T12:36:04.791Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4c/09b93e30e984a187bc8aaa3510e1ec8dcbdcd71ca05d2f56aac0492453aa/jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93", size = 360735, upload-time = "2026-02-02T12:36:06.994Z" }, - { url = "https://files.pythonhosted.org/packages/1a/1b/46c5e349019874ec5dfa508c14c37e29864ea108d376ae26d90bee238cd7/jiter-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b88d649135aca526da172e48083da915ec086b54e8e73a425ba50999468cc08", size = 391814, upload-time = "2026-02-02T12:36:08.368Z" }, - { url = "https://files.pythonhosted.org/packages/15/9e/26184760e85baee7162ad37b7912797d2077718476bf91517641c92b3639/jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2", size = 513990, upload-time = "2026-02-02T12:36:09.993Z" }, - { url = "https://files.pythonhosted.org/packages/e9/34/2c9355247d6debad57a0a15e76ab1566ab799388042743656e566b3b7de1/jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228", size = 548021, upload-time = "2026-02-02T12:36:11.376Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4a/9f2c23255d04a834398b9c2e0e665382116911dc4d06b795710503cdad25/jiter-0.13.0-cp312-cp312-win32.whl", hash = "sha256:0bf670e3b1445fc4d31612199f1744f67f889ee1bbae703c4b54dc097e5dd394", size = 203024, upload-time = "2026-02-02T12:36:12.682Z" }, - { url = "https://files.pythonhosted.org/packages/09/ee/f0ae675a957ae5a8f160be3e87acea6b11dc7b89f6b7ab057e77b2d2b13a/jiter-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:15db60e121e11fe186c0b15236bd5d18381b9ddacdcf4e659feb96fc6c969c92", size = 205424, upload-time = "2026-02-02T12:36:13.93Z" }, - { url = "https://files.pythonhosted.org/packages/1b/02/ae611edf913d3cbf02c97cdb90374af2082c48d7190d74c1111dde08bcdd/jiter-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:41f92313d17989102f3cb5dd533a02787cdb99454d494344b0361355da52fcb9", size = 186818, upload-time = "2026-02-02T12:36:15.308Z" }, - { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload-time = "2026-02-02T12:36:16.748Z" }, - { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload-time = "2026-02-02T12:36:18.351Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload-time = "2026-02-02T12:36:19.746Z" }, - { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload-time = "2026-02-02T12:36:21.243Z" }, - { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload-time = "2026-02-02T12:36:22.688Z" }, - { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload-time = "2026-02-02T12:36:24.106Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload-time = "2026-02-02T12:36:25.519Z" }, - { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload-time = "2026-02-02T12:36:26.866Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload-time = "2026-02-02T12:36:28.217Z" }, - { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload-time = "2026-02-02T12:36:29.678Z" }, - { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload-time = "2026-02-02T12:36:31.808Z" }, - { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload-time = "2026-02-02T12:36:33.679Z" }, - { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload-time = "2026-02-02T12:36:35.065Z" }, - { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload-time = "2026-02-02T12:36:36.579Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload-time = "2026-02-02T12:36:38.058Z" }, - { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload-time = "2026-02-02T12:36:39.417Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload-time = "2026-02-02T12:36:40.791Z" }, - { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload-time = "2026-02-02T12:36:42.077Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f5/f1997e987211f6f9bd71b8083047b316208b4aca0b529bb5f8c96c89ef3e/jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0", size = 308804, upload-time = "2026-02-02T12:36:43.496Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8f/5482a7677731fd44881f0204981ce2d7175db271f82cba2085dd2212e095/jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91", size = 318787, upload-time = "2026-02-02T12:36:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b9/7257ac59778f1cd025b26a23c5520a36a424f7f1b068f2442a5b499b7464/jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09", size = 353880, upload-time = "2026-02-02T12:36:47.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/87/719eec4a3f0841dad99e3d3604ee4cba36af4419a76f3cb0b8e2e691ad67/jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607", size = 366702, upload-time = "2026-02-02T12:36:48.871Z" }, - { url = "https://files.pythonhosted.org/packages/d2/65/415f0a75cf6921e43365a1bc227c565cb949caca8b7532776e430cbaa530/jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66", size = 486319, upload-time = "2026-02-02T12:36:53.006Z" }, - { url = "https://files.pythonhosted.org/packages/54/a2/9e12b48e82c6bbc6081fd81abf915e1443add1b13d8fc586e1d90bb02bb8/jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2", size = 372289, upload-time = "2026-02-02T12:36:54.593Z" }, - { url = "https://files.pythonhosted.org/packages/4e/c1/e4693f107a1789a239c759a432e9afc592366f04e901470c2af89cfd28e1/jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad", size = 360165, upload-time = "2026-02-02T12:36:56.112Z" }, - { url = "https://files.pythonhosted.org/packages/17/08/91b9ea976c1c758240614bd88442681a87672eebc3d9a6dde476874e706b/jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d", size = 389634, upload-time = "2026-02-02T12:36:57.495Z" }, - { url = "https://files.pythonhosted.org/packages/18/23/58325ef99390d6d40427ed6005bf1ad54f2577866594bcf13ce55675f87d/jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df", size = 514933, upload-time = "2026-02-02T12:36:58.909Z" }, - { url = "https://files.pythonhosted.org/packages/5b/25/69f1120c7c395fd276c3996bb8adefa9c6b84c12bb7111e5c6ccdcd8526d/jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d", size = 548842, upload-time = "2026-02-02T12:37:00.433Z" }, - { url = "https://files.pythonhosted.org/packages/18/05/981c9669d86850c5fbb0d9e62bba144787f9fba84546ba43d624ee27ef29/jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6", size = 202108, upload-time = "2026-02-02T12:37:01.718Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/cdcf54dd0b0341db7d25413229888a346c7130bd20820530905fdb65727b/jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f", size = 204027, upload-time = "2026-02-02T12:37:03.075Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f9/724bcaaab7a3cd727031fe4f6995cb86c4bd344909177c186699c8dec51a/jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d", size = 187199, upload-time = "2026-02-02T12:37:04.414Z" }, - { url = "https://files.pythonhosted.org/packages/62/92/1661d8b9fd6a3d7a2d89831db26fe3c1509a287d83ad7838831c7b7a5c7e/jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0", size = 318423, upload-time = "2026-02-02T12:37:05.806Z" }, - { url = "https://files.pythonhosted.org/packages/4f/3b/f77d342a54d4ebcd128e520fc58ec2f5b30a423b0fd26acdfc0c6fef8e26/jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40", size = 351438, upload-time = "2026-02-02T12:37:07.189Z" }, - { url = "https://files.pythonhosted.org/packages/76/b3/ba9a69f0e4209bd3331470c723c2f5509e6f0482e416b612431a5061ed71/jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202", size = 364774, upload-time = "2026-02-02T12:37:08.579Z" }, - { url = "https://files.pythonhosted.org/packages/b3/16/6cdb31fa342932602458dbb631bfbd47f601e03d2e4950740e0b2100b570/jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0", size = 487238, upload-time = "2026-02-02T12:37:10.066Z" }, - { url = "https://files.pythonhosted.org/packages/ed/b1/956cc7abaca8d95c13aa8d6c9b3f3797241c246cd6e792934cc4c8b250d2/jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95", size = 372892, upload-time = "2026-02-02T12:37:11.656Z" }, - { url = "https://files.pythonhosted.org/packages/26/c4/97ecde8b1e74f67b8598c57c6fccf6df86ea7861ed29da84629cdbba76c4/jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59", size = 360309, upload-time = "2026-02-02T12:37:13.244Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d7/eabe3cf46715854ccc80be2cd78dd4c36aedeb30751dbf85a1d08c14373c/jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe", size = 389607, upload-time = "2026-02-02T12:37:14.881Z" }, - { url = "https://files.pythonhosted.org/packages/df/2d/03963fc0804e6109b82decfb9974eb92df3797fe7222428cae12f8ccaa0c/jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939", size = 514986, upload-time = "2026-02-02T12:37:16.326Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/8c83b45eb3eb1c1e18d841fe30b4b5bc5619d781267ca9bc03e005d8fd0a/jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9", size = 548756, upload-time = "2026-02-02T12:37:17.736Z" }, - { url = "https://files.pythonhosted.org/packages/47/66/eea81dfff765ed66c68fd2ed8c96245109e13c896c2a5015c7839c92367e/jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6", size = 201196, upload-time = "2026-02-02T12:37:19.101Z" }, - { url = "https://files.pythonhosted.org/packages/ff/32/4ac9c7a76402f8f00d00842a7f6b83b284d0cf7c1e9d4227bc95aa6d17fa/jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8", size = 204215, upload-time = "2026-02-02T12:37:20.495Z" }, - { url = "https://files.pythonhosted.org/packages/f9/8e/7def204fea9f9be8b3c21a6f2dd6c020cf56c7d5ff753e0e23ed7f9ea57e/jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024", size = 187152, upload-time = "2026-02-02T12:37:22.124Z" }, - { url = "https://files.pythonhosted.org/packages/80/60/e50fa45dd7e2eae049f0ce964663849e897300433921198aef94b6ffa23a/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:3d744a6061afba08dd7ae375dcde870cffb14429b7477e10f67e9e6d68772a0a", size = 305169, upload-time = "2026-02-02T12:37:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/d2/73/a009f41c5eed71c49bec53036c4b33555afcdee70682a18c6f66e396c039/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f", size = 303808, upload-time = "2026-02-02T12:37:52.092Z" }, - { url = "https://files.pythonhosted.org/packages/c4/10/528b439290763bff3d939268085d03382471b442f212dca4ff5f12802d43/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59", size = 337384, upload-time = "2026-02-02T12:37:53.582Z" }, - { url = "https://files.pythonhosted.org/packages/67/8a/a342b2f0251f3dac4ca17618265d93bf244a2a4d089126e81e4c1056ac50/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19", size = 343768, upload-time = "2026-02-02T12:37:55.055Z" }, +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, + { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, + { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, + { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, + { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, + { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, + { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, + { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, + { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, + { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, + { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "joserfc" +version = "1.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/c6/de8fdbdfa75c8ca04fead38a82d573df8a82906e984c349d58665f459558/joserfc-1.6.4.tar.gz", hash = "sha256:34ce5f499bfcc5e9ad4cc75077f9278ab3227b71da9aaf28f9ab705f8a560d3c", size = 231866, upload-time = "2026-04-13T13:15:40.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/f7/210b27752e972edb36d239315b08d3eb6b14824cc4a590da2337d195260b/joserfc-1.6.4-py3-none-any.whl", hash = "sha256:3e4a22b509b41908989237a045e25c8308d5fd47ab96bdae2dd8057c6451003a", size = 70464, upload-time = "2026-04-13T13:15:39.259Z" }, ] [[package]] @@ -1276,17 +1356,16 @@ wheels = [ [[package]] name = "jsonschema-path" -version = "0.3.4" +version = "0.4.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pathable" }, { name = "pyyaml" }, { name = "referencing" }, - { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159, upload-time = "2025-01-24T14:33:16.547Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/86/cfee6dd25843bec0760f456599a4f7e7e40221a934b9229fda0662c859bc/jsonschema_path-0.4.6.tar.gz", hash = "sha256:c89eb635f4d497c9ac328eeff359c489755838806a7d033510a692e9576f5c4b", size = 15302, upload-time = "2026-04-27T18:57:08.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/58/3485da8cb93d2f393bce453adeef16896751f14ba3e2024bc21dc9597646/jsonschema_path-0.3.4-py3-none-any.whl", hash = "sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8", size = 14810, upload-time = "2025-01-24T14:33:14.652Z" }, + { url = "https://files.pythonhosted.org/packages/6c/43/3d3065c05a04bb550c143bfbb8e4fd7022cd327e1082bf257bac74923783/jsonschema_path-0.4.6-py3-none-any.whl", hash = "sha256:451354b5311fa955c3144e6e4e255388c751c0121c5570ec5bb9291dd42d08c9", size = 19565, upload-time = "2026-04-27T18:57:06.792Z" }, ] [[package]] @@ -1320,38 +1399,39 @@ wheels = [ [[package]] name = "langchain" -version = "1.2.15" +version = "1.2.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/3f/888a7099d2bd2917f8b0c3ffc7e347f1e664cf64267820b0b923c4f339fc/langchain-1.2.15.tar.gz", hash = "sha256:1717b6719daefae90b2728314a5e2a117ff916291e2862595b6c3d6fba33d652", size = 574732, upload-time = "2026-04-03T14:26:03.994Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/35/322d13339acb61d7a733d03a73a9ade968c64ac0eb982f497d24e22a998f/langchain-1.2.17.tar.gz", hash = "sha256:c30b578c0eebbde8bec9247dbbbae1a791128557b99b65c8be1e007040975d09", size = 577779, upload-time = "2026-04-30T20:25:34.626Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/e8/a3b8cb0005553f6a876865073c81ef93bd7c5b18381bcb9ba4013af96ebc/langchain-1.2.15-py3-none-any.whl", hash = "sha256:e349db349cb3e9550c4044077cf90a1717691756cc236438404b23500e615874", size = 112714, upload-time = "2026-04-03T14:26:02.557Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/b183dba8667f7b6d1be546fb8089a3bc3bc12b514f551f5317ae03815770/langchain-1.2.17-py3-none-any.whl", hash = "sha256:ff881cdfbe90e0b6afac42eea7999657c282cc73db059c910d803f4e9f8ff305", size = 113131, upload-time = "2026-04-30T20:25:32.895Z" }, ] [[package]] name = "langchain-anthropic" -version = "1.4.1" +version = "1.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, { name = "langchain-core" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/19/55e0d3548a4d85ccee630fcfc0979af54ff4ea4f39ab0ed1ed3c6bf25f4e/langchain_anthropic-1.4.1.tar.gz", hash = "sha256:e17d027091438620e35ff2f06aefdfd63c8dcdf6abc606009ddfe3c764f2bc2e", size = 676043, upload-time = "2026-04-17T14:26:17.31Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/e3/d2f9dec95602524b1cfb4be2747ba5bc38d32501b2a56cb4bcb76e80bb45/langchain_anthropic-1.4.3.tar.gz", hash = "sha256:f8a2442463c0629b1b3110eaeaa56fdbdc87df2a802f8c7f5ecf611eb4874ec8", size = 685219, upload-time = "2026-05-03T17:33:27.118Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/0a/20625dfea38a26e8b43654e18cafbc3595e7dc223da80f23d4fa8451dc1d/langchain_anthropic-1.4.1-py3-none-any.whl", hash = "sha256:5a48afbb2b1bad9c46badaccc8e23b0dd7ae07b7583f76bac21ddb3dac831efd", size = 49020, upload-time = "2026-04-17T14:26:15.989Z" }, + { url = "https://files.pythonhosted.org/packages/d3/55/482a1968c95275e8be6d8c1e53b54f0f7be0b8b155ce1608c947a95cf543/langchain_anthropic-1.4.3-py3-none-any.whl", hash = "sha256:65466e0f2f95909a009708f2958e917dfdbfab79c612b4484a30866a85e1f291", size = 50389, upload-time = "2026-05-03T17:33:25.671Z" }, ] [[package]] name = "langchain-core" -version = "1.3.0" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, + { name = "langchain-protocol" }, { name = "langsmith" }, { name = "packaging" }, { name = "pydantic" }, @@ -1360,9 +1440,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/fe/20190232d9b513242899dbb0c2bb77e31b4d61e343743adbe90ebc2603d2/langchain_core-1.3.0.tar.gz", hash = "sha256:14a39f528bf459aa3aa40d0a7f7f1bae7520d435ef991ae14a4ceb74d8c49046", size = 860755, upload-time = "2026-04-17T14:51:38.298Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/03/7219502e8ca728d65eb44d7a3eb60239230742a70dbfc9241b9bfd61c4ab/langchain_core-1.3.2.tar.gz", hash = "sha256:fd7a50b2f28ba561fd9d7f5d2760bc9e06cf00cdf820a3ccafe88a94ffa8d5b7", size = 911813, upload-time = "2026-04-24T15:49:23.699Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/e2/dbfa347aa072a6dc4cd38d6f9ebfc730b4c14c258c47f480f4c5c546f177/langchain_core-1.3.0-py3-none-any.whl", hash = "sha256:baf16ee028475df177b9ab8869a751c79406d64a6f12125b93802991b566cced", size = 515140, upload-time = "2026-04-17T14:51:36.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d5/8fa4431007cbb7cfed7590f4d6a5dea3ad724f4174d248f6642ef5ce7d05/langchain_core-1.3.2-py3-none-any.whl", hash = "sha256:d44a66127f9f8db735bdfd0ab9661bccb47a97113cfd3f2d89c74864422b7274", size = 542390, upload-time = "2026-04-24T15:49:21.991Z" }, ] [[package]] @@ -1396,21 +1476,33 @@ wheels = [ [[package]] name = "langchain-openai" -version = "1.1.15" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, { name = "tiktoken" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/1e/ed50e1c44f36be6ba97b56b09f1a6be5906098b4ba1e6f8a0f661a54a5f5/langchain_openai-1.1.15.tar.gz", hash = "sha256:16ddb7481853991fd00691dfd01bcc5cdf60cb36aa6962b38c8a4939f0538ba0", size = 1115780, upload-time = "2026-04-20T19:57:09.281Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/0e/d8e16c28aa67106d285e63b8ffc04c5af68341e345ce24a0751dbf2e167e/langchain_openai-1.2.1.tar.gz", hash = "sha256:ee4480b787706361b7125fad46930589a624df87aa158c6986ef1fad10d10675", size = 1146092, upload-time = "2026-04-24T19:46:43.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/55/2865b18ee3a3dd11160b8c4b2cf37e75bf2a4a8d1d38868ffffc7b7cc180/langchain_openai-1.2.1-py3-none-any.whl", hash = "sha256:a80732185030d4f453dda6c25feef46f645f665423fdffe38ae3edf1ac3c6c4d", size = 98626, upload-time = "2026-04-24T19:46:41.971Z" }, +] + +[[package]] +name = "langchain-protocol" +version = "0.0.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/24/9777489d6fbbee64af0c8f96d4f840239c408cf694f3394672807dafc490/langchain_protocol-0.0.15.tar.gz", hash = "sha256:9ab2d11ee73944754f10e037e717098d3a6796f0e58afa9cadda6154e7655ade", size = 5862, upload-time = "2026-05-01T22:30:04.748Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/29/a357935f8d75ce4fc7c32bbc887c026295e98a9e4ded6daf434d150c5d44/langchain_openai-1.1.15-py3-none-any.whl", hash = "sha256:069022b6cba2108fac2450d3bf6c888e20a2af92bf89b493638456ef4db0d900", size = 88797, upload-time = "2026-04-20T19:57:07.683Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7a/9c97a7b9cbe4c5dc6a44cdb1545450c28f0c8ce89b9c1f0ee7fbad896263/langchain_protocol-0.0.15-py3-none-any.whl", hash = "sha256:461eb794358f83d5e42635a5797799ffec7b4702314e34edf73ac21e75d3ef79", size = 6982, upload-time = "2026-05-01T22:30:03.877Z" }, ] [[package]] name = "langgraph" -version = "1.1.9" +version = "1.1.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, @@ -1420,35 +1512,35 @@ dependencies = [ { name = "pydantic" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/d5/9d9c65d5500a1ca7ea63d6d65aecfb248037018a74d7d4ef52e276bb4e4b/langgraph-1.1.9.tar.gz", hash = "sha256:bc5a49d5a5e71fda1f9c53c06c62f4caec9a95545b739d130a58b6ab3269e274", size = 560717, upload-time = "2026-04-21T13:43:06.809Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/b3/7dec224369c7938eb3227ff69542a0d0f517862a0d27945b8c395f2a781f/langgraph-1.1.10.tar.gz", hash = "sha256:3115beb58203283c98d8752a90c034f3432177d2979a1fe205f76e5f1b744500", size = 560685, upload-time = "2026-04-27T17:19:10.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/58/0380420e66619d12c992c1f8cfda0c7a04e8f0fe8a84752245b9e7b1cba7/langgraph-1.1.9-py3-none-any.whl", hash = "sha256:7db13ceecde4ea643df6c097dcc9e534895dcd9fcc6500eeff2f2cde0fab16b2", size = 173744, upload-time = "2026-04-21T13:43:05.513Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/057dc1aa7991115fca53f1fa6573a7cc0dd296c05360c672cc67fdb6245b/langgraph-1.1.10-py3-none-any.whl", hash = "sha256:8a4f163f72f4401648d0c11b48ee906947d938ba8cf1f474540fe591534f0d17", size = 173750, upload-time = "2026-04-27T17:19:09.073Z" }, ] [[package]] name = "langgraph-checkpoint" -version = "4.0.2" +version = "4.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "ormsgpack" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/cf8086e1f1a3358d9228805614e72602c281b18307f3fae64a5b854aad2d/langgraph_checkpoint-4.0.2.tar.gz", hash = "sha256:4f6f99cba8e272deabf81b2d8cdc96582af07a57a6ad591cdf216bb310497039", size = 160810, upload-time = "2026-04-15T21:03:00.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/e1/885e49cdafceb4c74dae4573bc5dd6054c6c640382ee73104532f33dca46/langgraph_checkpoint-4.0.3.tar.gz", hash = "sha256:a7b5e2ca18fb79b55edf19396d4ee446f8a53dcb7a4ec62ce6f1c7e00bb5af7f", size = 174009, upload-time = "2026-04-27T14:34:02.777Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/5a/6dba29dd89b0a46ae21c707da0f9d17e94f27d3e481ed15bc99d6bd20aa6/langgraph_checkpoint-4.0.2-py3-none-any.whl", hash = "sha256:59b0f29216128a629c58dd07c98aa004f82f51805d5573126ffb419b753ff253", size = 51000, upload-time = "2026-04-15T21:02:59.096Z" }, + { url = "https://files.pythonhosted.org/packages/19/ee/ecd3fa2e893746dde3b768daca2a4935208bc77d09445437ccfffb4a8c9b/langgraph_checkpoint-4.0.3-py3-none-any.whl", hash = "sha256:b91b765712a2311a5b198760f714b7ab9b376d01c047ed78d9b9a3e80df802a3", size = 51682, upload-time = "2026-04-27T14:34:01.51Z" }, ] [[package]] name = "langgraph-prebuilt" -version = "1.0.10" +version = "1.0.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/01471b1b5601f2e9c9a69c39fc9a2fb8611613ede0002e5a2b81c0acd850/langgraph_prebuilt-1.0.10.tar.gz", hash = "sha256:5a6fc513f8907074563b6218ff991c4ed9db19ac63101314919686e8029ddb07", size = 169769, upload-time = "2026-04-17T17:59:45.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/a4/f8ac75fa7c503103f0cf7680944e28bbaaef74c19a8d163d7346869cc369/langgraph_prebuilt-1.0.13.tar.gz", hash = "sha256:ad219782a80e1718e7e7794de49e0ae307111d45cbcffab9a52725a66a609456", size = 172913, upload-time = "2026-04-30T01:48:15.742Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/49/d073375beabdc6955df6cbe570ba7786836bd4c817ae998955d35037f2fd/langgraph_prebuilt-1.0.10-py3-none-any.whl", hash = "sha256:e3baa1977d819982e690a357ba5bb77ccc1d4d8d4a029c48e502a3b6d171185f", size = 36086, upload-time = "2026-04-17T17:59:44.395Z" }, + { url = "https://files.pythonhosted.org/packages/69/ef/5ada0bef4013ef5ae53a0ca1de5736517f1076a54d313f156ca545ec65d5/langgraph_prebuilt-1.0.13-py3-none-any.whl", hash = "sha256:7055e9fad41fbd3593800aed0aea0a6e974b17f33ed51b80d3d3a031212dd7c0", size = 37214, upload-time = "2026-04-30T01:48:14.507Z" }, ] [[package]] @@ -1466,7 +1558,7 @@ wheels = [ [[package]] name = "langsmith" -version = "0.7.33" +version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -1479,9 +1571,9 @@ dependencies = [ { name = "xxhash" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/75/1ee27b3510bf5b1b569b9695c9466c256caab45885bd569c0c67720236ad/langsmith-0.7.33.tar.gz", hash = "sha256:fa2d81ad6e8374a81fda9291894f6fcae714e55fbf11a0b07578e3cd4b1ea384", size = 1186298, upload-time = "2026-04-20T16:17:54.583Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/64/95f1f013531395f4e8ed73caeee780f65c7c58fe028cb543f8937b45611b/langsmith-0.8.0.tar.gz", hash = "sha256:59fe5b2a56bbbe14a08aa76691f84b49e8675dd21e11b57d80c6db8c08bac2e3", size = 4432996, upload-time = "2026-04-30T22:13:07.341Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/76/53033db34ffccd25d62c32b23b9468f7228b455da6976e1c420ae31555c4/langsmith-0.7.33-py3-none-any.whl", hash = "sha256:5b535b991d52d3b664ebb8dc6f95afcf8d0acb42e062ac45a54a6a4820139f20", size = 378981, upload-time = "2026-04-20T16:17:52.503Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e1/a4be2e696c9473bb53298df398237da5674704d781d4b748ed35aeef592a/langsmith-0.8.0-py3-none-any.whl", hash = "sha256:12cc4bc5622b835a6d841964d6034df3617bdb912dae0c1381fd0a68a9b3a3ef", size = 393268, upload-time = "2026-04-30T22:13:05.56Z" }, ] [[package]] @@ -1507,58 +1599,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/f3/fffb7932870163cea7addc392165647a9a8a5489967de486c854226f1141/litellm-1.81.13-py3-none-any.whl", hash = "sha256:ae4aea2a55e85993f5f6dd36d036519422d24812a1a3e8540d9e987f2d7a4304", size = 14587505, upload-time = "2026-02-17T02:00:44.22Z" }, ] -[[package]] -name = "lupa" -version = "2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b8/1c/191c3e6ec6502e3dbe25a53e27f69a5daeac3e56de1f73c0138224171ead/lupa-2.6.tar.gz", hash = "sha256:9a770a6e89576be3447668d7ced312cd6fd41d3c13c2462c9dc2c2ab570e45d9", size = 7240282, upload-time = "2025-10-24T07:20:29.738Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/86/ce243390535c39d53ea17ccf0240815e6e457e413e40428a658ea4ee4b8d/lupa-2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47ce718817ef1cc0c40d87c3d5ae56a800d61af00fbc0fad1ca9be12df2f3b56", size = 951707, upload-time = "2025-10-24T07:18:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/86/85/cedea5e6cbeb54396fdcc55f6b741696f3f036d23cfaf986d50d680446da/lupa-2.6-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:7aba985b15b101495aa4b07112cdc08baa0c545390d560ad5cfde2e9e34f4d58", size = 1916703, upload-time = "2025-10-24T07:18:05.6Z" }, - { url = "https://files.pythonhosted.org/packages/24/be/3d6b5f9a8588c01a4d88129284c726017b2089f3a3fd3ba8bd977292fea0/lupa-2.6-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:b766f62f95b2739f2248977d29b0722e589dcf4f0ccfa827ccbd29f0148bd2e5", size = 985152, upload-time = "2025-10-24T07:18:08.561Z" }, - { url = "https://files.pythonhosted.org/packages/eb/23/9f9a05beee5d5dce9deca4cb07c91c40a90541fc0a8e09db4ee670da550f/lupa-2.6-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:00a934c23331f94cb51760097ebfab14b005d55a6b30a2b480e3c53dd2fa290d", size = 1159599, upload-time = "2025-10-24T07:18:10.346Z" }, - { url = "https://files.pythonhosted.org/packages/40/4e/e7c0583083db9d7f1fd023800a9767d8e4391e8330d56c2373d890ac971b/lupa-2.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21de9f38bd475303e34a042b7081aabdf50bd9bafd36ce4faea2f90fd9f15c31", size = 1038686, upload-time = "2025-10-24T07:18:12.112Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9f/5a4f7d959d4feba5e203ff0c31889e74d1ca3153122be4a46dca7d92bf7c/lupa-2.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf3bda96d3fc41237e964a69c23647d50d4e28421111360274d4799832c560e9", size = 2071956, upload-time = "2025-10-24T07:18:14.572Z" }, - { url = "https://files.pythonhosted.org/packages/92/34/2f4f13ca65d01169b1720176aedc4af17bc19ee834598c7292db232cb6dc/lupa-2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a76ead245da54801a81053794aa3975f213221f6542d14ec4b859ee2e7e0323", size = 1057199, upload-time = "2025-10-24T07:18:16.379Z" }, - { url = "https://files.pythonhosted.org/packages/35/2a/5f7d2eebec6993b0dcd428e0184ad71afb06a45ba13e717f6501bfed1da3/lupa-2.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8dd0861741caa20886ddbda0a121d8e52fb9b5bb153d82fa9bba796962bf30e8", size = 1173693, upload-time = "2025-10-24T07:18:18.153Z" }, - { url = "https://files.pythonhosted.org/packages/e4/29/089b4d2f8e34417349af3904bb40bec40b65c8731f45e3fd8d497ca573e5/lupa-2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:239e63948b0b23023f81d9a19a395e768ed3da6a299f84e7963b8f813f6e3f9c", size = 2164394, upload-time = "2025-10-24T07:18:20.403Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1b/79c17b23c921f81468a111cad843b076a17ef4b684c4a8dff32a7969c3f0/lupa-2.6-cp312-cp312-win32.whl", hash = "sha256:325894e1099499e7a6f9c351147661a2011887603c71086d36fe0f964d52d1ce", size = 1420647, upload-time = "2025-10-24T07:18:23.368Z" }, - { url = "https://files.pythonhosted.org/packages/b8/15/5121e68aad3584e26e1425a5c9a79cd898f8a152292059e128c206ee817c/lupa-2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c735a1ce8ee60edb0fe71d665f1e6b7c55c6021f1d340eb8c865952c602cd36f", size = 1688529, upload-time = "2025-10-24T07:18:25.523Z" }, - { url = "https://files.pythonhosted.org/packages/28/1d/21176b682ca5469001199d8b95fa1737e29957a3d185186e7a8b55345f2e/lupa-2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:663a6e58a0f60e7d212017d6678639ac8df0119bc13c2145029dcba084391310", size = 947232, upload-time = "2025-10-24T07:18:27.878Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4c/d327befb684660ca13cf79cd1f1d604331808f9f1b6fb6bf57832f8edf80/lupa-2.6-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:d1f5afda5c20b1f3217a80e9bc1b77037f8a6eb11612fd3ada19065303c8f380", size = 1908625, upload-time = "2025-10-24T07:18:29.944Z" }, - { url = "https://files.pythonhosted.org/packages/66/8e/ad22b0a19454dfd08662237a84c792d6d420d36b061f239e084f29d1a4f3/lupa-2.6-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:26f2b3c085fe76e9119e48c1013c1cccdc1f51585d456858290475aa38e7089e", size = 981057, upload-time = "2025-10-24T07:18:31.553Z" }, - { url = "https://files.pythonhosted.org/packages/5c/48/74859073ab276bd0566c719f9ca0108b0cfc1956ca0d68678d117d47d155/lupa-2.6-cp313-cp313-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:60d2f902c7b96fb8ab98493dcff315e7bb4d0b44dc9dd76eb37de575025d5685", size = 1156227, upload-time = "2025-10-24T07:18:33.981Z" }, - { url = "https://files.pythonhosted.org/packages/09/6c/0e9ded061916877253c2266074060eb71ed99fb21d73c8c114a76725bce2/lupa-2.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a02d25dee3a3250967c36590128d9220ae02f2eda166a24279da0b481519cbff", size = 1035752, upload-time = "2025-10-24T07:18:36.32Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ef/f8c32e454ef9f3fe909f6c7d57a39f950996c37a3deb7b391fec7903dab7/lupa-2.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6eae1ee16b886b8914ff292dbefbf2f48abfbdee94b33a88d1d5475e02423203", size = 2069009, upload-time = "2025-10-24T07:18:38.072Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/15b80c226a5225815a890ee1c11f07968e0aba7a852df41e8ae6fe285063/lupa-2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0edd5073a4ee74ab36f74fe61450148e6044f3952b8d21248581f3c5d1a58be", size = 1056301, upload-time = "2025-10-24T07:18:40.165Z" }, - { url = "https://files.pythonhosted.org/packages/31/14/2086c1425c985acfb30997a67e90c39457122df41324d3c179d6ee2292c6/lupa-2.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c53ee9f22a8a17e7d4266ad48e86f43771951797042dd51d1494aaa4f5f3f0a", size = 1170673, upload-time = "2025-10-24T07:18:42.426Z" }, - { url = "https://files.pythonhosted.org/packages/10/e5/b216c054cf86576c0191bf9a9f05de6f7e8e07164897d95eea0078dca9b2/lupa-2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:de7c0f157a9064a400d828789191a96da7f4ce889969a588b87ec80de9b14772", size = 2162227, upload-time = "2025-10-24T07:18:46.112Z" }, - { url = "https://files.pythonhosted.org/packages/59/2f/33ecb5bedf4f3bc297ceacb7f016ff951331d352f58e7e791589609ea306/lupa-2.6-cp313-cp313-win32.whl", hash = "sha256:ee9523941ae0a87b5b703417720c5d78f72d2f5bc23883a2ea80a949a3ed9e75", size = 1419558, upload-time = "2025-10-24T07:18:48.371Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b4/55e885834c847ea610e111d87b9ed4768f0afdaeebc00cd46810f25029f6/lupa-2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b1335a5835b0a25ebdbc75cf0bda195e54d133e4d994877ef025e218c2e59db9", size = 1683424, upload-time = "2025-10-24T07:18:50.976Z" }, - { url = "https://files.pythonhosted.org/packages/66/9d/d9427394e54d22a35d1139ef12e845fd700d4872a67a34db32516170b746/lupa-2.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dcb6d0a3264873e1653bc188499f48c1fb4b41a779e315eba45256cfe7bc33c1", size = 953818, upload-time = "2025-10-24T07:18:53.378Z" }, - { url = "https://files.pythonhosted.org/packages/10/41/27bbe81953fb2f9ecfced5d9c99f85b37964cfaf6aa8453bb11283983721/lupa-2.6-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:a37e01f2128f8c36106726cb9d360bac087d58c54b4522b033cc5691c584db18", size = 1915850, upload-time = "2025-10-24T07:18:55.259Z" }, - { url = "https://files.pythonhosted.org/packages/a3/98/f9ff60db84a75ba8725506bbf448fb085bc77868a021998ed2a66d920568/lupa-2.6-cp314-cp314-macosx_11_0_x86_64.whl", hash = "sha256:458bd7e9ff3c150b245b0fcfbb9bd2593d1152ea7f0a7b91c1d185846da033fe", size = 982344, upload-time = "2025-10-24T07:18:57.05Z" }, - { url = "https://files.pythonhosted.org/packages/41/f7/f39e0f1c055c3b887d86b404aaf0ca197b5edfd235a8b81b45b25bac7fc3/lupa-2.6-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:052ee82cac5206a02df77119c325339acbc09f5ce66967f66a2e12a0f3211cad", size = 1156543, upload-time = "2025-10-24T07:18:59.251Z" }, - { url = "https://files.pythonhosted.org/packages/9e/9c/59e6cffa0d672d662ae17bd7ac8ecd2c89c9449dee499e3eb13ca9cd10d9/lupa-2.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96594eca3c87dd07938009e95e591e43d554c1dbd0385be03c100367141db5a8", size = 1047974, upload-time = "2025-10-24T07:19:01.449Z" }, - { url = "https://files.pythonhosted.org/packages/23/c6/a04e9cef7c052717fcb28fb63b3824802488f688391895b618e39be0f684/lupa-2.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8faddd9d198688c8884091173a088a8e920ecc96cda2ffed576a23574c4b3f6", size = 2073458, upload-time = "2025-10-24T07:19:03.369Z" }, - { url = "https://files.pythonhosted.org/packages/e6/10/824173d10f38b51fc77785228f01411b6ca28826ce27404c7c912e0e442c/lupa-2.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:daebb3a6b58095c917e76ba727ab37b27477fb926957c825205fbda431552134", size = 1067683, upload-time = "2025-10-24T07:19:06.2Z" }, - { url = "https://files.pythonhosted.org/packages/b6/dc/9692fbcf3c924d9c4ece2d8d2f724451ac2e09af0bd2a782db1cef34e799/lupa-2.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f3154e68972befe0f81564e37d8142b5d5d79931a18309226a04ec92487d4ea3", size = 1171892, upload-time = "2025-10-24T07:19:08.544Z" }, - { url = "https://files.pythonhosted.org/packages/84/ff/e318b628d4643c278c96ab3ddea07fc36b075a57383c837f5b11e537ba9d/lupa-2.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e4dadf77b9fedc0bfa53417cc28dc2278a26d4cbd95c29f8927ad4d8fe0a7ef9", size = 2166641, upload-time = "2025-10-24T07:19:10.485Z" }, - { url = "https://files.pythonhosted.org/packages/12/f7/a6f9ec2806cf2d50826980cdb4b3cffc7691dc6f95e13cc728846d5cb793/lupa-2.6-cp314-cp314-win32.whl", hash = "sha256:cb34169c6fa3bab3e8ac58ca21b8a7102f6a94b6a5d08d3636312f3f02fafd8f", size = 1456857, upload-time = "2025-10-24T07:19:37.989Z" }, - { url = "https://files.pythonhosted.org/packages/c5/de/df71896f25bdc18360fdfa3b802cd7d57d7fede41a0e9724a4625b412c85/lupa-2.6-cp314-cp314-win_amd64.whl", hash = "sha256:b74f944fe46c421e25d0f8692aef1e842192f6f7f68034201382ac440ef9ea67", size = 1731191, upload-time = "2025-10-24T07:19:40.281Z" }, - { url = "https://files.pythonhosted.org/packages/47/3c/a1f23b01c54669465f5f4c4083107d496fbe6fb45998771420e9aadcf145/lupa-2.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0e21b716408a21ab65723f8841cf7f2f37a844b7a965eeabb785e27fca4099cf", size = 999343, upload-time = "2025-10-24T07:19:12.519Z" }, - { url = "https://files.pythonhosted.org/packages/c5/6d/501994291cb640bfa2ccf7f554be4e6914afa21c4026bd01bff9ca8aac57/lupa-2.6-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:589db872a141bfff828340079bbdf3e9a31f2689f4ca0d88f97d9e8c2eae6142", size = 2000730, upload-time = "2025-10-24T07:19:14.869Z" }, - { url = "https://files.pythonhosted.org/packages/53/a5/457ffb4f3f20469956c2d4c4842a7675e884efc895b2f23d126d23e126cc/lupa-2.6-cp314-cp314t-macosx_11_0_x86_64.whl", hash = "sha256:cd852a91a4a9d4dcbb9a58100f820a75a425703ec3e3f049055f60b8533b7953", size = 1021553, upload-time = "2025-10-24T07:19:17.123Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/36bb5a5d0960f2a5c7c700e0819abb76fd9bf9c1d8a66e5106416d6e9b14/lupa-2.6-cp314-cp314t-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:0334753be028358922415ca97a64a3048e4ed155413fc4eaf87dd0a7e2752983", size = 1133275, upload-time = "2025-10-24T07:19:20.51Z" }, - { url = "https://files.pythonhosted.org/packages/19/86/202ff4429f663013f37d2229f6176ca9f83678a50257d70f61a0a97281bf/lupa-2.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:661d895cd38c87658a34780fac54a690ec036ead743e41b74c3fb81a9e65a6aa", size = 1038441, upload-time = "2025-10-24T07:19:22.509Z" }, - { url = "https://files.pythonhosted.org/packages/a7/42/d8125f8e420714e5b52e9c08d88b5329dfb02dcca731b4f21faaee6cc5b5/lupa-2.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aa58454ccc13878cc177c62529a2056be734da16369e451987ff92784994ca7", size = 2058324, upload-time = "2025-10-24T07:19:24.979Z" }, - { url = "https://files.pythonhosted.org/packages/2b/2c/47bf8b84059876e877a339717ddb595a4a7b0e8740bacae78ba527562e1c/lupa-2.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1425017264e470c98022bba8cff5bd46d054a827f5df6b80274f9cc71dafd24f", size = 1060250, upload-time = "2025-10-24T07:19:27.262Z" }, - { url = "https://files.pythonhosted.org/packages/c2/06/d88add2b6406ca1bdec99d11a429222837ca6d03bea42ca75afa169a78cb/lupa-2.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:224af0532d216e3105f0a127410f12320f7c5f1aa0300bdf9646b8d9afb0048c", size = 1151126, upload-time = "2025-10-24T07:19:29.522Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a0/89e6a024c3b4485b89ef86881c9d55e097e7cb0bdb74efb746f2fa6a9a76/lupa-2.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9abb98d5a8fd27c8285302e82199f0e56e463066f88f619d6594a450bf269d80", size = 2153693, upload-time = "2025-10-24T07:19:31.379Z" }, - { url = "https://files.pythonhosted.org/packages/b6/36/a0f007dc58fc1bbf51fb85dcc82fcb1f21b8c4261361de7dab0e3d8521ef/lupa-2.6-cp314-cp314t-win32.whl", hash = "sha256:1849efeba7a8f6fb8aa2c13790bee988fd242ae404bd459509640eeea3d1e291", size = 1590104, upload-time = "2025-10-24T07:19:33.514Z" }, - { url = "https://files.pythonhosted.org/packages/7d/5e/db903ce9cf82c48d6b91bf6d63ae4c8d0d17958939a4e04ba6b9f38b8643/lupa-2.6-cp314-cp314t-win_amd64.whl", hash = "sha256:fc1498d1a4fc028bc521c26d0fad4ca00ed63b952e32fb95949bda76a04bad52", size = 1913818, upload-time = "2025-10-24T07:19:36.039Z" }, -] - [[package]] name = "markdown-it-py" version = "4.0.0" @@ -1636,7 +1676,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.26.0" +version = "1.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1654,9 +1694,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/eb/c0cfc62075dc6e1ec1c64d352ae09ac051d9334311ed226f1f425312848a/mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83", size = 607509, upload-time = "2026-04-02T14:48:08.88Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, + { url = "https://files.pythonhosted.org/packages/9c/46/f6b4ad632c67ef35209a66127e4bddc95759649dd595f71f13fba11bdf9a/mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741", size = 215967, upload-time = "2026-04-02T14:48:07.24Z" }, ] [package.optional-dependencies] @@ -1676,11 +1716,11 @@ wheels = [ [[package]] name = "more-itertools" -version = "10.8.0" +version = "11.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/f7/139d22fef48ac78127d18e01d80cf1be40236ae489769d17f35c3d425293/more_itertools-11.0.2.tar.gz", hash = "sha256:392a9e1e362cbc106a2457d37cabf9b36e5e12efd4ebff1654630e76597df804", size = 144659, upload-time = "2026-04-09T15:01:33.297Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl", hash = "sha256:6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4", size = 71939, upload-time = "2026-04-09T15:01:32.21Z" }, ] [[package]] @@ -1791,6 +1831,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] +[[package]] +name = "multiprocess" +version = "0.70.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/f2/e783ac7f2aeeed14e9e12801f22529cc7e6b7ab80928d6dcce4e9f00922d/multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897", size = 2079989, upload-time = "2026-01-19T06:47:39.744Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/45/8004d1e6b9185c1a444d6b55ac5682acf9d98035e54386d967366035a03a/multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87", size = 134948, upload-time = "2026-01-19T06:47:32.325Z" }, + { url = "https://files.pythonhosted.org/packages/86/c2/dec9722dc3474c164a0b6bcd9a7ed7da542c98af8cabce05374abab35edd/multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c", size = 144457, upload-time = "2026-01-19T06:47:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/71/70/38998b950a97ea279e6bd657575d22d1a2047256caf707d9a10fbce4f065/multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28", size = 150281, upload-time = "2026-01-19T06:47:35.037Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/d2c27e03cb84251dfe7249b8e82923643c6d48fa4883b9476b025e7dc7eb/multiprocess-0.70.19-py313-none-any.whl", hash = "sha256:8d5eb4ec5017ba2fab4e34a747c6d2c2b6fecfe9e7236e77988db91580ada952", size = 156414, upload-time = "2026-01-19T06:47:35.915Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/af9115673a5870fd885247e2f1b68c4f1197737da315b520a91c757a861a/multiprocess-0.70.19-py314-none-any.whl", hash = "sha256:e8cc7fbdff15c0613f0a1f1f8744bef961b0a164c0ca29bdff53e9d2d93c5e5f", size = 160318, upload-time = "2026-01-19T06:47:37.497Z" }, + { url = "https://files.pythonhosted.org/packages/7e/82/69e539c4c2027f1e1697e09aaa2449243085a0edf81ae2c6341e84d769b6/multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5", size = 133477, upload-time = "2026-01-19T06:47:38.619Z" }, +] + [[package]] name = "networkx" version = "3.6.1" @@ -1802,63 +1859,63 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, - { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, - { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, - { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, - { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, - { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, - { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, - { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, - { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, - { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, - { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, - { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, - { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, - { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, - { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, - { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, - { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, - { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, - { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, - { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, - { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, - { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, - { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, - { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, - { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, - { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, - { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, - { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, - { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, - { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, - { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, - { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, - { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, ] [[package]] @@ -2012,7 +2069,7 @@ wheels = [ [[package]] name = "openai" -version = "2.31.0" +version = "2.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2024,14 +2081,14 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/fe/64b3d035780b3188f86c4f6f1bc202e7bb74757ef028802112273b9dcacf/openai-2.31.0.tar.gz", hash = "sha256:43ca59a88fc973ad1848d86b98d7fac207e265ebbd1828b5e4bdfc85f79427a5", size = 684772, upload-time = "2026-04-08T21:01:41.797Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/89/f1e78f5f828f4e97a6ebca8f45c6b35667da12b074ac490dc8362b882279/openai-2.34.0.tar.gz", hash = "sha256:828b4efcbb126352c2b5eb97d33ae890c92a71ab72511aefc1b7fe64aeccb07b", size = 759556, upload-time = "2026-05-04T17:34:08.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/bc/a8f7c3aa03452fedbb9af8be83e959adba96a6b4a35e416faffcc959c568/openai-2.31.0-py3-none-any.whl", hash = "sha256:44e1344d87e56a493d649b17e2fac519d1368cbb0745f59f1957c4c26de50a0a", size = 1153479, upload-time = "2026-04-08T21:01:39.217Z" }, + { url = "https://files.pythonhosted.org/packages/f2/40/f090499f10514515081d09cb9da09f25b821eb20497e9423afe4f07b4ecf/openai-2.34.0-py3-none-any.whl", hash = "sha256:c996a71b1a210f3569844572ad4c609307e978515fb76877cf449b72596e549e", size = 1316535, upload-time = "2026-05-04T17:34:06.773Z" }, ] [[package]] name = "openai-agents" -version = "0.13.6" +version = "0.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffelib" }, @@ -2041,10 +2098,11 @@ dependencies = [ { name = "requests" }, { name = "types-requests" }, { name = "typing-extensions" }, + { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/e8/a3bc1a91af9c71d2934f8e2f3eee2954540fa95d47b0e3f155d348d91b38/openai_agents-0.13.6.tar.gz", hash = "sha256:de7b3add7933ae704a5ee6e531f650d8aabb3ebaa1631f458ba39684a5ed966e", size = 2704270, upload-time = "2026-04-09T04:10:51.581Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/52/125891e56b67ec78bef08d91dc0a8d39457088cd0f59bf8e74a37e5e591c/openai_agents-0.15.1.tar.gz", hash = "sha256:78c3f1226e1d6d34dd7566e211c8345e996629d1704335153d1728995a3a7775", size = 5319915, upload-time = "2026-05-02T02:20:53.631Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/83/a991b2ad389abadabf13f6c4228bd88ac8dc363e4b50fcae8c5ea966bd41/openai_agents-0.13.6-py3-none-any.whl", hash = "sha256:8decb9eb0cc5dbe7749858e97a7d8316f9439526ca4e539e3bd105e0eb41115e", size = 471763, upload-time = "2026-04-09T04:10:49.81Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7b/69a33975b3610300219e1d25185c46280814cdb87e69a779acf0c9b9166a/openai_agents-0.15.1-py3-none-any.whl", hash = "sha256:2d304a5dcb919bc4fa1de5c7c9c93a4353a8a79d87d582d6170929390b7b3cef", size = 818627, upload-time = "2026-05-02T02:20:50.932Z" }, ] [[package]] @@ -2061,32 +2119,32 @@ wheels = [ [[package]] name = "opentelemetry-api" -version = "1.39.1" +version = "1.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767, upload-time = "2025-12-11T13:32:39.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/fc/b7564cbef36601aef0d6c9bc01f7badb64be8e862c2e1c3c5c3b43b53e4f/opentelemetry_api-1.41.1.tar.gz", hash = "sha256:0ad1814d73b875f84494387dae86ce0b12c68556331ce6ce8fe789197c949621", size = 71416, upload-time = "2026-04-24T13:15:38.262Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356, upload-time = "2025-12-11T13:32:17.304Z" }, + { url = "https://files.pythonhosted.org/packages/29/59/3e7118ed140f76b0982ba4321bdaed1997a0473f9720de2d10788a577033/opentelemetry_api-1.41.1-py3-none-any.whl", hash = "sha256:a22df900e75c76dc08440710e51f52f1aa6b451b429298896023e60db5b3139f", size = 69007, upload-time = "2026-04-24T13:15:15.662Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.39.1" +version = "1.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/9d/22d241b66f7bbde88a3bfa6847a351d2c46b84de23e71222c6aae25c7050/opentelemetry_exporter_otlp_proto_common-1.39.1.tar.gz", hash = "sha256:763370d4737a59741c89a67b50f9e39271639ee4afc999dadfe768541c027464", size = 20409, upload-time = "2025-12-11T13:32:40.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/fa/f9e3bd3c4d692b3ce9a2880a167d1f79681a1bea11f00d5bf76adc03e6ea/opentelemetry_exporter_otlp_proto_common-1.41.1.tar.gz", hash = "sha256:0e253156ea9c36b0bd3d2440c5c9ba7dd1f3fb64ba7a08fc85fbac536b56e1fb", size = 20409, upload-time = "2026-04-24T13:15:40.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/02/ffc3e143d89a27ac21fd557365b98bd0653b98de8a101151d5805b5d4c33/opentelemetry_exporter_otlp_proto_common-1.39.1-py3-none-any.whl", hash = "sha256:08f8a5862d64cc3435105686d0216c1365dc5701f86844a8cd56597d0c764fde", size = 18366, upload-time = "2025-12-11T13:32:20.2Z" }, + { url = "https://files.pythonhosted.org/packages/29/48/bce76d3ea772b609757e9bc844e02ab408a6446609bf74fb562062ba6b71/opentelemetry_exporter_otlp_proto_common-1.41.1-py3-none-any.whl", hash = "sha256:10da74dad6a49344b9b7b21b6182e3060373a235fde1528616d5f01f92e66aa9", size = 18366, upload-time = "2026-04-24T13:15:18.917Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.39.1" +version = "1.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -2097,14 +2155,14 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/04/2a08fa9c0214ae38880df01e8bfae12b067ec0793446578575e5080d6545/opentelemetry_exporter_otlp_proto_http-1.39.1.tar.gz", hash = "sha256:31bdab9745c709ce90a49a0624c2bd445d31a28ba34275951a6a362d16a0b9cb", size = 17288, upload-time = "2025-12-11T13:32:42.029Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/5b/9d3c7f70cca10136ba82a81e738dee626c8e7fc61c6887ea9a58bf34c606/opentelemetry_exporter_otlp_proto_http-1.41.1.tar.gz", hash = "sha256:4747a9604c8550ab38c6fd6180e2fcb80de3267060bef2c306bad3cb443302bc", size = 24139, upload-time = "2026-04-24T13:15:42.977Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/f1/b27d3e2e003cd9a3592c43d099d2ed8d0a947c15281bf8463a256db0b46c/opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl", hash = "sha256:d9f5207183dd752a412c4cd564ca8875ececba13be6e9c6c370ffb752fd59985", size = 19641, upload-time = "2025-12-11T13:32:22.248Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4d/ef07ff2fc630849f2080ae0ae73a61f67257905b7ac79066640bfa0c5739/opentelemetry_exporter_otlp_proto_http-1.41.1-py3-none-any.whl", hash = "sha256:1a21e8f49c7a946d935551e90947d6c3eb39236723c6624401da0f33d68edcb4", size = 22673, upload-time = "2026-04-24T13:15:21.313Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.60b1" +version = "0.62b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2112,14 +2170,14 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/0f/7e6b713ac117c1f5e4e3300748af699b9902a2e5e34c9cf443dde25a01fa/opentelemetry_instrumentation-0.60b1.tar.gz", hash = "sha256:57ddc7974c6eb35865af0426d1a17132b88b2ed8586897fee187fd5b8944bd6a", size = 31706, upload-time = "2025-12-11T13:36:42.515Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/cb/0523b92c112a6cc70be43724343dc45225d3af134419844d7879a07755d4/opentelemetry_instrumentation-0.62b1.tar.gz", hash = "sha256:90e92a905ba4f84db06ac3aec96701df6c079b2d66e9379f8739f0a1bdcc7f45", size = 34043, upload-time = "2026-04-24T13:22:31.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/d2/6788e83c5c86a2690101681aeef27eeb2a6bf22df52d3f263a22cee20915/opentelemetry_instrumentation-0.60b1-py3-none-any.whl", hash = "sha256:04480db952b48fb1ed0073f822f0ee26012b7be7c3eac1a3793122737c78632d", size = 33096, upload-time = "2025-12-11T13:35:33.067Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0f/45adbaea1f81b847cffdcee4f4b5f89297e42facf7fac78c7aaac4c38e75/opentelemetry_instrumentation-0.62b1-py3-none-any.whl", hash = "sha256:976fc6e640f2006599e97429c949e622c108d0c17c2059347d1e6c93c707f257", size = 34163, upload-time = "2026-04-24T13:21:31.722Z" }, ] [[package]] name = "opentelemetry-instrumentation-httpx" -version = "0.60b1" +version = "0.62b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2128,57 +2186,57 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/08/11208bcfcab4fc2023252c3f322aa397fd9ad948355fea60f5fc98648603/opentelemetry_instrumentation_httpx-0.60b1.tar.gz", hash = "sha256:a506ebaf28c60112cbe70ad4f0338f8603f148938cb7b6794ce1051cd2b270ae", size = 20611, upload-time = "2025-12-11T13:37:01.661Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/cb/7a418e69c7dad281803529cb4f6de1b747d802cca44c38032668690b4836/opentelemetry_instrumentation_httpx-0.62b1.tar.gz", hash = "sha256:a1fac9bcc3a6ef5996a7990563f1af0798468b2c146de535fd598369383fba7e", size = 24181, upload-time = "2026-04-24T13:22:52.124Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/59/b98e84eebf745ffc75397eaad4763795bff8a30cbf2373a50ed4e70646c5/opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl", hash = "sha256:f37636dd742ad2af83d896ba69601ed28da51fa4e25d1ab62fde89ce413e275b", size = 15701, upload-time = "2025-12-11T13:36:04.56Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e0/eca824e9492ccec00e055bdd243aeda8eb7c5eda746d98af4d7a2d97ecf3/opentelemetry_instrumentation_httpx-0.62b1-py3-none-any.whl", hash = "sha256:88614015df451d61bc7e73f22524e6f223611f80b6caad2f6bdcbe05fa0df653", size = 17201, upload-time = "2026-04-24T13:21:58.072Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.39.1" +version = "1.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/1d/f25d76d8260c156c40c97c9ed4511ec0f9ce353f8108ca6e7561f82a06b2/opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8", size = 46152, upload-time = "2025-12-11T13:32:48.681Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/e8/633c6d8a9c8840338b105907e55c32d3da1983abab5e52f899f72a82c3d1/opentelemetry_proto-1.41.1.tar.gz", hash = "sha256:4b9d2eb631237ea43b80e16c073af438554e32bc7e9e3f8ca4a9582f900020e5", size = 45670, upload-time = "2026-04-24T13:15:49.768Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/95/b40c96a7b5203005a0b03d8ce8cd212ff23f1793d5ba289c87a097571b18/opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007", size = 72535, upload-time = "2025-12-11T13:32:33.866Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1e/5cd77035e3e82070e2265a63a760f715aacd3cb16dddc7efee913f297fcc/opentelemetry_proto-1.41.1-py3-none-any.whl", hash = "sha256:0496713b804d127a4147e32849fbaf5683fac8ee98550e8e7679cd706c289720", size = 72076, upload-time = "2026-04-24T13:15:32.542Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.39.1" +version = "1.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/fb/c76080c9ba07e1e8235d24cdcc4d125ef7aa3edf23eb4e497c2e50889adc/opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6", size = 171460, upload-time = "2025-12-11T13:32:49.369Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/d0/54ee30dab82fb0acda23d144502771ff76ef8728459c83c3e89ef9fb1825/opentelemetry_sdk-1.41.1.tar.gz", hash = "sha256:724b615e1215b5aeacda0abb8a6a8922c9a1853068948bd0bd225a56d0c792e6", size = 230180, upload-time = "2026-04-24T13:15:50.991Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/98/e91cf858f203d86f4eccdf763dcf01cf03f1dae80c3750f7e635bfa206b6/opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c", size = 132565, upload-time = "2025-12-11T13:32:35.069Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e7/a1420b698aad018e1cf60fdbaaccbe49021fb415e2a0d81c242f4c518f54/opentelemetry_sdk-1.41.1-py3-none-any.whl", hash = "sha256:edee379c126c1bce952b0c812b48fe8ff35b30df0eecf17e98afa4d598b7d85d", size = 180213, upload-time = "2026-04-24T13:15:33.767Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.60b1" +version = "0.62b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935, upload-time = "2025-12-11T13:32:50.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/de/911ac9e309052aca1b20b2d5549d3db45d1011e1a610e552c6ccdd1b64f8/opentelemetry_semantic_conventions-0.62b1.tar.gz", hash = "sha256:c5cc6e04a7f8c7cdd30be2ed81499fa4e75bfbd52c9cb70d40af1f9cd3619802", size = 145750, upload-time = "2026-04-24T13:15:52.236Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982, upload-time = "2025-12-11T13:32:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a6/83dc2ab6fa397ee66fba04fe2e74bdf7be3b3870005359ceb7689103c058/opentelemetry_semantic_conventions-0.62b1-py3-none-any.whl", hash = "sha256:cf506938103d331fbb78eded0d9788095f7fd59016f2bda813c3324e5a74a93c", size = 231620, upload-time = "2026-04-24T13:15:35.454Z" }, ] [[package]] name = "opentelemetry-util-http" -version = "0.60b1" +version = "0.62b1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/50/fc/c47bb04a1d8a941a4061307e1eddfa331ed4d0ab13d8a9781e6db256940a/opentelemetry_util_http-0.60b1.tar.gz", hash = "sha256:0d97152ca8c8a41ced7172d29d3622a219317f74ae6bb3027cfbdcf22c3cc0d6", size = 11053, upload-time = "2025-12-11T13:37:25.115Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/1b/aa71b63e18d30a8384036b9937f40f7618f8030a7aa213155fb54f6f2b47/opentelemetry_util_http-0.62b1.tar.gz", hash = "sha256:adf6facbb89aef8f8bc566e2f04624942ba08a7b678b3479a91051a8f4dc70a3", size = 11393, upload-time = "2026-04-24T13:23:12.994Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/5c/d3f1733665f7cd582ef0842fb1d2ed0bc1fba10875160593342d22bba375/opentelemetry_util_http-0.60b1-py3-none-any.whl", hash = "sha256:66381ba28550c91bee14dcba8979ace443444af1ed609226634596b4b0faf199", size = 8947, upload-time = "2025-12-11T13:36:37.151Z" }, + { url = "https://files.pythonhosted.org/packages/5d/85/a9d9d32161c1ced61346267db4c9702da54f81ec5dc88214bc65c23f4e9d/opentelemetry_util_http-0.62b1-py3-none-any.whl", hash = "sha256:c57e8a6c19fc422c288e6074e882f506f85030b69b7376182f74f9257b9261f0", size = 9295, upload-time = "2026-04-24T13:22:28.078Z" }, ] [[package]] @@ -2275,81 +2333,72 @@ wheels = [ [[package]] name = "packaging" -version = "26.0" +version = "26.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { 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 = "pandas" -version = "3.0.1" +version = "3.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/51/b467209c08dae2c624873d7491ea47d2b47336e5403309d433ea79c38571/pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d", size = 10344357, upload-time = "2026-02-17T22:18:38.262Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f1/e2567ffc8951ab371db2e40b2fe068e36b81d8cf3260f06ae508700e5504/pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955", size = 9884543, upload-time = "2026-02-17T22:18:41.476Z" }, - { url = "https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b", size = 10396030, upload-time = "2026-02-17T22:18:43.822Z" }, - { url = "https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4", size = 10876435, upload-time = "2026-02-17T22:18:45.954Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a6/2a75320849dd154a793f69c951db759aedb8d1dd3939eeacda9bdcfa1629/pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1", size = 11405133, upload-time = "2026-02-17T22:18:48.533Z" }, - { url = "https://files.pythonhosted.org/packages/58/53/1d68fafb2e02d7881df66aa53be4cd748d25cbe311f3b3c85c93ea5d30ca/pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821", size = 11932065, upload-time = "2026-02-17T22:18:50.837Z" }, - { url = "https://files.pythonhosted.org/packages/75/08/67cc404b3a966b6df27b38370ddd96b3b023030b572283d035181854aac5/pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43", size = 9741627, upload-time = "2026-02-17T22:18:53.905Z" }, - { url = "https://files.pythonhosted.org/packages/86/4f/caf9952948fb00d23795f09b893d11f1cacb384e666854d87249530f7cbe/pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7", size = 9052483, upload-time = "2026-02-17T22:18:57.31Z" }, - { url = "https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262", size = 10317509, upload-time = "2026-02-17T22:18:59.498Z" }, - { url = "https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56", size = 9860561, upload-time = "2026-02-17T22:19:02.265Z" }, - { url = "https://files.pythonhosted.org/packages/fa/80/f01ff54664b6d70fed71475543d108a9b7c888e923ad210795bef04ffb7d/pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e", size = 10365506, upload-time = "2026-02-17T22:19:05.017Z" }, - { url = "https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791", size = 10873196, upload-time = "2026-02-17T22:19:07.204Z" }, - { url = "https://files.pythonhosted.org/packages/48/a9/9301c83d0b47c23ac5deab91c6b39fd98d5b5db4d93b25df8d381451828f/pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a", size = 11370859, upload-time = "2026-02-17T22:19:09.436Z" }, - { url = "https://files.pythonhosted.org/packages/59/fe/0c1fc5bd2d29c7db2ab372330063ad555fb83e08422829c785f5ec2176ca/pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8", size = 11924584, upload-time = "2026-02-17T22:19:11.562Z" }, - { url = "https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25", size = 9742769, upload-time = "2026-02-17T22:19:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/c4/cb/810a22a6af9a4e97c8ab1c946b47f3489c5bca5adc483ce0ffc84c9cc768/pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59", size = 9043855, upload-time = "2026-02-17T22:19:16.09Z" }, - { url = "https://files.pythonhosted.org/packages/92/fa/423c89086cca1f039cf1253c3ff5b90f157b5b3757314aa635f6bf3e30aa/pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06", size = 10752673, upload-time = "2026-02-17T22:19:18.304Z" }, - { url = "https://files.pythonhosted.org/packages/22/23/b5a08ec1f40020397f0faba72f1e2c11f7596a6169c7b3e800abff0e433f/pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f", size = 10404967, upload-time = "2026-02-17T22:19:20.726Z" }, - { url = "https://files.pythonhosted.org/packages/5c/81/94841f1bb4afdc2b52a99daa895ac2c61600bb72e26525ecc9543d453ebc/pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324", size = 10320575, upload-time = "2026-02-17T22:19:24.919Z" }, - { url = "https://files.pythonhosted.org/packages/0a/8b/2ae37d66a5342a83adadfd0cb0b4bf9c3c7925424dd5f40d15d6cfaa35ee/pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9", size = 10710921, upload-time = "2026-02-17T22:19:27.181Z" }, - { url = "https://files.pythonhosted.org/packages/a2/61/772b2e2757855e232b7ccf7cb8079a5711becb3a97f291c953def15a833f/pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76", size = 11334191, upload-time = "2026-02-17T22:19:29.411Z" }, - { url = "https://files.pythonhosted.org/packages/1b/08/b16c6df3ef555d8495d1d265a7963b65be166785d28f06a350913a4fac78/pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098", size = 11782256, upload-time = "2026-02-17T22:19:32.34Z" }, - { url = "https://files.pythonhosted.org/packages/55/80/178af0594890dee17e239fca96d3d8670ba0f5ff59b7d0439850924a9c09/pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35", size = 10485047, upload-time = "2026-02-17T22:19:34.605Z" }, - { url = "https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a", size = 10322465, upload-time = "2026-02-17T22:19:36.803Z" }, - { url = "https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f", size = 9910632, upload-time = "2026-02-17T22:19:39.001Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f7/b449ffb3f68c11da12fc06fbf6d2fa3a41c41e17d0284d23a79e1c13a7e4/pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749", size = 10440535, upload-time = "2026-02-17T22:19:41.157Z" }, - { url = "https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249", size = 10893940, upload-time = "2026-02-17T22:19:43.493Z" }, - { url = "https://files.pythonhosted.org/packages/03/30/f1b502a72468c89412c1b882a08f6eed8a4ee9dc033f35f65d0663df6081/pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee", size = 11442711, upload-time = "2026-02-17T22:19:46.074Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f0/ebb6ddd8fc049e98cabac5c2924d14d1dda26a20adb70d41ea2e428d3ec4/pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c", size = 11963918, upload-time = "2026-02-17T22:19:48.838Z" }, - { url = "https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66", size = 9862099, upload-time = "2026-02-17T22:19:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b7/6af9aac41ef2456b768ef0ae60acf8abcebb450a52043d030a65b4b7c9bd/pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132", size = 9185333, upload-time = "2026-02-17T22:19:53.266Z" }, - { url = "https://files.pythonhosted.org/packages/66/fc/848bb6710bc6061cb0c5badd65b92ff75c81302e0e31e496d00029fe4953/pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32", size = 10772664, upload-time = "2026-02-17T22:19:55.806Z" }, - { url = "https://files.pythonhosted.org/packages/69/5c/866a9bbd0f79263b4b0db6ec1a341be13a1473323f05c122388e0f15b21d/pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87", size = 10421286, upload-time = "2026-02-17T22:19:58.091Z" }, - { url = "https://files.pythonhosted.org/packages/51/a4/2058fb84fb1cfbfb2d4a6d485e1940bb4ad5716e539d779852494479c580/pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988", size = 10342050, upload-time = "2026-02-17T22:20:01.376Z" }, - { url = "https://files.pythonhosted.org/packages/22/1b/674e89996cc4be74db3c4eb09240c4bb549865c9c3f5d9b086ff8fcfbf00/pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221", size = 10740055, upload-time = "2026-02-17T22:20:04.328Z" }, - { url = "https://files.pythonhosted.org/packages/d0/f8/e954b750764298c22fa4614376531fe63c521ef517e7059a51f062b87dca/pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff", size = 11357632, upload-time = "2026-02-17T22:20:06.647Z" }, - { url = "https://files.pythonhosted.org/packages/6d/02/c6e04b694ffd68568297abd03588b6d30295265176a5c01b7459d3bc35a3/pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5", size = 11810974, upload-time = "2026-02-17T22:20:08.946Z" }, - { url = "https://files.pythonhosted.org/packages/89/41/d7dfb63d2407f12055215070c42fc6ac41b66e90a2946cdc5e759058398b/pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937", size = 10884622, upload-time = "2026-02-17T22:20:11.711Z" }, - { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, + { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, + { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, + { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, + { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, + { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, + { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, + { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, + { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, + { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, ] [[package]] name = "pathable" -version = "0.4.4" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/67/93/8f2c2075b180c12c1e9f6a09d1a985bc2036906b13dff1d8917e395f2048/pathable-0.4.4.tar.gz", hash = "sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2", size = 8124, upload-time = "2025-01-10T18:43:13.247Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/55/b748445cb4ea6b125626f15379be7c96d1035d4fa3e8fee362fa92298abf/pathable-0.5.0.tar.gz", hash = "sha256:d81938348a1cacb525e7c75166270644782c0fb9c8cecc16be033e71427e0ef1", size = 16655, upload-time = "2026-02-20T08:47:00.748Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, -] - -[[package]] -name = "pathvalidate" -version = "3.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, + { url = "https://files.pythonhosted.org/packages/52/96/5a770e5c461462575474468e5af931cff9de036e7c2b4fea23c1c58d2cbe/pathable-0.5.0-py3-none-any.whl", hash = "sha256:646e3d09491a6351a0c82632a09c02cdf70a252e73196b36d8a15ba0a114f0a6", size = 16867, upload-time = "2026-02-20T08:46:59.536Z" }, ] [[package]] @@ -2397,11 +2446,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.9.2" +version = "4.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/04/fea538adf7dbbd6d186f551d595961e564a3b6715bdf276b477460858672/platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291", size = 28394, upload-time = "2026-02-16T03:56:10.574Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd", size = 21168, upload-time = "2026-02-16T03:56:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] [[package]] @@ -2413,15 +2462,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "prometheus-client" -version = "0.24.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/58/a794d23feb6b00fc0c72787d7e87d872a6730dd9ed7c7b3e954637d8f280/prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9", size = 85616, upload-time = "2026-01-14T15:26:26.965Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055", size = 64057, upload-time = "2026-01-14T15:26:24.42Z" }, -] - [[package]] name = "propcache" version = "0.4.1" @@ -2523,21 +2563,21 @@ wheels = [ [[package]] name = "py-key-value-aio" -version = "0.3.0" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beartype" }, - { name = "py-key-value-shared" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/ce/3136b771dddf5ac905cc193b461eb67967cf3979688c6696e1f2cdcde7ea/py_key_value_aio-0.3.0.tar.gz", hash = "sha256:858e852fcf6d696d231266da66042d3355a7f9871650415feef9fca7a6cd4155", size = 50801, upload-time = "2025-11-17T16:50:04.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/10/72f6f213b8f0bce36eff21fda0a13271834e9eeff7f9609b01afdc253c79/py_key_value_aio-0.3.0-py3-none-any.whl", hash = "sha256:1c781915766078bfd608daa769fefb97e65d1d73746a3dfb640460e322071b64", size = 96342, upload-time = "2025-11-17T16:50:03.801Z" }, + { url = "https://files.pythonhosted.org/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", size = 152291, upload-time = "2026-02-16T21:21:44.241Z" }, ] [package.optional-dependencies] -disk = [ - { name = "diskcache" }, - { name = "pathvalidate" }, +filetree = [ + { name = "aiofile" }, + { name = "anyio" }, ] keyring = [ { name = "keyring" }, @@ -2545,21 +2585,48 @@ keyring = [ memory = [ { name = "cachetools" }, ] -redis = [ - { name = "redis" }, -] [[package]] -name = "py-key-value-shared" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beartype" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/e4/1971dfc4620a3a15b4579fe99e024f5edd6e0967a71154771a059daff4db/py_key_value_shared-0.3.0.tar.gz", hash = "sha256:8fdd786cf96c3e900102945f92aa1473138ebe960ef49da1c833790160c28a4b", size = 11666, upload-time = "2025-11-17T16:50:06.849Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/e4/b8b0a03ece72f47dce2307d36e1c34725b7223d209fc679315ffe6a4e2c3/py_key_value_shared-0.3.0-py3-none-any.whl", hash = "sha256:5b0efba7ebca08bb158b1e93afc2f07d30b8f40c2fc12ce24a4c0d84f42f9298", size = 19560, upload-time = "2025-11-17T16:50:05.954Z" }, +name = "pyarrow" +version = "24.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/829f7d9dfd37c207206081d6dad474d81dde29952401f07f2ba507814818/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6165461f55ef6314f026de6638d661188e3455d3ec49834556a0ebbdbace18bb", size = 48863122, upload-time = "2026-04-21T10:47:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e8/f88ce625fe8babaae64e8db2d417c7653adb3019b08aae85c5ed787dc816/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b13dedfe76a0ad2d1d859b0811b53827a4e9d93a0bcb05cf59333ab4980cc7e", size = 49376032, upload-time = "2026-04-21T10:47:48.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/82c363caa145fff88fb475da50d3bf52bb024f61917be5424c3392eaf878/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:25ea65d868eb04015cd18e6df2fbe98f07e5bda2abefabcb88fce39a947716f6", size = 51929490, upload-time = "2026-04-21T10:47:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826", size = 27355660, upload-time = "2026-04-21T10:48:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a1abf004482026ddc17f4503db227787fa3cfe41ec5091ff20e4fea55e57/pyarrow-24.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:02b001b3ed4723caa44f6cd1af2d5c86aa2cf9971dacc2ffa55b21237713dfba", size = 34976759, upload-time = "2026-04-21T10:48:07.258Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/34f0a36d28a2dd32225301b79daad44e243dc1a2bb77d43b60749be255c4/pyarrow-24.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:04920d6a71aabd08a0417709efce97d45ea8e6fb733d9ca9ecffb13c67839f68", size = 36658471, upload-time = "2026-04-21T10:48:13.347Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/543b94712ae8bb1a6023bcc1acf1a740fbff8286747c289cd9468fced2a5/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a964266397740257f16f7bb2e4f08a0c81454004beab8ff59dd531b73610e9f2", size = 45675981, upload-time = "2026-04-21T10:48:20.201Z" }, + { url = "https://files.pythonhosted.org/packages/84/9f/8fb7c222b100d314137fa40ec050de56cd8c6d957d1cfff685ce72f15b17/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f066b179d68c413374294bc1735f68475457c933258df594443bb9d88ddc2a0", size = 48859172, upload-time = "2026-04-21T10:48:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/1ea72538e6c8b3b475ed78d1049a2c518e655761ea50fe1171fc855fcab7/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1183baeb14c5f587b1ec52831e665718ce632caab84b7cd6b85fd44f96114495", size = 49385733, upload-time = "2026-04-21T10:48:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/c3d8b06a1ba35f2260f8e1f771abbee7d5e345c0937aab90675706b1690a/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:806f24b4085453c197a5078218d1ee08783ebbba271badd153d1ae22a3ee804f", size = 51934335, upload-time = "2026-04-21T10:48:42.099Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/89e07a1e7329d2cde3e3c6994ba0839a24977a2beda8be6005ea3d860b99/pyarrow-24.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e4505fc6583f7b05ab854934896bcac8253b04ac1171a77dfb73efef92076d91", size = 27271748, upload-time = "2026-04-21T10:49:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/17/1a/cff3a59f80b5b1658549d46611b67163f65e0664431c076ad728bf9d5af4/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1a4e45017efbf115032e4475ee876d525e0e36c742214fbe405332480ecd6275", size = 35238554, upload-time = "2026-04-21T10:48:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/cce0f42a327bfef2c420fb6078a3eb834826e5d6697bf3009fe11d2ad051/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:7986f1fa71cee060ad00758bcc79d3a93bab8559bf978fab9e53472a2e25a17b", size = 36782301, upload-time = "2026-04-21T10:48:55.181Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/8e560d5ff6793ca29aca213c53eec0dd482dd46cb93b2819e5aab52e4252/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d3e0b61e8efb24ed38898e5cdc5fffa9124be480008d401a1f8071500494ae42", size = 45721929, upload-time = "2026-04-21T10:49:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/27/0c/a26e25505d030716e078d9f16eb74973cbf0b33b672884e9f9da1c83b871/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:55a3bc1e3df3b5567b7d27ef551b2283f0c68a5e86f1cd56abc569da4f31335b", size = 48825365, upload-time = "2026-04-21T10:49:11.714Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/771f9ecb0c65e73fe9dccdd1717901b9594f08c4515d000c7c62df573811/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:641f795b361874ac9da5294f8f443dfdbee355cf2bd9e3b8d97aaac2306b9b37", size = 49451819, upload-time = "2026-04-21T10:49:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/48/da/61ae89a88732f5a785646f3ec6125dbb640fa98a540eb2b9889caa561403/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8adc8e6ce5fccf5dc707046ae4914fd537def529709cc0d285d37a7f9cd442ca", size = 51909252, upload-time = "2026-04-21T10:49:31.164Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1a/8dd5cafab7b66573fa91c03d06d213356ad4edd71813aa75e08ce2b3a844/pyarrow-24.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:9b18371ad2f44044b81a8d23bc2d8a9b6a6226dca775e8e16cfee640473d6c5d", size = 27388127, upload-time = "2026-04-21T10:49:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/d022a34ff05d2cbedd8ccf841fc1f532ecfa9eb5ed1711b56d0e0ea71fc9/pyarrow-24.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:1cc9057f0319e26333b357e17f3c2c022f1a83739b48a88b25bfd5fa2dc18838", size = 35007997, upload-time = "2026-04-21T10:49:48.796Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ff/f01485fda6f4e5d441afb8dd5e7681e4db18826c1e271852f5d3957d6a80/pyarrow-24.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e6f1278ee4785b6db21229374a1c9e54ec7c549de5d1efc9630b6207de7e170b", size = 36678720, upload-time = "2026-04-21T10:49:55.858Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/2d2d5fea814237923f71b36495211f20b43a1576f9a4d6da7e751a64ec6f/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:adbbedc55506cbdabb830890444fb856bfb0060c46c6f8026c6c2f2cf86ae795", size = 45741852, upload-time = "2026-04-21T10:50:04.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3a/28ba9c1c1ebdbb5f1b94dfebb46f207e52e6a554b7fe4132540fde29a3a0/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ae8a1145af31d903fa9bb166824d7abe9b4681a000b0159c9fb99c11bc11ad26", size = 48889852, upload-time = "2026-04-21T10:50:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/df/51/4a389acfd31dca009f8fb82d7f510bb4130f2b3a8e18cf00194d0687d8ac/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d7027eba1df3b2069e2e8d80f644fa0918b68c46432af3d088ddd390d063ecde", size = 49445207, upload-time = "2026-04-21T10:50:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/0bab2b23d2ae901b1b9a03c0efd4b2d070256f8ce3fc43f6e58c167b2081/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e56a1ffe9bf7b727432b89104cc0849c21582949dd7bdcb34f17b2001a351a76", size = 51954117, upload-time = "2026-04-21T10:50:29.14Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/f4e9145da0417b3d2c12035a8492b35ff4a3dbc653e614fcfb51d9dedb38/pyarrow-24.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:38be1808cdd068605b787e6ca9119b27eb275a0234e50212c3492331680c3b1e", size = 28001155, upload-time = "2026-04-21T10:51:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/79/4f/46a49a63f43526da895b1a45bbb51d5baf8e4d77159f8528fc3e5490007f/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:418e48ce50a45a6a6c73c454677203a9c75c966cb1e92ca3370959185f197a05", size = 35250387, upload-time = "2026-04-21T10:50:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/a0/da/d5e0cd5ef00796922404806d5f00325cdadc3441ce2c13fe7115f2df9a64/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2f16197705a230a78270cdd4ea8a1d57e86b2fdcbc34a1f6aebc72e65c986f9a", size = 36797102, upload-time = "2026-04-21T10:50:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/5904145b0a593a05236c882933d439b5720f0a145381179063722fbfc123/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fb24ac194bfc5e86839d7dcd52092ee31e5fe6733fe11f5e3b06ef0812b20072", size = 45745118, upload-time = "2026-04-21T10:50:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/cca42fe166d1c6e4d5b80e530b7949104d10e17508a90ae202dac205ce2a/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9700ebd9a51f5895ce75ff4ac4b3c47a7d4b42bc618be8e713e5d56bacf5f931", size = 48844765, upload-time = "2026-04-21T10:50:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/942c3b79878ba928324d1e17c274ed84581db8c0a749b24bcf4cbdf15bd3/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d8ddd2768da81d3ee08cfea9b597f4abb4e8e1dc8ae7e204b608d23a0d3ab699", size = 49471890, upload-time = "2026-04-21T10:51:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/76/97/ff71431000a75d84135a1ace5ca4ba11726a231a8007bbb320a4c54075d5/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:61a3d7eaa97a14768b542f3d284dc6400dd2470d9f080708b13cd46b6ae18136", size = 51932250, upload-time = "2026-04-21T10:51:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/6f79d55816d5c22557cf27533543d5d70dfe692adfbee4b99f2760674f38/pyarrow-24.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c91d00057f23b8d353039520dc3a6c09d8608164c692e9f59a175a42b2ae0c19", size = 28131282, upload-time = "2026-04-21T10:51:16.815Z" }, ] [[package]] @@ -2594,7 +2661,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.5" +version = "2.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2602,9 +2669,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, ] [package.optional-dependencies] @@ -2614,127 +2681,109 @@ email = [ [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.46.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, ] [[package]] name = "pydantic-settings" -version = "2.13.0" +version = "2.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/a1/ae859ffac5a3338a66b74c5e29e244fd3a3cc483c89feaf9f56c39898d75/pydantic_settings-2.13.0.tar.gz", hash = "sha256:95d875514610e8595672800a5c40b073e99e4aae467fa7c8f9c263061ea2e1fe", size = 222450, upload-time = "2026-02-15T12:11:23.476Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/98/c8345dccdc31de4228c039a98f6467a941e39558da41c1744fbe29fa5666/pydantic_settings-2.14.0.tar.gz", hash = "sha256:24285fd4b0e0c06507dd9fdfd331ee23794305352aaec8fc4eb92d4047aeb67d", size = 235709, upload-time = "2026-04-20T13:37:40.293Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1a/dd1b9d7e627486cf8e7523d09b70010e05a4bc41414f4ae6ce184cf0afb6/pydantic_settings-2.13.0-py3-none-any.whl", hash = "sha256:d67b576fff39cd086b595441bf9c75d4193ca9c0ed643b90360694d0f1240246", size = 58429, upload-time = "2026-02-15T12:11:22.133Z" }, -] - -[[package]] -name = "pydocket" -version = "0.17.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cloudpickle" }, - { name = "croniter" }, - { name = "fakeredis", extra = ["lua"] }, - { name = "opentelemetry-api" }, - { name = "prometheus-client" }, - { name = "py-key-value-aio", extra = ["memory", "redis"] }, - { name = "python-json-logger" }, - { name = "redis" }, - { name = "rich" }, - { name = "typer" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cd/b2/5e12dbe2acf59e4499285e8eee66e8e81b6ba2f553696d2f4ccca0a7978c/pydocket-0.17.7.tar.gz", hash = "sha256:5c77ec6731a167cdcb44174abf793fe63e7b6c1c1c8a799cc6ec7502b361ee77", size = 347071, upload-time = "2026-02-11T21:01:31.744Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/c7/68f2553819965326f968375f02597d49efe71b309ba9d8fef539aeb51c48/pydocket-0.17.7-py3-none-any.whl", hash = "sha256:d1e0921ac02026c4a0140fc72a3848545f3e91e6e74c6e32c588489017c130b2", size = 94608, upload-time = "2026-02-11T21:01:30.111Z" }, + { url = "https://files.pythonhosted.org/packages/01/dd/bebff3040138f00ae8a102d426b27349b9a49acc310fcae7f92112d867e3/pydantic_settings-2.14.0-py3-none-any.whl", hash = "sha256:fc8d5d692eb7092e43c8647c1c35a3ecd00e040fcf02ed86f4cb5458ca62182e", size = 60940, upload-time = "2026-04-20T13:37:38.586Z" }, ] [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] name = "pyjwt" -version = "2.11.0" +version = "2.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] @@ -2742,6 +2791,15 @@ crypto = [ { name = "cryptography" }, ] +[[package]] +name = "pypdf" +version = "6.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/3f/9f2167401c2e94833ca3b69535bad89e533b5de75fefe4197a2c224baec2/pypdf-6.10.2.tar.gz", hash = "sha256:7d09ce108eff6bf67465d461b6ef352dcb8d84f7a91befc02f904455c6eea11d", size = 5315679, upload-time = "2026-04-15T16:37:36.978Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/d6/1d5c60cc17bbdf37c1552d9c03862fc6d32c5836732a0415b2d637edc2d0/pypdf-6.10.2-py3-none-any.whl", hash = "sha256:aa53be9826655b51c96741e5d7983ca224d898ac0a77896e64636810517624aa", size = 336308, upload-time = "2026-04-15T16:37:34.851Z" }, +] + [[package]] name = "pyperclip" version = "1.11.0" @@ -2753,7 +2811,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.2" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -2762,9 +2820,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] @@ -2794,38 +2852,20 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, -] - -[[package]] -name = "python-json-logger" -version = "4.0.0" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f", size = 17683, upload-time = "2025-10-06T04:15:18.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548, upload-time = "2025-10-06T04:15:17.553Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] name = "python-multipart" -version = "0.0.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, -] - -[[package]] -name = "pytz" -version = "2025.2" +version = "0.0.27" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/9b/f23807317a113dc36e74e75eb265a02dd1a4d9082abc3c1064acd22997c4/python_multipart-0.0.27.tar.gz", hash = "sha256:9870a6a8c5a20a5bf4f07c017bd1489006ff8836cff097b6933355ee2b49b602", size = 44043, upload-time = "2026-04-27T10:51:26.649Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/99/78/4126abcbdbd3c559d43e0db7f7b9173fc6befe45d39a2856cc0b8ec2a5a6/python_multipart-0.0.27-py3-none-any.whl", hash = "sha256:6fccfad17a27334bd0193681b369f476eda3409f17381a2d65aa7df3f7275645", size = 29254, upload-time = "2026-04-27T10:51:24.997Z" }, ] [[package]] @@ -2899,120 +2939,111 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] -[[package]] -name = "redis" -version = "7.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/32/6fac13a11e73e1bc67a2ae821a72bfe4c2d8c4c48f0267e4a952be0f1bae/redis-7.2.0.tar.gz", hash = "sha256:4dd5bf4bd4ae80510267f14185a15cba2a38666b941aff68cccf0256b51c1f26", size = 4901247, upload-time = "2026-02-16T17:16:22.797Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/cf/f6180b67f99688d83e15c84c5beda831d1d341e95872d224f87ccafafe61/redis-7.2.0-py3-none-any.whl", hash = "sha256:01f591f8598e483f1842d429e8ae3a820804566f1c73dca1b80e23af9fba0497", size = 394898, upload-time = "2026-02-16T17:16:20.693Z" }, -] - [[package]] name = "referencing" -version = "0.36.2" +version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] [[package]] name = "regex" -version = "2026.2.19" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/c0/d8079d4f6342e4cec5c3e7d7415b5cd3e633d5f4124f7a4626908dbe84c7/regex-2026.2.19.tar.gz", hash = "sha256:6fb8cb09b10e38f3ae17cc6dc04a1df77762bd0351b6ba9041438e7cc85ec310", size = 414973, upload-time = "2026-02-19T19:03:47.899Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/73/13b39c7c9356f333e564ab4790b6cb0df125b8e64e8d6474e73da49b1955/regex-2026.2.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1665138776e4ac1aa75146669236f7a8a696433ec4e525abf092ca9189247cc", size = 489541, upload-time = "2026-02-19T19:00:52.728Z" }, - { url = "https://files.pythonhosted.org/packages/15/77/fcc7bd9a67000d07fbcc11ed226077287a40d5c84544e62171d29d3ef59c/regex-2026.2.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d792b84709021945597e05656aac059526df4e0c9ef60a0eaebb306f8fafcaa8", size = 291414, upload-time = "2026-02-19T19:00:54.51Z" }, - { url = "https://files.pythonhosted.org/packages/f9/87/3997fc72dc59233426ef2e18dfdd105bb123812fff740ee9cc348f1a3243/regex-2026.2.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db970bcce4d63b37b3f9eb8c893f0db980bbf1d404a1d8d2b17aa8189de92c53", size = 289140, upload-time = "2026-02-19T19:00:56.841Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d0/b7dd3883ed1cff8ee0c0c9462d828aaf12be63bf5dc55453cbf423523b13/regex-2026.2.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03d706fbe7dfec503c8c3cb76f9352b3e3b53b623672aa49f18a251a6c71b8e6", size = 798767, upload-time = "2026-02-19T19:00:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7e/8e2d09103832891b2b735a2515abf377db21144c6dd5ede1fb03c619bf09/regex-2026.2.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dbff048c042beef60aa1848961384572c5afb9e8b290b0f1203a5c42cf5af65", size = 864436, upload-time = "2026-02-19T19:01:00.772Z" }, - { url = "https://files.pythonhosted.org/packages/8a/2e/afea8d23a6db1f67f45e3a0da3057104ce32e154f57dd0c8997274d45fcd/regex-2026.2.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccaaf9b907ea6b4223d5cbf5fa5dff5f33dc66f4907a25b967b8a81339a6e332", size = 912391, upload-time = "2026-02-19T19:01:02.865Z" }, - { url = "https://files.pythonhosted.org/packages/59/3c/ea5a4687adaba5e125b9bd6190153d0037325a0ba3757cc1537cc2c8dd90/regex-2026.2.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75472631eee7898e16a8a20998d15106cb31cfde21cdf96ab40b432a7082af06", size = 803702, upload-time = "2026-02-19T19:01:05.298Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c5/624a0705e8473a26488ec1a3a4e0b8763ecfc682a185c302dfec71daea35/regex-2026.2.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d89f85a5ccc0cec125c24be75610d433d65295827ebaf0d884cbe56df82d4774", size = 775980, upload-time = "2026-02-19T19:01:07.047Z" }, - { url = "https://files.pythonhosted.org/packages/4d/4b/ed776642533232b5599b7c1f9d817fe11faf597e8a92b7a44b841daaae76/regex-2026.2.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9f81806abdca3234c3dd582b8a97492e93de3602c8772013cb4affa12d1668", size = 788122, upload-time = "2026-02-19T19:01:08.744Z" }, - { url = "https://files.pythonhosted.org/packages/8c/58/e93e093921d13b9784b4f69896b6e2a9e09580a265c59d9eb95e87d288f2/regex-2026.2.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9dadc10d1c2bbb1326e572a226d2ec56474ab8aab26fdb8cf19419b372c349a9", size = 858910, upload-time = "2026-02-19T19:01:10.488Z" }, - { url = "https://files.pythonhosted.org/packages/85/77/ff1d25a0c56cd546e0455cbc93235beb33474899690e6a361fa6b52d265b/regex-2026.2.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6bc25d7e15f80c9dc7853cbb490b91c1ec7310808b09d56bd278fe03d776f4f6", size = 764153, upload-time = "2026-02-19T19:01:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ef/8ec58df26d52d04443b1dc56f9be4b409f43ed5ae6c0248a287f52311fc4/regex-2026.2.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:965d59792f5037d9138da6fed50ba943162160443b43d4895b182551805aff9c", size = 850348, upload-time = "2026-02-19T19:01:14.147Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b3/c42fd5ed91639ce5a4225b9df909180fc95586db071f2bf7c68d2ccbfbe6/regex-2026.2.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:38d88c6ed4a09ed61403dbdf515d969ccba34669af3961ceb7311ecd0cef504a", size = 789977, upload-time = "2026-02-19T19:01:15.838Z" }, - { url = "https://files.pythonhosted.org/packages/b6/22/bc3b58ebddbfd6ca5633e71fd41829ee931963aad1ebeec55aad0c23044e/regex-2026.2.19-cp312-cp312-win32.whl", hash = "sha256:5df947cabab4b643d4791af5e28aecf6bf62e6160e525651a12eba3d03755e6b", size = 266381, upload-time = "2026-02-19T19:01:17.952Z" }, - { url = "https://files.pythonhosted.org/packages/fc/4a/6ff550b63e67603ee60e69dc6bd2d5694e85046a558f663b2434bdaeb285/regex-2026.2.19-cp312-cp312-win_amd64.whl", hash = "sha256:4146dc576ea99634ae9c15587d0c43273b4023a10702998edf0fa68ccb60237a", size = 277274, upload-time = "2026-02-19T19:01:19.826Z" }, - { url = "https://files.pythonhosted.org/packages/cc/29/9ec48b679b1e87e7bc8517dff45351eab38f74fbbda1fbcf0e9e6d4e8174/regex-2026.2.19-cp312-cp312-win_arm64.whl", hash = "sha256:cdc0a80f679353bd68450d2a42996090c30b2e15ca90ded6156c31f1a3b63f3b", size = 270509, upload-time = "2026-02-19T19:01:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/d2/2d/a849835e76ac88fcf9e8784e642d3ea635d183c4112150ca91499d6703af/regex-2026.2.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8df08decd339e8b3f6a2eb5c05c687fe9d963ae91f352bc57beb05f5b2ac6879", size = 489329, upload-time = "2026-02-19T19:01:23.841Z" }, - { url = "https://files.pythonhosted.org/packages/da/aa/78ff4666d3855490bae87845a5983485e765e1f970da20adffa2937b241d/regex-2026.2.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3aa0944f1dc6e92f91f3b306ba7f851e1009398c84bfd370633182ee4fc26a64", size = 291308, upload-time = "2026-02-19T19:01:25.605Z" }, - { url = "https://files.pythonhosted.org/packages/cd/58/714384efcc07ae6beba528a541f6e99188c5cc1bc0295337f4e8a868296d/regex-2026.2.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c13228fbecb03eadbfd8f521732c5fda09ef761af02e920a3148e18ad0e09968", size = 289033, upload-time = "2026-02-19T19:01:27.243Z" }, - { url = "https://files.pythonhosted.org/packages/75/ec/6438a9344d2869cf5265236a06af1ca6d885e5848b6561e10629bc8e5a11/regex-2026.2.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d0e72703c60d68b18b27cde7cdb65ed2570ae29fb37231aa3076bfb6b1d1c13", size = 798798, upload-time = "2026-02-19T19:01:28.877Z" }, - { url = "https://files.pythonhosted.org/packages/c2/be/b1ce2d395e3fd2ce5f2fde2522f76cade4297cfe84cd61990ff48308749c/regex-2026.2.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46e69a4bf552e30e74a8aa73f473c87efcb7f6e8c8ece60d9fd7bf13d5c86f02", size = 864444, upload-time = "2026-02-19T19:01:30.933Z" }, - { url = "https://files.pythonhosted.org/packages/d5/97/a3406460c504f7136f140d9461960c25f058b0240e4424d6fb73c7a067ab/regex-2026.2.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8edda06079bd770f7f0cf7f3bba1a0b447b96b4a543c91fe0c142d034c166161", size = 912633, upload-time = "2026-02-19T19:01:32.744Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d9/e5dbef95008d84e9af1dc0faabbc34a7fbc8daa05bc5807c5cf86c2bec49/regex-2026.2.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cbc69eae834afbf634f7c902fc72ff3e993f1c699156dd1af1adab5d06b7fe7", size = 803718, upload-time = "2026-02-19T19:01:34.61Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e5/61d80132690a1ef8dc48e0f44248036877aebf94235d43f63a20d1598888/regex-2026.2.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bcf57d30659996ee5c7937999874504c11b5a068edc9515e6a59221cc2744dd1", size = 775975, upload-time = "2026-02-19T19:01:36.525Z" }, - { url = "https://files.pythonhosted.org/packages/05/32/ae828b3b312c972cf228b634447de27237d593d61505e6ad84723f8eabba/regex-2026.2.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8e6e77cd92216eb489e21e5652a11b186afe9bdefca8a2db739fd6b205a9e0a4", size = 788129, upload-time = "2026-02-19T19:01:38.498Z" }, - { url = "https://files.pythonhosted.org/packages/cb/25/d74f34676f22bec401eddf0e5e457296941e10cbb2a49a571ca7a2c16e5a/regex-2026.2.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b9ab8dec42afefa6314ea9b31b188259ffdd93f433d77cad454cd0b8d235ce1c", size = 858818, upload-time = "2026-02-19T19:01:40.409Z" }, - { url = "https://files.pythonhosted.org/packages/1e/eb/0bc2b01a6b0b264e1406e5ef11cae3f634c3bd1a6e61206fd3227ce8e89c/regex-2026.2.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:294c0fb2e87c6bcc5f577c8f609210f5700b993151913352ed6c6af42f30f95f", size = 764186, upload-time = "2026-02-19T19:01:43.009Z" }, - { url = "https://files.pythonhosted.org/packages/eb/37/5fe5a630d0d99ecf0c3570f8905dafbc160443a2d80181607770086c9812/regex-2026.2.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c0924c64b082d4512b923ac016d6e1dcf647a3560b8a4c7e55cbbd13656cb4ed", size = 850363, upload-time = "2026-02-19T19:01:45.015Z" }, - { url = "https://files.pythonhosted.org/packages/c3/45/ef68d805294b01ec030cfd388724ba76a5a21a67f32af05b17924520cb0b/regex-2026.2.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:790dbf87b0361606cb0d79b393c3e8f4436a14ee56568a7463014565d97da02a", size = 790026, upload-time = "2026-02-19T19:01:47.51Z" }, - { url = "https://files.pythonhosted.org/packages/d6/3a/40d3b66923dfc5aeba182f194f0ca35d09afe8c031a193e6ae46971a0a0e/regex-2026.2.19-cp313-cp313-win32.whl", hash = "sha256:43cdde87006271be6963896ed816733b10967baaf0e271d529c82e93da66675b", size = 266372, upload-time = "2026-02-19T19:01:49.469Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f2/39082e8739bfd553497689e74f9d5e5bb531d6f8936d0b94f43e18f219c0/regex-2026.2.19-cp313-cp313-win_amd64.whl", hash = "sha256:127ea69273485348a126ebbf3d6052604d3c7da284f797bba781f364c0947d47", size = 277253, upload-time = "2026-02-19T19:01:51.208Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c2/852b9600d53fb47e47080c203e2cdc0ac7e84e37032a57e0eaa37446033a/regex-2026.2.19-cp313-cp313-win_arm64.whl", hash = "sha256:5e56c669535ac59cbf96ca1ece0ef26cb66809990cda4fa45e1e32c3b146599e", size = 270505, upload-time = "2026-02-19T19:01:52.865Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a2/e0b4575b93bc84db3b1fab24183e008691cd2db5c0ef14ed52681fbd94dd/regex-2026.2.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93d881cab5afdc41a005dba1524a40947d6f7a525057aa64aaf16065cf62faa9", size = 492202, upload-time = "2026-02-19T19:01:54.816Z" }, - { url = "https://files.pythonhosted.org/packages/24/b5/b84fec8cbb5f92a7eed2b6b5353a6a9eed9670fee31817c2da9eb85dc797/regex-2026.2.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:80caaa1ddcc942ec7be18427354f9d58a79cee82dea2a6b3d4fd83302e1240d7", size = 292884, upload-time = "2026-02-19T19:01:58.254Z" }, - { url = "https://files.pythonhosted.org/packages/70/0c/fe89966dfae43da46f475362401f03e4d7dc3a3c955b54f632abc52669e0/regex-2026.2.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d793c5b4d2b4c668524cd1651404cfc798d40694c759aec997e196fe9729ec60", size = 291236, upload-time = "2026-02-19T19:01:59.966Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f7/bda2695134f3e63eb5cccbbf608c2a12aab93d261ff4e2fe49b47fabc948/regex-2026.2.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5100acb20648d9efd3f4e7e91f51187f95f22a741dcd719548a6cf4e1b34b3f", size = 807660, upload-time = "2026-02-19T19:02:01.632Z" }, - { url = "https://files.pythonhosted.org/packages/11/56/6e3a4bf5e60d17326b7003d91bbde8938e439256dec211d835597a44972d/regex-2026.2.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5e3a31e94d10e52a896adaa3adf3621bd526ad2b45b8c2d23d1bbe74c7423007", size = 873585, upload-time = "2026-02-19T19:02:03.522Z" }, - { url = "https://files.pythonhosted.org/packages/35/5e/c90c6aa4d1317cc11839359479cfdd2662608f339e84e81ba751c8a4e461/regex-2026.2.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8497421099b981f67c99eba4154cf0dfd8e47159431427a11cfb6487f7791d9e", size = 915243, upload-time = "2026-02-19T19:02:05.608Z" }, - { url = "https://files.pythonhosted.org/packages/90/7c/981ea0694116793001496aaf9524e5c99e122ec3952d9e7f1878af3a6bf1/regex-2026.2.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e7a08622f7d51d7a068f7e4052a38739c412a3e74f55817073d2e2418149619", size = 812922, upload-time = "2026-02-19T19:02:08.115Z" }, - { url = "https://files.pythonhosted.org/packages/2d/be/9eda82afa425370ffdb3fa9f3ea42450b9ae4da3ff0a4ec20466f69e371b/regex-2026.2.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8abe671cf0f15c26b1ad389bf4043b068ce7d3b1c5d9313e12895f57d6738555", size = 781318, upload-time = "2026-02-19T19:02:10.072Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d5/50f0bbe56a8199f60a7b6c714e06e54b76b33d31806a69d0703b23ce2a9e/regex-2026.2.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5a8f28dd32a4ce9c41758d43b5b9115c1c497b4b1f50c457602c1d571fa98ce1", size = 795649, upload-time = "2026-02-19T19:02:11.96Z" }, - { url = "https://files.pythonhosted.org/packages/c5/09/d039f081e44a8b0134d0bb2dd805b0ddf390b69d0b58297ae098847c572f/regex-2026.2.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:654dc41a5ba9b8cc8432b3f1aa8906d8b45f3e9502442a07c2f27f6c63f85db5", size = 868844, upload-time = "2026-02-19T19:02:14.043Z" }, - { url = "https://files.pythonhosted.org/packages/ef/53/e2903b79a19ec8557fe7cd21cd093956ff2dbc2e0e33969e3adbe5b184dd/regex-2026.2.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4a02faea614e7fdd6ba8b3bec6c8e79529d356b100381cec76e638f45d12ca04", size = 770113, upload-time = "2026-02-19T19:02:16.161Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e2/784667767b55714ebb4e59bf106362327476b882c0b2f93c25e84cc99b1a/regex-2026.2.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d96162140bb819814428800934c7b71b7bffe81fb6da2d6abc1dcca31741eca3", size = 854922, upload-time = "2026-02-19T19:02:18.155Z" }, - { url = "https://files.pythonhosted.org/packages/59/78/9ef4356bd4aed752775bd18071034979b85f035fec51f3a4f9dea497a254/regex-2026.2.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c227f2922153ee42bbeb355fd6d009f8c81d9d7bdd666e2276ce41f53ed9a743", size = 799636, upload-time = "2026-02-19T19:02:20.04Z" }, - { url = "https://files.pythonhosted.org/packages/cf/54/fcfc9287f20c5c9bd8db755aafe3e8cf4d99a6a3f1c7162ee182e0ca9374/regex-2026.2.19-cp313-cp313t-win32.whl", hash = "sha256:a178df8ec03011153fbcd2c70cb961bc98cbbd9694b28f706c318bee8927c3db", size = 268968, upload-time = "2026-02-19T19:02:22.816Z" }, - { url = "https://files.pythonhosted.org/packages/1e/a0/ff24c6cb1273e42472706d277147fc38e1f9074a280fb6034b0fc9b69415/regex-2026.2.19-cp313-cp313t-win_amd64.whl", hash = "sha256:2c1693ca6f444d554aa246b592355b5cec030ace5a2729eae1b04ab6e853e768", size = 280390, upload-time = "2026-02-19T19:02:25.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b6/a3f6ad89d780ffdeebb4d5e2e3e30bd2ef1f70f6a94d1760e03dd1e12c60/regex-2026.2.19-cp313-cp313t-win_arm64.whl", hash = "sha256:c0761d7ae8d65773e01515ebb0b304df1bf37a0a79546caad9cbe79a42c12af7", size = 271643, upload-time = "2026-02-19T19:02:27.175Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e2/7ad4e76a6dddefc0d64dbe12a4d3ca3947a19ddc501f864a5df2a8222ddd/regex-2026.2.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:03d191a9bcf94d31af56d2575210cb0d0c6a054dbcad2ea9e00aa4c42903b919", size = 489306, upload-time = "2026-02-19T19:02:29.058Z" }, - { url = "https://files.pythonhosted.org/packages/14/95/ee1736135733afbcf1846c58671046f99c4d5170102a150ebb3dd8d701d9/regex-2026.2.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:516ee067c6c721d0d0bfb80a2004edbd060fffd07e456d4e1669e38fe82f922e", size = 291218, upload-time = "2026-02-19T19:02:31.083Z" }, - { url = "https://files.pythonhosted.org/packages/ef/08/180d1826c3d7065200a5168c6b993a44947395c7bb6e04b2c2a219c34225/regex-2026.2.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:997862c619994c4a356cb7c3592502cbd50c2ab98da5f61c5c871f10f22de7e5", size = 289097, upload-time = "2026-02-19T19:02:33.485Z" }, - { url = "https://files.pythonhosted.org/packages/28/93/0651924c390c5740f5f896723f8ddd946a6c63083a7d8647231c343912ff/regex-2026.2.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b9e1b8a7ebe2807cd7bbdf662510c8e43053a23262b9f46ad4fc2dfc9d204e", size = 799147, upload-time = "2026-02-19T19:02:35.669Z" }, - { url = "https://files.pythonhosted.org/packages/a7/00/2078bd8bcd37d58a756989adbfd9f1d0151b7ca4085a9c2a07e917fbac61/regex-2026.2.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6c8fb3b19652e425ff24169dad3ee07f99afa7996caa9dfbb3a9106cd726f49a", size = 865239, upload-time = "2026-02-19T19:02:38.012Z" }, - { url = "https://files.pythonhosted.org/packages/2a/13/75195161ec16936b35a365fa8c1dd2ab29fd910dd2587765062b174d8cfc/regex-2026.2.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50f1ee9488dd7a9fda850ec7c68cad7a32fa49fd19733f5403a3f92b451dcf73", size = 911904, upload-time = "2026-02-19T19:02:40.737Z" }, - { url = "https://files.pythonhosted.org/packages/96/72/ac42f6012179343d1c4bd0ffee8c948d841cb32ea188d37e96d80527fcc9/regex-2026.2.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab780092b1424d13200aa5a62996e95f65ee3db8509be366437439cdc0af1a9f", size = 803518, upload-time = "2026-02-19T19:02:42.923Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d1/75a08e2269b007b9783f0f86aa64488e023141219cb5f14dc1e69cda56c6/regex-2026.2.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:17648e1a88e72d88641b12635e70e6c71c5136ba14edba29bf8fc6834005a265", size = 775866, upload-time = "2026-02-19T19:02:45.189Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/70e7d05faf6994c2ca7a9fcaa536da8f8e4031d45b0ec04b57040ede201f/regex-2026.2.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f914ae8c804c8a8a562fe216100bc156bfb51338c1f8d55fe32cf407774359a", size = 788224, upload-time = "2026-02-19T19:02:47.804Z" }, - { url = "https://files.pythonhosted.org/packages/c8/83/34a2dd601f9deb13c20545c674a55f4a05c90869ab73d985b74d639bac43/regex-2026.2.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c7e121a918bbee3f12ac300ce0a0d2f2c979cf208fb071ed8df5a6323281915c", size = 859682, upload-time = "2026-02-19T19:02:50.583Z" }, - { url = "https://files.pythonhosted.org/packages/8e/30/136db9a09a7f222d6e48b806f3730e7af6499a8cad9c72ac0d49d52c746e/regex-2026.2.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2fedd459c791da24914ecc474feecd94cf7845efb262ac3134fe27cbd7eda799", size = 764223, upload-time = "2026-02-19T19:02:52.777Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ea/bb947743c78a16df481fa0635c50aa1a439bb80b0e6dc24cd4e49c716679/regex-2026.2.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ea8dfc99689240e61fb21b5fc2828f68b90abf7777d057b62d3166b7c1543c4c", size = 850101, upload-time = "2026-02-19T19:02:55.87Z" }, - { url = "https://files.pythonhosted.org/packages/25/27/e3bfe6e97a99f7393665926be02fef772da7f8aa59e50bc3134e4262a032/regex-2026.2.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fff45852160960f29e184ec8a5be5ab4063cfd0b168d439d1fc4ac3744bf29e", size = 789904, upload-time = "2026-02-19T19:02:58.523Z" }, - { url = "https://files.pythonhosted.org/packages/84/7b/7e2be6f00cea59d08761b027ad237002e90cac74b1607200ebaa2ba3d586/regex-2026.2.19-cp314-cp314-win32.whl", hash = "sha256:5390b130cce14a7d1db226a3896273b7b35be10af35e69f1cca843b6e5d2bb2d", size = 271784, upload-time = "2026-02-19T19:03:00.418Z" }, - { url = "https://files.pythonhosted.org/packages/f7/f6/639911530335773e7ec60bcaa519557b719586024c1d7eaad1daf87b646b/regex-2026.2.19-cp314-cp314-win_amd64.whl", hash = "sha256:e581f75d5c0b15669139ca1c2d3e23a65bb90e3c06ba9d9ea194c377c726a904", size = 280506, upload-time = "2026-02-19T19:03:02.302Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ec/2582b56b4e036d46bb9b5d74a18548439ffa16c11cf59076419174d80f48/regex-2026.2.19-cp314-cp314-win_arm64.whl", hash = "sha256:7187fdee1be0896c1499a991e9bf7c78e4b56b7863e7405d7bb687888ac10c4b", size = 273557, upload-time = "2026-02-19T19:03:04.836Z" }, - { url = "https://files.pythonhosted.org/packages/49/0b/f901cfeb4efd83e4f5c3e9f91a6de77e8e5ceb18555698aca3a27e215ed3/regex-2026.2.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5ec1d7c080832fdd4e150c6f5621fe674c70c63b3ae5a4454cebd7796263b175", size = 492196, upload-time = "2026-02-19T19:03:08.188Z" }, - { url = "https://files.pythonhosted.org/packages/94/0a/349b959e3da874e15eda853755567b4cde7e5309dbb1e07bfe910cfde452/regex-2026.2.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8457c1bc10ee9b29cdfd897ccda41dce6bde0e9abd514bcfef7bcd05e254d411", size = 292878, upload-time = "2026-02-19T19:03:10.272Z" }, - { url = "https://files.pythonhosted.org/packages/98/b0/9d81b3c2c5ddff428f8c506713737278979a2c476f6e3675a9c51da0c389/regex-2026.2.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cce8027010d1ffa3eb89a0b19621cdc78ae548ea2b49fea1f7bfb3ea77064c2b", size = 291235, upload-time = "2026-02-19T19:03:12.5Z" }, - { url = "https://files.pythonhosted.org/packages/04/e7/be7818df8691dbe9508c381ea2cc4c1153e4fdb1c4b06388abeaa93bd712/regex-2026.2.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11c138febb40546ff9e026dbbc41dc9fb8b29e61013fa5848ccfe045f5b23b83", size = 807893, upload-time = "2026-02-19T19:03:15.064Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b6/b898a8b983190cfa0276031c17beb73cfd1db07c03c8c37f606d80b655e2/regex-2026.2.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:74ff212aa61532246bb3036b3dfea62233414b0154b8bc3676975da78383cac3", size = 873696, upload-time = "2026-02-19T19:03:17.848Z" }, - { url = "https://files.pythonhosted.org/packages/1a/98/126ba671d54f19080ec87cad228fb4f3cc387fff8c4a01cb4e93f4ff9d94/regex-2026.2.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d00c95a2b6bfeb3ea1cb68d1751b1dfce2b05adc2a72c488d77a780db06ab867", size = 915493, upload-time = "2026-02-19T19:03:20.343Z" }, - { url = "https://files.pythonhosted.org/packages/b2/10/550c84a1a1a7371867fe8be2bea7df55e797cbca4709974811410e195c5d/regex-2026.2.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:311fcccb76af31be4c588d5a17f8f1a059ae8f4b097192896ebffc95612f223a", size = 813094, upload-time = "2026-02-19T19:03:23.287Z" }, - { url = "https://files.pythonhosted.org/packages/29/fb/ba221d2fc76a27b6b7d7a60f73a7a6a7bac21c6ba95616a08be2bcb434b0/regex-2026.2.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77cfd6b5e7c4e8bf7a39d243ea05882acf5e3c7002b0ef4756de6606893b0ecd", size = 781583, upload-time = "2026-02-19T19:03:26.872Z" }, - { url = "https://files.pythonhosted.org/packages/26/f1/af79231301297c9e962679efc04a31361b58dc62dec1fc0cb4b8dd95956a/regex-2026.2.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6380f29ff212ec922b6efb56100c089251940e0526a0d05aa7c2d9b571ddf2fe", size = 795875, upload-time = "2026-02-19T19:03:29.223Z" }, - { url = "https://files.pythonhosted.org/packages/a0/90/1e1d76cb0a2d0a4f38a039993e1c5cd971ae50435d751c5bae4f10e1c302/regex-2026.2.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:655f553a1fa3ab8a7fd570eca793408b8d26a80bfd89ed24d116baaf13a38969", size = 868916, upload-time = "2026-02-19T19:03:31.415Z" }, - { url = "https://files.pythonhosted.org/packages/9a/67/a1c01da76dbcfed690855a284c665cc0a370e7d02d1bd635cf9ff7dd74b8/regex-2026.2.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:015088b8558502f1f0bccd58754835aa154a7a5b0bd9d4c9b7b96ff4ae9ba876", size = 770386, upload-time = "2026-02-19T19:03:33.972Z" }, - { url = "https://files.pythonhosted.org/packages/49/6f/94842bf294f432ff3836bfd91032e2ecabea6d284227f12d1f935318c9c4/regex-2026.2.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9e6693b8567a59459b5dda19104c4a4dbbd4a1c78833eacc758796f2cfef1854", size = 855007, upload-time = "2026-02-19T19:03:36.238Z" }, - { url = "https://files.pythonhosted.org/packages/ff/93/393cd203ca0d1d368f05ce12d2c7e91a324bc93c240db2e6d5ada05835f4/regex-2026.2.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4071209fd4376ab5ceec72ad3507e9d3517c59e38a889079b98916477a871868", size = 799863, upload-time = "2026-02-19T19:03:38.497Z" }, - { url = "https://files.pythonhosted.org/packages/43/d9/35afda99bd92bf1a5831e55a4936d37ea4bed6e34c176a3c2238317faf4f/regex-2026.2.19-cp314-cp314t-win32.whl", hash = "sha256:2905ff4a97fad42f2d0834d8b1ea3c2f856ec209837e458d71a061a7d05f9f01", size = 274742, upload-time = "2026-02-19T19:03:40.804Z" }, - { url = "https://files.pythonhosted.org/packages/ae/42/7edc3344dcc87b698e9755f7f685d463852d481302539dae07135202d3ca/regex-2026.2.19-cp314-cp314t-win_amd64.whl", hash = "sha256:64128549b600987e0f335c2365879895f860a9161f283b14207c800a6ed623d3", size = 284443, upload-time = "2026-02-19T19:03:42.954Z" }, - { url = "https://files.pythonhosted.org/packages/3a/45/affdf2d851b42adf3d13fc5b3b059372e9bd299371fd84cf5723c45871fa/regex-2026.2.19-cp314-cp314t-win_arm64.whl", hash = "sha256:a09ae430e94c049dc6957f6baa35ee3418a3a77f3c12b6e02883bd80a2b679b0", size = 274932, upload-time = "2026-02-19T19:03:45.488Z" }, +version = "2026.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/3a246dbf05666918bd3664d9d787f84a9108f6f43cc953a077e4a7dfdb7e/regex-2026.4.4.tar.gz", hash = "sha256:e08270659717f6973523ce3afbafa53515c4dc5dcad637dc215b6fd50f689423", size = 416000, upload-time = "2026-04-03T20:56:28.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/28/b972a4d3df61e1d7bcf1b59fdb3cddef22f88b6be43f161bb41ebc0e4081/regex-2026.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c07ab8794fa929e58d97a0e1796b8b76f70943fa39df225ac9964615cf1f9d52", size = 490434, upload-time = "2026-04-03T20:53:40.219Z" }, + { url = "https://files.pythonhosted.org/packages/84/20/30041446cf6dc3e0eab344fc62770e84c23b6b68a3b657821f9f80cb69b4/regex-2026.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c785939dc023a1ce4ec09599c032cc9933d258a998d16ca6f2b596c010940eb", size = 292061, upload-time = "2026-04-03T20:53:41.862Z" }, + { url = "https://files.pythonhosted.org/packages/62/c8/3baa06d75c98c46d4cc4262b71fd2edb9062b5665e868bca57859dadf93a/regex-2026.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b1ce5c81c9114f1ce2f9288a51a8fd3aeea33a0cc440c415bf02da323aa0a76", size = 289628, upload-time = "2026-04-03T20:53:43.701Z" }, + { url = "https://files.pythonhosted.org/packages/31/87/3accf55634caad8c0acab23f5135ef7d4a21c39f28c55c816ae012931408/regex-2026.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:760ef21c17d8e6a4fe8cf406a97cf2806a4df93416ccc82fc98d25b1c20425be", size = 796651, upload-time = "2026-04-03T20:53:45.379Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0c/aaa2c83f34efedbf06f61cb1942c25f6cf1ee3b200f832c4d05f28306c2e/regex-2026.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7088fcdcb604a4417c208e2169715800d28838fefd7455fbe40416231d1d47c1", size = 865916, upload-time = "2026-04-03T20:53:47.064Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f6/8c6924c865124643e8f37823eca845dc27ac509b2ee58123685e71cd0279/regex-2026.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:07edca1ba687998968f7db5bc355288d0c6505caa7374f013d27356d93976d13", size = 912287, upload-time = "2026-04-03T20:53:49.422Z" }, + { url = "https://files.pythonhosted.org/packages/11/0e/a9f6f81013e0deaf559b25711623864970fe6a098314e374ccb1540a4152/regex-2026.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f657a7c1c6ec51b5e0ba97c9817d06b84ea5fa8d82e43b9405de0defdc2b9", size = 801126, upload-time = "2026-04-03T20:53:51.096Z" }, + { url = "https://files.pythonhosted.org/packages/71/61/3a0cc8af2dc0c8deb48e644dd2521f173f7e6513c6e195aad9aa8dd77ac5/regex-2026.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2b69102a743e7569ebee67e634a69c4cb7e59d6fa2e1aa7d3bdbf3f61435f62d", size = 776788, upload-time = "2026-04-03T20:53:52.889Z" }, + { url = "https://files.pythonhosted.org/packages/64/0b/8bb9cbf21ef7dee58e49b0fdb066a7aded146c823202e16494a36777594f/regex-2026.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dac006c8b6dda72d86ea3d1333d45147de79a3a3f26f10c1cf9287ca4ca0ac3", size = 785184, upload-time = "2026-04-03T20:53:55.627Z" }, + { url = "https://files.pythonhosted.org/packages/99/c2/d3e80e8137b25ee06c92627de4e4d98b94830e02b3e6f81f3d2e3f504cf5/regex-2026.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:50a766ee2010d504554bfb5f578ed2e066898aa26411d57e6296230627cdefa0", size = 859913, upload-time = "2026-04-03T20:53:57.249Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/9d5d876157d969c804622456ef250017ac7a8f83e0e14f903b9e6df5ce95/regex-2026.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9e2f5217648f68e3028c823df58663587c1507a5ba8419f4fdfc8a461be76043", size = 765732, upload-time = "2026-04-03T20:53:59.428Z" }, + { url = "https://files.pythonhosted.org/packages/82/80/b568935b4421388561c8ed42aff77247285d3ae3bb2a6ca22af63bae805e/regex-2026.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39d8de85a08e32632974151ba59c6e9140646dcc36c80423962b1c5c0a92e244", size = 852152, upload-time = "2026-04-03T20:54:01.505Z" }, + { url = "https://files.pythonhosted.org/packages/39/29/f0f81217e21cd998245da047405366385d5c6072048038a3d33b37a79dc0/regex-2026.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55d9304e0e7178dfb1e106c33edf834097ddf4a890e2f676f6c5118f84390f73", size = 789076, upload-time = "2026-04-03T20:54:03.323Z" }, + { url = "https://files.pythonhosted.org/packages/49/1d/1d957a61976ab9d4e767dd4f9d04b66cc0c41c5e36cf40e2d43688b5ae6f/regex-2026.4.4-cp312-cp312-win32.whl", hash = "sha256:04bb679bc0bde8a7bfb71e991493d47314e7b98380b083df2447cda4b6edb60f", size = 266700, upload-time = "2026-04-03T20:54:05.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/bf575d396aeb58ea13b06ef2adf624f65b70fafef6950a80fc3da9cae3bc/regex-2026.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:db0ac18435a40a2543dbb3d21e161a6c78e33e8159bd2e009343d224bb03bb1b", size = 277768, upload-time = "2026-04-03T20:54:07.312Z" }, + { url = "https://files.pythonhosted.org/packages/c9/27/049df16ec6a6828ccd72add3c7f54b4df029669bea8e9817df6fff58be90/regex-2026.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:4ce255cc05c1947a12989c6db801c96461947adb7a59990f1360b5983fab4983", size = 270568, upload-time = "2026-04-03T20:54:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/9d/83/c4373bc5f31f2cf4b66f9b7c31005bd87fe66f0dce17701f7db4ee79ee29/regex-2026.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:62f5519042c101762509b1d717b45a69c0139d60414b3c604b81328c01bd1943", size = 490273, upload-time = "2026-04-03T20:54:11.202Z" }, + { url = "https://files.pythonhosted.org/packages/46/f8/fe62afbcc3cf4ad4ac9adeaafd98aa747869ae12d3e8e2ac293d0593c435/regex-2026.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3790ba9fb5dd76715a7afe34dbe603ba03f8820764b1dc929dd08106214ed031", size = 291954, upload-time = "2026-04-03T20:54:13.412Z" }, + { url = "https://files.pythonhosted.org/packages/5a/92/4712b9fe6a33d232eeb1c189484b80c6c4b8422b90e766e1195d6e758207/regex-2026.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fae3c6e795d7678963f2170152b0d892cf6aee9ee8afc8c45e6be38d5107fe7", size = 289487, upload-time = "2026-04-03T20:54:15.824Z" }, + { url = "https://files.pythonhosted.org/packages/88/2c/f83b93f85e01168f1070f045a42d4c937b69fdb8dd7ae82d307253f7e36e/regex-2026.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:298c3ec2d53225b3bf91142eb9691025bab610e0c0c51592dde149db679b3d17", size = 796646, upload-time = "2026-04-03T20:54:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/df/55/61a2e17bf0c4dc57e11caf8dd11771280d8aaa361785f9e3bc40d653f4a7/regex-2026.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e9638791082eaf5b3ac112c587518ee78e083a11c4b28012d8fe2a0f536dfb17", size = 865904, upload-time = "2026-04-03T20:54:20.019Z" }, + { url = "https://files.pythonhosted.org/packages/45/32/1ac8ed1b5a346b5993a3d256abe0a0f03b0b73c8cc88d928537368ac65b6/regex-2026.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae3e764bd4c5ff55035dc82a8d49acceb42a5298edf6eb2fc4d328ee5dd7afae", size = 912304, upload-time = "2026-04-03T20:54:22.403Z" }, + { url = "https://files.pythonhosted.org/packages/26/47/2ee5c613ab546f0eddebf9905d23e07beb933416b1246c2d8791d01979b4/regex-2026.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffa81f81b80047ba89a3c69ae6a0f78d06f4a42ce5126b0eb2a0a10ad44e0b2e", size = 801126, upload-time = "2026-04-03T20:54:24.308Z" }, + { url = "https://files.pythonhosted.org/packages/75/cd/41dacd129ca9fd20bd7d02f83e0fad83e034ac8a084ec369c90f55ef37e2/regex-2026.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f56ebf9d70305307a707911b88469213630aba821e77de7d603f9d2f0730687d", size = 776772, upload-time = "2026-04-03T20:54:26.319Z" }, + { url = "https://files.pythonhosted.org/packages/89/6d/5af0b588174cb5f46041fa7dd64d3fd5cd2fe51f18766703d1edc387f324/regex-2026.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:773d1dfd652bbffb09336abf890bfd64785c7463716bf766d0eb3bc19c8b7f27", size = 785228, upload-time = "2026-04-03T20:54:28.387Z" }, + { url = "https://files.pythonhosted.org/packages/b7/3b/f5a72b7045bd59575fc33bf1345f156fcfd5a8484aea6ad84b12c5a82114/regex-2026.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d51d20befd5275d092cdffba57ded05f3c436317ee56466c8928ac32d960edaf", size = 860032, upload-time = "2026-04-03T20:54:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/39/a4/72a317003d6fcd7a573584a85f59f525dfe8f67e355ca74eb6b53d66a5e2/regex-2026.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0a51cdb3c1e9161154f976cb2bef9894bc063ac82f31b733087ffb8e880137d0", size = 765714, upload-time = "2026-04-03T20:54:32.789Z" }, + { url = "https://files.pythonhosted.org/packages/25/1e/5672e16f34dbbcb2560cc7e6a2fbb26dfa8b270711e730101da4423d3973/regex-2026.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae5266a82596114e41fb5302140e9630204c1b5f325c770bec654b95dd54b0aa", size = 852078, upload-time = "2026-04-03T20:54:34.546Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0d/c813f0af7c6cc7ed7b9558bac2e5120b60ad0fa48f813e4d4bd55446f214/regex-2026.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c882cd92ec68585e9c1cf36c447ec846c0d94edd706fe59e0c198e65822fd23b", size = 789181, upload-time = "2026-04-03T20:54:36.642Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6d/a344608d1adbd2a95090ddd906cec09a11be0e6517e878d02a5123e0917f/regex-2026.4.4-cp313-cp313-win32.whl", hash = "sha256:05568c4fbf3cb4fa9e28e3af198c40d3237cf6041608a9022285fe567ec3ad62", size = 266690, upload-time = "2026-04-03T20:54:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/31/07/54049f89b46235ca6f45cd6c88668a7050e77d4a15555e47dd40fde75263/regex-2026.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:3384df51ed52db0bea967e21458ab0a414f67cdddfd94401688274e55147bb81", size = 277733, upload-time = "2026-04-03T20:54:40.11Z" }, + { url = "https://files.pythonhosted.org/packages/0e/21/61366a8e20f4d43fb597708cac7f0e2baadb491ecc9549b4980b2be27d16/regex-2026.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:acd38177bd2c8e69a411d6521760806042e244d0ef94e2dd03ecdaa8a3c99427", size = 270565, upload-time = "2026-04-03T20:54:41.883Z" }, + { url = "https://files.pythonhosted.org/packages/f1/1e/3a2b9672433bef02f5d39aa1143ca2c08f311c1d041c464a42be9ae648dc/regex-2026.4.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f94a11a9d05afcfcfa640e096319720a19cc0c9f7768e1a61fceee6a3afc6c7c", size = 494126, upload-time = "2026-04-03T20:54:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/4e/4b/c132a4f4fe18ad3340d89fcb56235132b69559136036b845be3c073142ed/regex-2026.4.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:36bcb9d6d1307ab629edc553775baada2aefa5c50ccc0215fbfd2afcfff43141", size = 293882, upload-time = "2026-04-03T20:54:45.41Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5f/eaa38092ce7a023656280f2341dbbd4ad5f05d780a70abba7bb4f4bea54c/regex-2026.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261c015b3e2ed0919157046d768774ecde57f03d8fa4ba78d29793447f70e717", size = 292334, upload-time = "2026-04-03T20:54:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f6/dd38146af1392dac33db7074ab331cec23cced3759167735c42c5460a243/regex-2026.4.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c228cf65b4a54583763645dcd73819b3b381ca8b4bb1b349dee1c135f4112c07", size = 811691, upload-time = "2026-04-03T20:54:49.074Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f0/dc54c2e69f5eeec50601054998ec3690d5344277e782bd717e49867c1d29/regex-2026.4.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dd2630faeb6876fb0c287f664d93ddce4d50cd46c6e88e60378c05c9047e08ca", size = 871227, upload-time = "2026-04-03T20:54:51.035Z" }, + { url = "https://files.pythonhosted.org/packages/a1/af/cb16bd5dc61621e27df919a4449bbb7e5a1034c34d307e0a706e9cc0f3e3/regex-2026.4.4-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6a50ab11b7779b849472337191f3a043e27e17f71555f98d0092fa6d73364520", size = 917435, upload-time = "2026-04-03T20:54:52.994Z" }, + { url = "https://files.pythonhosted.org/packages/5c/71/8b260897f22996b666edd9402861668f45a2ca259f665ac029e6104a2d7d/regex-2026.4.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0734f63afe785138549fbe822a8cfeaccd1bae814c5057cc0ed5b9f2de4fc883", size = 816358, upload-time = "2026-04-03T20:54:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/1c/60/775f7f72a510ef238254906c2f3d737fc80b16ca85f07d20e318d2eea894/regex-2026.4.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4ee50606cb1967db7e523224e05f32089101945f859928e65657a2cbb3d278b", size = 785549, upload-time = "2026-04-03T20:54:57.01Z" }, + { url = "https://files.pythonhosted.org/packages/58/42/34d289b3627c03cf381e44da534a0021664188fa49ba41513da0b4ec6776/regex-2026.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6c1818f37be3ca02dcb76d63f2c7aaba4b0dc171b579796c6fbe00148dfec6b1", size = 801364, upload-time = "2026-04-03T20:54:58.981Z" }, + { url = "https://files.pythonhosted.org/packages/fc/20/f6ecf319b382a8f1ab529e898b222c3f30600fcede7834733c26279e7465/regex-2026.4.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f5bfc2741d150d0be3e4a0401a5c22b06e60acb9aa4daa46d9e79a6dcd0f135b", size = 866221, upload-time = "2026-04-03T20:55:00.88Z" }, + { url = "https://files.pythonhosted.org/packages/92/6a/9f16d3609d549bd96d7a0b2aee1625d7512ba6a03efc01652149ef88e74d/regex-2026.4.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:504ffa8a03609a087cad81277a629b6ce884b51a24bd388a7980ad61748618ff", size = 772530, upload-time = "2026-04-03T20:55:03.213Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f6/aa9768bc96a4c361ac96419fbaf2dcdc33970bb813df3ba9b09d5d7b6d96/regex-2026.4.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70aadc6ff12e4b444586e57fc30771f86253f9f0045b29016b9605b4be5f7dfb", size = 856989, upload-time = "2026-04-03T20:55:05.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b4/c671db3556be2473ae3e4bb7a297c518d281452871501221251ea4ecba57/regex-2026.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f4f83781191007b6ef43b03debc35435f10cad9b96e16d147efe84a1d48bdde4", size = 803241, upload-time = "2026-04-03T20:55:07.162Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5c/83e3b1d89fa4f6e5a1bc97b4abd4a9a97b3c1ac7854164f694f5f0ba98a0/regex-2026.4.4-cp313-cp313t-win32.whl", hash = "sha256:e014a797de43d1847df957c0a2a8e861d1c17547ee08467d1db2c370b7568baa", size = 269921, upload-time = "2026-04-03T20:55:09.62Z" }, + { url = "https://files.pythonhosted.org/packages/28/07/077c387121f42cdb4d92b1301133c0d93b5709d096d1669ab847dda9fe2e/regex-2026.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:b15b88b0d52b179712632832c1d6e58e5774f93717849a41096880442da41ab0", size = 281240, upload-time = "2026-04-03T20:55:11.521Z" }, + { url = "https://files.pythonhosted.org/packages/9d/22/ead4a4abc7c59a4d882662aa292ca02c8b617f30b6e163bc1728879e9353/regex-2026.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:586b89cdadf7d67bf86ae3342a4dcd2b8d70a832d90c18a0ae955105caf34dbe", size = 272440, upload-time = "2026-04-03T20:55:13.365Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f5/ed97c2dc47b5fbd4b73c0d7d75f9ebc8eca139f2bbef476bba35f28c0a77/regex-2026.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2da82d643fa698e5e5210e54af90181603d5853cf469f5eedf9bfc8f59b4b8c7", size = 490343, upload-time = "2026-04-03T20:55:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/de4828a7385ec166d673a5790ad06ac48cdaa98bc0960108dd4b9cc1aef7/regex-2026.4.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:54a1189ad9d9357760557c91103d5e421f0a2dabe68a5cdf9103d0dcf4e00752", size = 291909, upload-time = "2026-04-03T20:55:17.558Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d6/5cfbfc97f3201a4d24b596a77957e092030dcc4205894bc035cedcfce62f/regex-2026.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:76d67d5afb1fe402d10a6403bae668d000441e2ab115191a804287d53b772951", size = 289692, upload-time = "2026-04-03T20:55:20.561Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/f2212d9fd56fe897e36d0110ba30ba2d247bd6410c5bd98499c7e5a1e1f2/regex-2026.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e7cd3e4ee8d80447a83bbc9ab0c8459781fa77087f856c3e740d7763be0df27f", size = 796979, upload-time = "2026-04-03T20:55:22.56Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e3/a016c12675fbac988a60c7e1c16e67823ff0bc016beb27bd7a001dbdabc6/regex-2026.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e19e18c568d2866d8b6a6dfad823db86193503f90823a8f66689315ba28fbe8", size = 866744, upload-time = "2026-04-03T20:55:24.646Z" }, + { url = "https://files.pythonhosted.org/packages/af/a4/0b90ca4cf17adc3cb43de80ec71018c37c88ad64987e8d0d481a95ca60b5/regex-2026.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7698a6f38730fd1385d390d1ed07bb13dce39aa616aca6a6d89bea178464b9a4", size = 911613, upload-time = "2026-04-03T20:55:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3b/2b3dac0b82d41ab43aa87c6ecde63d71189d03fe8854b8ca455a315edac3/regex-2026.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:173a66f3651cdb761018078e2d9487f4cf971232c990035ec0eb1cdc6bf929a9", size = 800551, upload-time = "2026-04-03T20:55:29.532Z" }, + { url = "https://files.pythonhosted.org/packages/25/fe/5365eb7aa0e753c4b5957815c321519ecab033c279c60e1b1ae2367fa810/regex-2026.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa7922bbb2cc84fa062d37723f199d4c0cd200245ce269c05db82d904db66b83", size = 776911, upload-time = "2026-04-03T20:55:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b3/7fb0072156bba065e3b778a7bc7b0a6328212be5dd6a86fd207e0c4f2dab/regex-2026.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:59f67cd0a0acaf0e564c20bbd7f767286f23e91e2572c5703bf3e56ea7557edb", size = 785751, upload-time = "2026-04-03T20:55:33.797Z" }, + { url = "https://files.pythonhosted.org/packages/02/1a/9f83677eb699273e56e858f7bd95acdbee376d42f59e8bfca2fd80d79df3/regex-2026.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:475e50f3f73f73614f7cba5524d6de49dee269df00272a1b85e3d19f6d498465", size = 860484, upload-time = "2026-04-03T20:55:35.745Z" }, + { url = "https://files.pythonhosted.org/packages/3b/7a/93937507b61cfcff8b4c5857f1b452852b09f741daa9acae15c971d8554e/regex-2026.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:a1c0c7d67b64d85ac2e1879923bad2f08a08f3004055f2f406ef73c850114bd4", size = 765939, upload-time = "2026-04-03T20:55:37.972Z" }, + { url = "https://files.pythonhosted.org/packages/86/ea/81a7f968a351c6552b1670ead861e2a385be730ee28402233020c67f9e0f/regex-2026.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:1371c2ccbb744d66ee63631cc9ca12aa233d5749972626b68fe1a649dd98e566", size = 851417, upload-time = "2026-04-03T20:55:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/4c/7e/323c18ce4b5b8f44517a36342961a0306e931e499febbd876bb149d900f0/regex-2026.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59968142787042db793348a3f5b918cf24ced1f23247328530e063f89c128a95", size = 789056, upload-time = "2026-04-03T20:55:42.303Z" }, + { url = "https://files.pythonhosted.org/packages/c0/af/e7510f9b11b1913b0cd44eddb784b2d650b2af6515bfce4cffcc5bfd1d38/regex-2026.4.4-cp314-cp314-win32.whl", hash = "sha256:59efe72d37fd5a91e373e5146f187f921f365f4abc1249a5ab446a60f30dd5f8", size = 272130, upload-time = "2026-04-03T20:55:44.995Z" }, + { url = "https://files.pythonhosted.org/packages/9a/51/57dae534c915e2d3a21490e88836fa2ae79dde3b66255ecc0c0a155d2c10/regex-2026.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:e0aab3ff447845049d676827d2ff714aab4f73f340e155b7de7458cf53baa5a4", size = 280992, upload-time = "2026-04-03T20:55:47.316Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5e/abaf9f4c3792e34edb1434f06717fae2b07888d85cb5cec29f9204931bf8/regex-2026.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:a7a5bb6aa0cf62208bb4fa079b0c756734f8ad0e333b425732e8609bd51ee22f", size = 273563, upload-time = "2026-04-03T20:55:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/ff/06/35da85f9f217b9538b99cbb170738993bcc3b23784322decb77619f11502/regex-2026.4.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:97850d0638391bdc7d35dc1c1039974dcb921eaafa8cc935ae4d7f272b1d60b3", size = 494191, upload-time = "2026-04-03T20:55:51.258Z" }, + { url = "https://files.pythonhosted.org/packages/54/5b/1bc35f479eef8285c4baf88d8c002023efdeebb7b44a8735b36195486ae7/regex-2026.4.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ee7337f88f2a580679f7bbfe69dc86c043954f9f9c541012f49abc554a962f2e", size = 293877, upload-time = "2026-04-03T20:55:53.214Z" }, + { url = "https://files.pythonhosted.org/packages/39/5b/f53b9ad17480b3ddd14c90da04bfb55ac6894b129e5dea87bcaf7d00e336/regex-2026.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7429f4e6192c11d659900c0648ba8776243bf396ab95558b8c51a345afeddde6", size = 292410, upload-time = "2026-04-03T20:55:55.736Z" }, + { url = "https://files.pythonhosted.org/packages/bb/56/52377f59f60a7c51aa4161eecf0b6032c20b461805aca051250da435ffc9/regex-2026.4.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4f10fbd5dd13dcf4265b4cc07d69ca70280742870c97ae10093e3d66000359", size = 811831, upload-time = "2026-04-03T20:55:57.802Z" }, + { url = "https://files.pythonhosted.org/packages/dd/63/8026310bf066f702a9c361f83a8c9658f3fe4edb349f9c1e5d5273b7c40c/regex-2026.4.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a152560af4f9742b96f3827090f866eeec5becd4765c8e0d3473d9d280e76a5a", size = 871199, upload-time = "2026-04-03T20:56:00.333Z" }, + { url = "https://files.pythonhosted.org/packages/20/9f/a514bbb00a466dbb506d43f187a04047f7be1505f10a9a15615ead5080ee/regex-2026.4.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54170b3e95339f415d54651f97df3bff7434a663912f9358237941bbf9143f55", size = 917649, upload-time = "2026-04-03T20:56:02.445Z" }, + { url = "https://files.pythonhosted.org/packages/cb/6b/8399f68dd41a2030218839b9b18360d79b86d22b9fab5ef477c7f23ca67c/regex-2026.4.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:07f190d65f5a72dcb9cf7106bfc3d21e7a49dd2879eda2207b683f32165e4d99", size = 816388, upload-time = "2026-04-03T20:56:04.595Z" }, + { url = "https://files.pythonhosted.org/packages/1e/9c/103963f47c24339a483b05edd568594c2be486188f688c0170fd504b2948/regex-2026.4.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9a2741ce5a29d3c84b0b94261ba630ab459a1b847a0d6beca7d62d188175c790", size = 785746, upload-time = "2026-04-03T20:56:07.13Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ee/7f6054c0dec0cee3463c304405e4ff42e27cff05bf36fcb34be549ab17bd/regex-2026.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b26c30df3a28fd9793113dac7385a4deb7294a06c0f760dd2b008bd49a9139bc", size = 801483, upload-time = "2026-04-03T20:56:09.365Z" }, + { url = "https://files.pythonhosted.org/packages/30/c2/51d3d941cf6070dc00c3338ecf138615fc3cce0421c3df6abe97a08af61a/regex-2026.4.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:421439d1bee44b19f4583ccf42670ca464ffb90e9fdc38d37f39d1ddd1e44f1f", size = 866331, upload-time = "2026-04-03T20:56:12.039Z" }, + { url = "https://files.pythonhosted.org/packages/16/e8/76d50dcc122ac33927d939f350eebcfe3dbcbda96913e03433fc36de5e63/regex-2026.4.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b40379b53ecbc747fd9bdf4a0ea14eb8188ca1bd0f54f78893a39024b28f4863", size = 772673, upload-time = "2026-04-03T20:56:14.558Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/5f6bf75e20ea6873d05ba4ec78378c375cbe08cdec571c83fbb01606e563/regex-2026.4.4-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:08c55c13d2eef54f73eeadc33146fb0baaa49e7335eb1aff6ae1324bf0ddbe4a", size = 857146, upload-time = "2026-04-03T20:56:16.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/33/3c76d9962949e487ebba353a18e89399f292287204ac8f2f4cfc3a51c233/regex-2026.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9776b85f510062f5a75ef112afe5f494ef1635607bf1cc220c1391e9ac2f5e81", size = 803463, upload-time = "2026-04-03T20:56:18.923Z" }, + { url = "https://files.pythonhosted.org/packages/19/eb/ef32dcd2cb69b69bc0c3e55205bce94a7def48d495358946bc42186dcccc/regex-2026.4.4-cp314-cp314t-win32.whl", hash = "sha256:385edaebde5db5be103577afc8699fea73a0e36a734ba24870be7ffa61119d74", size = 275709, upload-time = "2026-04-03T20:56:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/a0/86/c291bf740945acbf35ed7dbebf8e2eea2f3f78041f6bd7cdab80cb274dc0/regex-2026.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:5d354b18839328927832e2fa5f7c95b7a3ccc39e7a681529e1685898e6436d45", size = 285622, upload-time = "2026-04-03T20:56:23.641Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e7/ec846d560ae6a597115153c02ca6138a7877a1748b2072d9521c10a93e58/regex-2026.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:af0384cb01a33600c49505c27c6c57ab0b27bf84a74e28524c92ca897ebdac9d", size = 275773, upload-time = "2026-04-03T20:56:26.07Z" }, ] [[package]] name = "requests" -version = "2.32.5" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -3020,9 +3051,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { 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" }, ] [[package]] @@ -3039,15 +3070,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.2" +version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] @@ -3166,6 +3197,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, ] +[[package]] +name = "scikit-learn" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, +] + [[package]] name = "scipy" version = "1.17.1" @@ -3276,39 +3351,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] -[[package]] -name = "sortedcontainers" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, -] - [[package]] name = "sse-starlette" -version = "3.2.0" +version = "3.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/00d280c03ffd39aaee0e86ec81e2d3b9253036a0f93f51d10503adef0e65/sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422", size = 27253, upload-time = "2026-01-17T13:11:05.62Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/9a/f35932a8c0eb6b2287b66fa65a0321df8c84e4e355a659c1841a37c39fdb/sse_starlette-3.4.1.tar.gz", hash = "sha256:f780bebcf6c8997fe514e3bd8e8c648d8284976b391c8bed0bcb1f611632b555", size = 35127, upload-time = "2026-04-26T13:32:32.292Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7f/832f015020844a8b8f7a9cbc103dd76ba8e3875004c41e08440ea3a2b41a/sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf", size = 12763, upload-time = "2026-01-17T13:11:03.775Z" }, + { url = "https://files.pythonhosted.org/packages/ff/07/45c21ed03d708c477367305726b89919b020a3a2a01f72aaf5ad941caf35/sse_starlette-3.4.1-py3-none-any.whl", hash = "sha256:6b43cf21f1d574d582a6e1b0cfbde1c94dc86a32a701a7168c99c4475c6bd1d0", size = 16487, upload-time = "2026-04-26T13:32:30.819Z" }, ] [[package]] name = "starlette" -version = "0.52.1" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933", size = 2653702, upload-time = "2026-01-18T13:34:11.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/69/17425771797c36cded50b7fe44e850315d039f28b15901ab44839e70b593/starlette-1.0.0.tar.gz", hash = "sha256:6a4beaf1f81bb472fd19ea9b918b50dc3a77a6f2e190a12954b25e6ed5eea149", size = 2655289, upload-time = "2026-03-22T18:29:46.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74", size = 74272, upload-time = "2026-01-18T13:34:09.188Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, ] [[package]] @@ -3332,6 +3398,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, ] +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + [[package]] name = "tiktoken" version = "0.12.0" @@ -3462,7 +3537,7 @@ wheels = [ [[package]] name = "transformers" -version = "5.3.0" +version = "5.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -3475,9 +3550,9 @@ dependencies = [ { name = "tqdm" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/1a/70e830d53ecc96ce69cfa8de38f163712d2b43ac52fbd743f39f56025c31/transformers-5.3.0.tar.gz", hash = "sha256:009555b364029da9e2946d41f1c5de9f15e6b1df46b189b7293f33a161b9c557", size = 8830831, upload-time = "2026-03-04T17:41:46.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/fe/7e84d20ac7d4d5d14bac2eab5976088d86342959fc2c0da54b4c2fc99856/transformers-5.7.0.tar.gz", hash = "sha256:a9d35cf39804e3456c1f9bc1a79ad5ffa878640a61f51f66f71c97f4b4e2ce10", size = 8401287, upload-time = "2026-04-28T18:30:09.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/88/ae8320064e32679a5429a2c9ebbc05c2bf32cefb6e076f9b07f6d685a9b4/transformers-5.3.0-py3-none-any.whl", hash = "sha256:50ac8c89c3c7033444fb3f9f53138096b997ebb70d4b5e50a2e810bf12d3d29a", size = 10661827, upload-time = "2026-03-04T17:41:42.722Z" }, + { url = "https://files.pythonhosted.org/packages/60/60/86a9fe3037bec221094e2acb680219ad88b77006edba42fc0407a577ca93/transformers-5.7.0-py3-none-any.whl", hash = "sha256:869660cd8fc92badc041f5551bf755a42f4b9558c93341bf3fa3eeed7065079c", size = 10474236, upload-time = "2026-04-28T18:30:05.655Z" }, ] [[package]] @@ -3499,7 +3574,7 @@ wheels = [ [[package]] name = "typer" -version = "0.24.0" +version = "0.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -3507,33 +3582,21 @@ dependencies = [ { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/b6/3e681d3b6bb22647509bdbfdd18055d5adc0dce5c5585359fa46ff805fdc/typer-0.24.0.tar.gz", hash = "sha256:f9373dc4eff901350694f519f783c29b6d7a110fc0dcc11b1d7e353b85ca6504", size = 118380, upload-time = "2026-02-16T22:08:48.496Z" } +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/85/d0/4da85c2a45054bb661993c93524138ace4956cb075a7ae0c9d1deadc331b/typer-0.24.0-py3-none-any.whl", hash = "sha256:5fc435a9c8356f6160ed6e85a6301fdd6e3d8b2851da502050d1f92c5e9eddc8", size = 56441, upload-time = "2026-02-16T22:08:47.535Z" }, -] - -[[package]] -name = "typer-slim" -version = "0.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/a7/e6aecc4b4eb59598829a3b5076a93aff291b4fdaa2ded25efc4e1f4d219c/typer_slim-0.24.0.tar.gz", hash = "sha256:f0ed36127183f52ae6ced2ecb2521789995992c521a46083bfcdbb652d22ad34", size = 4776, upload-time = "2026-02-16T22:08:51.2Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/24/5480c20380dfd18cf33d14784096dca45a24eae6102e91d49a718d3b6855/typer_slim-0.24.0-py3-none-any.whl", hash = "sha256:d5d7ee1ee2834d5020c7c616ed5e0d0f29b9a4b1dd283bdebae198ec09778d0e", size = 3394, upload-time = "2026-02-16T22:08:49.92Z" }, + { 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]] name = "types-requests" -version = "2.33.0.20260408" +version = "2.33.0.20260503" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/6a/749dc53a54a3f35842c1f8197b3ca6b54af6d7458a1bfc75f6629b6da666/types_requests-2.33.0.20260408.tar.gz", hash = "sha256:95b9a86376807a216b2fb412b47617b202091c3ea7c078f47cc358d5528ccb7b", size = 23882, upload-time = "2026-04-08T04:34:49.33Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/b8/57e94268c0d82ac3eaa2fc35aa8ca7bbc2542f726b67dcf90b0b00a3b14d/types_requests-2.33.0.20260503.tar.gz", hash = "sha256:9721b2d9dbee7131f2fb39f20f0ebb1999c18cef4b512c9a7932f3722de7c5f4", size = 23931, upload-time = "2026-05-03T05:20:08.882Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/b8/78fd6c037de4788c040fdd323b3369804400351b7827473920f6c1d03c10/types_requests-2.33.0.20260408-py3-none-any.whl", hash = "sha256:81f31d5ea4acb39f03be7bc8bed569ba6d5a9c5d97e89f45ac43d819b68ca50f", size = 20739, upload-time = "2026-04-08T04:34:48.325Z" }, + { url = "https://files.pythonhosted.org/packages/c3/82/959113a6351f3ca046cd0a8cd2cee071d7ea47473560557a01eeae9a6fe2/types_requests-2.33.0.20260503-py3-none-any.whl", hash = "sha256:02aaa7e3577a13471715bb1bddb693cc985ea514f754b503bf033e6a09a3e528", size = 20736, upload-time = "2026-05-03T05:20:07.858Z" }, ] [[package]] @@ -3559,11 +3622,20 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.3" +version = "2026.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +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/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, + { 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 = "uncalled-for" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/68/35c1d87e608940badbcfeb630347aa0509897284684f61fab6423d02b253/uncalled_for-0.3.1.tar.gz", hash = "sha256:5e412ac6708f04b56bef5867b5dcf6690ebce4eb7316058d9c50787492bb4bca", size = 49693, upload-time = "2026-04-07T13:05:06.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/e1/7ec67882ad8fc9f86384bef6421fa252c9cbe5744f8df6ce77afc9eca1f5/uncalled_for-0.3.1-py3-none-any.whl", hash = "sha256:074cdc92da8356278f93d0ded6f2a66dd883dbecaf9bc89437646ee2289cc200", size = 11361, upload-time = "2026-04-07T13:05:05.341Z" }, ] [[package]] @@ -3599,15 +3671,85 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.41.0" +version = "0.46.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a", size = 82633, upload-time = "2026-02-16T23:07:24.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187", size = 68783, upload-time = "2026-02-16T23:07:22.357Z" }, + { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, ] [[package]] @@ -3669,237 +3811,292 @@ wheels = [ [[package]] name = "wrapt" -version = "1.17.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, - { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, - { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, - { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, - { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, - { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b1/43b286ca1392a006d5336412d41663eeef1ad57485f3e52c767376ba7e5a/wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe", size = 36705, upload-time = "2025-08-12T05:53:07.123Z" }, - { url = "https://files.pythonhosted.org/packages/28/de/49493f962bd3c586ab4b88066e967aa2e0703d6ef2c43aa28cb83bf7b507/wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c", size = 38877, upload-time = "2025-08-12T05:53:05.436Z" }, - { url = "https://files.pythonhosted.org/packages/f1/48/0f7102fe9cb1e8a5a77f80d4f0956d62d97034bbe88d33e94699f99d181d/wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6", size = 36885, upload-time = "2025-08-12T05:52:54.367Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, - { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, - { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, - { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, - { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, - { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, - { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, - { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b8/da8560695e9284810b8d3df8a19396a6e40e7518059584a1a394a2b35e0a/wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10", size = 37178, upload-time = "2025-08-12T05:53:12.605Z" }, - { url = "https://files.pythonhosted.org/packages/db/c8/b71eeb192c440d67a5a0449aaee2310a1a1e8eca41676046f99ed2487e9f/wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6", size = 39310, upload-time = "2025-08-12T05:53:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/45/20/2cda20fd4865fa40f86f6c46ed37a2a8356a7a2fde0773269311f2af56c7/wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58", size = 37266, upload-time = "2025-08-12T05:52:56.531Z" }, - { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, - { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, - { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, - { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, - { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, - { url = "https://files.pythonhosted.org/packages/be/44/a1bd64b723d13bb151d6cc91b986146a1952385e0392a78567e12149c7b4/wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977", size = 38717, upload-time = "2025-08-12T05:53:15.214Z" }, - { url = "https://files.pythonhosted.org/packages/79/d9/7cfd5a312760ac4dd8bf0184a6ee9e43c33e47f3dadc303032ce012b8fa3/wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116", size = 41334, upload-time = "2025-08-12T05:53:14.178Z" }, - { url = "https://files.pythonhosted.org/packages/46/78/10ad9781128ed2f99dbc474f43283b13fea8ba58723e98844367531c18e9/wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6", size = 38471, upload-time = "2025-08-12T05:52:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/64/925f213fdcbb9baeb1530449ac71a4d57fc361c053d06bf78d0c5c7cd80c/wrapt-2.1.2.tar.gz", hash = "sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e", size = 81678, upload-time = "2026-03-06T02:53:25.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/b6/1db817582c49c7fcbb7df6809d0f515af29d7c2fbf57eb44c36e98fb1492/wrapt-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9", size = 61255, upload-time = "2026-03-06T02:52:45.663Z" }, + { url = "https://files.pythonhosted.org/packages/a2/16/9b02a6b99c09227c93cd4b73acc3678114154ec38da53043c0ddc1fba0dc/wrapt-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748", size = 61848, upload-time = "2026-03-06T02:53:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/af/aa/ead46a88f9ec3a432a4832dfedb84092fc35af2d0ba40cd04aea3889f247/wrapt-2.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e", size = 121433, upload-time = "2026-03-06T02:54:40.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9f/742c7c7cdf58b59085a1ee4b6c37b013f66ac33673a7ef4aaed5e992bc33/wrapt-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8", size = 123013, upload-time = "2026-03-06T02:53:26.58Z" }, + { url = "https://files.pythonhosted.org/packages/e8/44/2c3dd45d53236b7ed7c646fcf212251dc19e48e599debd3926b52310fafb/wrapt-2.1.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c", size = 117326, upload-time = "2026-03-06T02:53:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/b17d66abc26bd96f89dec0ecd0ef03da4a1286e6ff793839ec431b9fae57/wrapt-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c", size = 121444, upload-time = "2026-03-06T02:54:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/62/e2977843fdf9f03daf1586a0ff49060b1b2fc7ff85a7ea82b6217c1ae36e/wrapt-2.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1", size = 116237, upload-time = "2026-03-06T02:54:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/27fc67914e68d740bce512f11734aec08696e6b17641fef8867c00c949fc/wrapt-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2", size = 120563, upload-time = "2026-03-06T02:53:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9f/b750b3692ed2ef4705cb305bd68858e73010492b80e43d2a4faa5573cbe7/wrapt-2.1.2-cp312-cp312-win32.whl", hash = "sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0", size = 58198, upload-time = "2026-03-06T02:53:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b2/feecfe29f28483d888d76a48f03c4c4d8afea944dbee2b0cd3380f9df032/wrapt-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63", size = 60441, upload-time = "2026-03-06T02:52:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/44/e1/e328f605d6e208547ea9fd120804fcdec68536ac748987a68c47c606eea8/wrapt-2.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf", size = 58836, upload-time = "2026-03-06T02:53:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/4c/7a/d936840735c828b38d26a854e85d5338894cda544cb7a85a9d5b8b9c4df7/wrapt-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787fd6f4d67befa6fe2abdffcbd3de2d82dfc6fb8a6d850407c53332709d030b", size = 61259, upload-time = "2026-03-06T02:53:41.922Z" }, + { url = "https://files.pythonhosted.org/packages/5e/88/9a9b9a90ac8ca11c2fdb6a286cb3a1fc7dd774c00ed70929a6434f6bc634/wrapt-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4bdf26e03e6d0da3f0e9422fd36bcebf7bc0eeb55fdf9c727a09abc6b9fe472e", size = 61851, upload-time = "2026-03-06T02:52:48.672Z" }, + { url = "https://files.pythonhosted.org/packages/03/a9/5b7d6a16fd6533fed2756900fc8fc923f678179aea62ada6d65c92718c00/wrapt-2.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bbac24d879aa22998e87f6b3f481a5216311e7d53c7db87f189a7a0266dafffb", size = 121446, upload-time = "2026-03-06T02:54:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/45/bb/34c443690c847835cfe9f892be78c533d4f32366ad2888972c094a897e39/wrapt-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16997dfb9d67addc2e3f41b62a104341e80cac52f91110dece393923c0ebd5ca", size = 123056, upload-time = "2026-03-06T02:54:10.829Z" }, + { url = "https://files.pythonhosted.org/packages/93/b9/ff205f391cb708f67f41ea148545f2b53ff543a7ac293b30d178af4d2271/wrapt-2.1.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:162e4e2ba7542da9027821cb6e7c5e068d64f9a10b5f15512ea28e954893a267", size = 117359, upload-time = "2026-03-06T02:53:03.623Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/1ea04d7747825119c3c9a5e0874a40b33594ada92e5649347c457d982805/wrapt-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f29c827a8d9936ac320746747a016c4bc66ef639f5cd0d32df24f5eacbf9c69f", size = 121479, upload-time = "2026-03-06T02:53:45.844Z" }, + { url = "https://files.pythonhosted.org/packages/78/cc/ee3a011920c7a023b25e8df26f306b2484a531ab84ca5c96260a73de76c0/wrapt-2.1.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a9dd9813825f7ecb018c17fd147a01845eb330254dff86d3b5816f20f4d6aaf8", size = 116271, upload-time = "2026-03-06T02:54:46.356Z" }, + { url = "https://files.pythonhosted.org/packages/98/fd/e5ff7ded41b76d802cf1191288473e850d24ba2e39a6ec540f21ae3b57cb/wrapt-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f8dbdd3719e534860d6a78526aafc220e0241f981367018c2875178cf83a413", size = 120573, upload-time = "2026-03-06T02:52:50.163Z" }, + { url = "https://files.pythonhosted.org/packages/47/c5/242cae3b5b080cd09bacef0591691ba1879739050cc7c801ff35c8886b66/wrapt-2.1.2-cp313-cp313-win32.whl", hash = "sha256:5c35b5d82b16a3bc6e0a04349b606a0582bc29f573786aebe98e0c159bc48db6", size = 58205, upload-time = "2026-03-06T02:53:47.494Z" }, + { url = "https://files.pythonhosted.org/packages/12/69/c358c61e7a50f290958809b3c61ebe8b3838ea3e070d7aac9814f95a0528/wrapt-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f8bc1c264d8d1cf5b3560a87bbdd31131573eb25f9f9447bb6252b8d4c44a3a1", size = 60452, upload-time = "2026-03-06T02:53:30.038Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/c8a6fcfe321295fd8c0ab1bd685b5a01462a9b3aa2f597254462fc2bc975/wrapt-2.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:3beb22f674550d5634642c645aba4c72a2c66fb185ae1aebe1e955fae5a13baf", size = 58842, upload-time = "2026-03-06T02:52:52.114Z" }, + { url = "https://files.pythonhosted.org/packages/da/55/9c7052c349106e0b3f17ae8db4b23a691a963c334de7f9dbd60f8f74a831/wrapt-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fc04bc8664a8bc4c8e00b37b5355cffca2535209fba1abb09ae2b7c76ddf82b", size = 63075, upload-time = "2026-03-06T02:53:19.108Z" }, + { url = "https://files.pythonhosted.org/packages/09/a8/ce7b4006f7218248dd71b7b2b732d0710845a0e49213b18faef64811ffef/wrapt-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a9b9d50c9af998875a1482a038eb05755dfd6fe303a313f6a940bb53a83c3f18", size = 63719, upload-time = "2026-03-06T02:54:33.452Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e5/2ca472e80b9e2b7a17f106bb8f9df1db11e62101652ce210f66935c6af67/wrapt-2.1.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2d3ff4f0024dd224290c0eabf0240f1bfc1f26363431505fb1b0283d3b08f11d", size = 152643, upload-time = "2026-03-06T02:52:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/36/42/30f0f2cefca9d9cbf6835f544d825064570203c3e70aa873d8ae12e23791/wrapt-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3278c471f4468ad544a691b31bb856374fbdefb7fee1a152153e64019379f015", size = 158805, upload-time = "2026-03-06T02:54:25.441Z" }, + { url = "https://files.pythonhosted.org/packages/bb/67/d08672f801f604889dcf58f1a0b424fe3808860ede9e03affc1876b295af/wrapt-2.1.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8914c754d3134a3032601c6984db1c576e6abaf3fc68094bb8ab1379d75ff92", size = 145990, upload-time = "2026-03-06T02:53:57.456Z" }, + { url = "https://files.pythonhosted.org/packages/68/a7/fd371b02e73babec1de6ade596e8cd9691051058cfdadbfd62a5898f3295/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ff95d4264e55839be37bafe1536db2ab2de19da6b65f9244f01f332b5286cfbf", size = 155670, upload-time = "2026-03-06T02:54:55.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/9fe0095dfdb621009f40117dcebf41d7396c2c22dca6eac779f4c007b86c/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:76405518ca4e1b76fbb1b9f686cff93aebae03920cc55ceeec48ff9f719c5f67", size = 144357, upload-time = "2026-03-06T02:54:24.092Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/ec7b4a254abbe4cde9fa15c5d2cca4518f6b07d0f1b77d4ee9655e30280e/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c0be8b5a74c5824e9359b53e7e58bef71a729bacc82e16587db1c4ebc91f7c5a", size = 150269, upload-time = "2026-03-06T02:53:31.268Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6b/2fabe8ebf148f4ee3c782aae86a795cc68ffe7d432ef550f234025ce0cfa/wrapt-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:f01277d9a5fc1862f26f7626da9cf443bebc0abd2f303f41c5e995b15887dabd", size = 59894, upload-time = "2026-03-06T02:54:15.391Z" }, + { url = "https://files.pythonhosted.org/packages/ca/fb/9ba66fc2dedc936de5f8073c0217b5d4484e966d87723415cc8262c5d9c2/wrapt-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:84ce8f1c2104d2f6daa912b1b5b039f331febfeee74f8042ad4e04992bd95c8f", size = 63197, upload-time = "2026-03-06T02:54:41.943Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1c/012d7423c95d0e337117723eb8ecf73c622ce15a97847e84cf3f8f26cd7e/wrapt-2.1.2-cp313-cp313t-win_arm64.whl", hash = "sha256:a93cd767e37faeddbe07d8fc4212d5cba660af59bdb0f6372c93faaa13e6e679", size = 60363, upload-time = "2026-03-06T02:54:48.093Z" }, + { url = "https://files.pythonhosted.org/packages/39/25/e7ea0b417db02bb796182a5316398a75792cd9a22528783d868755e1f669/wrapt-2.1.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1370e516598854e5b4366e09ce81e08bfe94d42b0fd569b88ec46cc56d9164a9", size = 61418, upload-time = "2026-03-06T02:53:55.706Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0f/fa539e2f6a770249907757eaeb9a5ff4deb41c026f8466c1c6d799088a9b/wrapt-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6de1a3851c27e0bd6a04ca993ea6f80fc53e6c742ee1601f486c08e9f9b900a9", size = 61914, upload-time = "2026-03-06T02:52:53.37Z" }, + { url = "https://files.pythonhosted.org/packages/53/37/02af1867f5b1441aaeda9c82deed061b7cd1372572ddcd717f6df90b5e93/wrapt-2.1.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:de9f1a2bbc5ac7f6012ec24525bdd444765a2ff64b5985ac6e0692144838542e", size = 120417, upload-time = "2026-03-06T02:54:30.74Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b7/0138a6238c8ba7476c77cf786a807f871672b37f37a422970342308276e7/wrapt-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:970d57ed83fa040d8b20c52fe74a6ae7e3775ae8cff5efd6a81e06b19078484c", size = 122797, upload-time = "2026-03-06T02:54:51.539Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ad/819ae558036d6a15b7ed290d5b14e209ca795dd4da9c58e50c067d5927b0/wrapt-2.1.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3969c56e4563c375861c8df14fa55146e81ac11c8db49ea6fb7f2ba58bc1ff9a", size = 117350, upload-time = "2026-03-06T02:54:37.651Z" }, + { url = "https://files.pythonhosted.org/packages/8b/2d/afc18dc57a4600a6e594f77a9ae09db54f55ba455440a54886694a84c71b/wrapt-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:57d7c0c980abdc5f1d98b11a2aa3bb159790add80258c717fa49a99921456d90", size = 121223, upload-time = "2026-03-06T02:54:35.221Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5b/5ec189b22205697bc56eb3b62aed87a1e0423e9c8285d0781c7a83170d15/wrapt-2.1.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:776867878e83130c7a04237010463372e877c1c994d449ca6aaafeab6aab2586", size = 116287, upload-time = "2026-03-06T02:54:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2d/f84939a7c9b5e6cdd8a8d0f6a26cabf36a0f7e468b967720e8b0cd2bdf69/wrapt-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fab036efe5464ec3291411fabb80a7a39e2dd80bae9bcbeeca5087fdfa891e19", size = 119593, upload-time = "2026-03-06T02:54:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/0b/fe/ccd22a1263159c4ac811ab9374c061bcb4a702773f6e06e38de5f81a1bdc/wrapt-2.1.2-cp314-cp314-win32.whl", hash = "sha256:e6ed62c82ddf58d001096ae84ce7f833db97ae2263bff31c9b336ba8cfe3f508", size = 58631, upload-time = "2026-03-06T02:53:06.498Z" }, + { url = "https://files.pythonhosted.org/packages/65/0a/6bd83be7bff2e7efaac7b4ac9748da9d75a34634bbbbc8ad077d527146df/wrapt-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:467e7c76315390331c67073073d00662015bb730c566820c9ca9b54e4d67fd04", size = 60875, upload-time = "2026-03-06T02:53:50.252Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c0/0b3056397fe02ff80e5a5d72d627c11eb885d1ca78e71b1a5c1e8c7d45de/wrapt-2.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:da1f00a557c66225d53b095a97eace0fc5349e3bfda28fa34ffae238978ee575", size = 59164, upload-time = "2026-03-06T02:53:59.128Z" }, + { url = "https://files.pythonhosted.org/packages/71/ed/5d89c798741993b2371396eb9d4634f009ff1ad8a6c78d366fe2883ea7a6/wrapt-2.1.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:62503ffbc2d3a69891cf29beeaccdb4d5e0a126e2b6a851688d4777e01428dbb", size = 63163, upload-time = "2026-03-06T02:52:54.873Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8c/05d277d182bf36b0a13d6bd393ed1dec3468a25b59d01fba2dd70fe4d6ae/wrapt-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c7e6cd120ef837d5b6f860a6ea3745f8763805c418bb2f12eeb1fa6e25f22d22", size = 63723, upload-time = "2026-03-06T02:52:56.374Z" }, + { url = "https://files.pythonhosted.org/packages/f4/27/6c51ec1eff4413c57e72d6106bb8dec6f0c7cdba6503d78f0fa98767bcc9/wrapt-2.1.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3769a77df8e756d65fbc050333f423c01ae012b4f6731aaf70cf2bef61b34596", size = 152652, upload-time = "2026-03-06T02:53:23.79Z" }, + { url = "https://files.pythonhosted.org/packages/db/4c/d7dd662d6963fc7335bfe29d512b02b71cdfa23eeca7ab3ac74a67505deb/wrapt-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a76d61a2e851996150ba0f80582dd92a870643fa481f3b3846f229de88caf044", size = 158807, upload-time = "2026-03-06T02:53:35.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4d/1e5eea1a78d539d346765727422976676615814029522c76b87a95f6bcdd/wrapt-2.1.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6f97edc9842cf215312b75fe737ee7c8adda75a89979f8e11558dfff6343cc4b", size = 146061, upload-time = "2026-03-06T02:52:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/89/bc/62cabea7695cd12a288023251eeefdcb8465056ddaab6227cb78a2de005b/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4006c351de6d5007aa33a551f600404ba44228a89e833d2fadc5caa5de8edfbf", size = 155667, upload-time = "2026-03-06T02:53:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/e9/99/6f2888cd68588f24df3a76572c69c2de28287acb9e1972bf0c83ce97dbc1/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a9372fc3639a878c8e7d87e1556fa209091b0a66e912c611e3f833e2c4202be2", size = 144392, upload-time = "2026-03-06T02:54:22.41Z" }, + { url = "https://files.pythonhosted.org/packages/40/51/1dfc783a6c57971614c48e361a82ca3b6da9055879952587bc99fe1a7171/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3144b027ff30cbd2fca07c0a87e67011adb717eb5f5bd8496325c17e454257a3", size = 150296, upload-time = "2026-03-06T02:54:07.848Z" }, + { url = "https://files.pythonhosted.org/packages/6c/38/cbb8b933a0201076c1f64fc42883b0023002bdc14a4964219154e6ff3350/wrapt-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:3b8d15e52e195813efe5db8cec156eebe339aaf84222f4f4f051a6c01f237ed7", size = 60539, upload-time = "2026-03-06T02:54:00.594Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/e5176e4b241c9f528402cebb238a36785a628179d7d8b71091154b3e4c9e/wrapt-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:08ffa54146a7559f5b8df4b289b46d963a8e74ed16ba3687f99896101a3990c5", size = 63969, upload-time = "2026-03-06T02:54:39Z" }, + { url = "https://files.pythonhosted.org/packages/5c/99/79f17046cf67e4a95b9987ea129632ba8bcec0bc81f3fb3d19bdb0bd60cd/wrapt-2.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:72aaa9d0d8e4ed0e2e98019cea47a21f823c9dd4b43c7b77bba6679ffcca6a00", size = 60554, upload-time = "2026-03-06T02:53:14.132Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/8528ac2dfa2c1e6708f647df7ae144ead13f0a31146f43c7264b4942bf12/wrapt-2.1.2-py3-none-any.whl", hash = "sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8", size = 43993, upload-time = "2026-03-06T02:53:12.905Z" }, ] [[package]] name = "xxhash" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, - { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, - { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, - { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, - { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, - { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, - { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, - { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, - { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, - { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, - { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, - { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, - { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738, upload-time = "2025-10-02T14:34:55.839Z" }, - { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821, upload-time = "2025-10-02T14:34:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127, upload-time = "2025-10-02T14:34:59.21Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975, upload-time = "2025-10-02T14:35:00.816Z" }, - { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241, upload-time = "2025-10-02T14:35:02.207Z" }, - { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471, upload-time = "2025-10-02T14:35:03.61Z" }, - { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936, upload-time = "2025-10-02T14:35:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440, upload-time = "2025-10-02T14:35:06.239Z" }, - { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990, upload-time = "2025-10-02T14:35:07.735Z" }, - { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689, upload-time = "2025-10-02T14:35:09.438Z" }, - { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068, upload-time = "2025-10-02T14:35:11.162Z" }, - { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495, upload-time = "2025-10-02T14:35:12.971Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620, upload-time = "2025-10-02T14:35:14.129Z" }, - { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542, upload-time = "2025-10-02T14:35:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880, upload-time = "2025-10-02T14:35:16.315Z" }, - { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956, upload-time = "2025-10-02T14:35:17.413Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072, upload-time = "2025-10-02T14:35:18.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409, upload-time = "2025-10-02T14:35:20.31Z" }, - { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736, upload-time = "2025-10-02T14:35:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833, upload-time = "2025-10-02T14:35:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348, upload-time = "2025-10-02T14:35:25.111Z" }, - { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070, upload-time = "2025-10-02T14:35:26.586Z" }, - { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907, upload-time = "2025-10-02T14:35:28.087Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839, upload-time = "2025-10-02T14:35:29.857Z" }, - { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304, upload-time = "2025-10-02T14:35:31.222Z" }, - { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930, upload-time = "2025-10-02T14:35:32.517Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787, upload-time = "2025-10-02T14:35:33.827Z" }, - { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916, upload-time = "2025-10-02T14:35:35.107Z" }, - { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799, upload-time = "2025-10-02T14:35:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044, upload-time = "2025-10-02T14:35:37.195Z" }, - { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754, upload-time = "2025-10-02T14:35:38.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846, upload-time = "2025-10-02T14:35:39.6Z" }, - { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343, upload-time = "2025-10-02T14:35:40.69Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074, upload-time = "2025-10-02T14:35:42.29Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388, upload-time = "2025-10-02T14:35:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614, upload-time = "2025-10-02T14:35:45.216Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024, upload-time = "2025-10-02T14:35:46.959Z" }, - { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541, upload-time = "2025-10-02T14:35:48.301Z" }, - { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305, upload-time = "2025-10-02T14:35:49.584Z" }, - { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848, upload-time = "2025-10-02T14:35:50.877Z" }, - { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142, upload-time = "2025-10-02T14:35:52.15Z" }, - { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547, upload-time = "2025-10-02T14:35:53.547Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214, upload-time = "2025-10-02T14:35:54.746Z" }, - { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290, upload-time = "2025-10-02T14:35:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795, upload-time = "2025-10-02T14:35:57.162Z" }, - { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955, upload-time = "2025-10-02T14:35:58.267Z" }, - { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072, upload-time = "2025-10-02T14:35:59.382Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579, upload-time = "2025-10-02T14:36:00.838Z" }, - { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854, upload-time = "2025-10-02T14:36:02.207Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965, upload-time = "2025-10-02T14:36:03.507Z" }, - { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484, upload-time = "2025-10-02T14:36:04.828Z" }, - { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162, upload-time = "2025-10-02T14:36:06.182Z" }, - { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007, upload-time = "2025-10-02T14:36:07.733Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956, upload-time = "2025-10-02T14:36:09.106Z" }, - { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401, upload-time = "2025-10-02T14:36:10.585Z" }, - { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083, upload-time = "2025-10-02T14:36:12.276Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913, upload-time = "2025-10-02T14:36:14.025Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586, upload-time = "2025-10-02T14:36:15.603Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526, upload-time = "2025-10-02T14:36:16.708Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898, upload-time = "2025-10-02T14:36:17.843Z" }, +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/2f/e183a1b407002f5af81822bee18b61cdb94b8670208ef34734d8d2b8ebe9/xxhash-3.7.0.tar.gz", hash = "sha256:6cc4eefbb542a5d6ffd6d70ea9c502957c925e800f998c5630ecc809d6702bae", size = 82022, upload-time = "2026-04-25T11:10:32.553Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/8a/51a14cdef4728c6c2337db8a7d8704422cc65676d9199d77215464c880af/xxhash-3.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:082c87bfdd2b9f457606c7a4a53457f4c4b48b0cdc48de0277f4349d79bb3d7a", size = 33357, upload-time = "2026-04-25T11:06:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/b9/1b/0c2c933809421ffd9bf42b59315552c143c755db5d9a816b2f1ae273e884/xxhash-3.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5e7ce913b61f35b0c1c839a49ac9c8e75dd8d860150688aed353b0ce1bf409d8", size = 30869, upload-time = "2026-04-25T11:06:21.989Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/89d5fdd6ee12d70ba99451de46dd0e8010167468dcd913ec855653f4dd50/xxhash-3.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3beb1de3b1e9694fcdd853e570ee64c631c7062435d2f8c69c1adf809bc086f0", size = 194100, upload-time = "2026-04-25T11:06:23.586Z" }, + { url = "https://files.pythonhosted.org/packages/87/ee/2f9f2ed993e77206d1e66991290a1ebe22e843351ca3ebec8e49e01ba186/xxhash-3.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3e7b689c3bce16699efcf736066f5c6cc4472c3840fe4b22bd8279daf4abdac", size = 212977, upload-time = "2026-04-25T11:06:25.019Z" }, + { url = "https://files.pythonhosted.org/packages/de/60/5a91644615a9e9d4e42c2e9925f1908e3a24e4e691d9de7340d565bea024/xxhash-3.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a6545e6b409e3d5cbafc850fb84c55a1ca26ed15a6b11e3bf07a0e0cd84517c8", size = 236373, upload-time = "2026-04-25T11:06:26.482Z" }, + { url = "https://files.pythonhosted.org/packages/22/c0/f3a9384eaaed9d14d4d062a5d953aa0da489bfe9747877aa994caa87cd0b/xxhash-3.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:31ab1461c77a11461d703c88eb949e132a1c6515933cf675d97ec680f4bd18de", size = 212229, upload-time = "2026-04-25T11:06:28.065Z" }, + { url = "https://files.pythonhosted.org/packages/2e/67/02f07a9fd79726804190f2172c4894c3ed9a4ebccaca05653c84beb58025/xxhash-3.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c4d596b7676f811172687ec567cbafb9e4dea2f9be1bbb4f622410cb7f40f40", size = 445462, upload-time = "2026-04-25T11:06:30.048Z" }, + { url = "https://files.pythonhosted.org/packages/40/37/558f5a90c0672fc9b4402dc25d87ac5b7406616e8969430c9ca4e52ee74d/xxhash-3.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13805f0461cba0a857924e70ff91ae6d52d2598f79a884e788db80532614a4a1", size = 193932, upload-time = "2026-04-25T11:06:31.857Z" }, + { url = "https://files.pythonhosted.org/packages/d5/90/aaa09cd58661d32044dbbad7df55bbe22a623032b810e7ed3b8c569a2a6f/xxhash-3.7.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d398f372496152f1c6933a33566373f8d1b37b98b8c9d608fa6edc0976f23b2", size = 284807, upload-time = "2026-04-25T11:06:33.697Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f3/53df3719ab127a02c174f0c1c74924fcd110866e89c966bc7909cfa8fa84/xxhash-3.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d610aa62cdb7d4d497740741772a24a794903bf3e79eaa51d2e800082abe11e5", size = 210445, upload-time = "2026-04-25T11:06:35.488Z" }, + { url = "https://files.pythonhosted.org/packages/72/33/d219975c0e8b6fa2eb9ccd486fe47e21bf1847985b878dd2fbc3126e0d5c/xxhash-3.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:073c23900a9fbf3d26616c17c830db28af9803677cd5b33aea3224d824111514", size = 241273, upload-time = "2026-04-25T11:06:37.24Z" }, + { url = "https://files.pythonhosted.org/packages/3e/50/49b1afe610eb3964cedcb90a4d4c3d46a261ee8669cbd4f060652619ae3c/xxhash-3.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:418a463c3e6a590c0cdc890f8be19adb44a8c8acd175ca5b2a6de77e61d0b386", size = 197950, upload-time = "2026-04-25T11:06:39.148Z" }, + { url = "https://files.pythonhosted.org/packages/c6/75/5f42a1a4c78717d906a4b6a140c6dbf837ab1f547a54d23c4e2903310936/xxhash-3.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:03f8ff4474ee61c845758ce00711d7087a770d77efb36f7e74a6e867301000b8", size = 210709, upload-time = "2026-04-25T11:06:40.958Z" }, + { url = "https://files.pythonhosted.org/packages/8a/85/237e446c25abced71e9c53d269f2cef5bab8a82b3f88a12e00c5368e7368/xxhash-3.7.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:44fba4a5f1d179b7ddc7b3dc40f56f9209046421679b57025d4d8821b376fd8d", size = 275345, upload-time = "2026-04-25T11:06:42.525Z" }, + { url = "https://files.pythonhosted.org/packages/62/34/c2c26c0a6a9cc739bc2a5f0ae03ba8b87deb12b8bce35f7ac495e790dc6d/xxhash-3.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31e3516a0f829d06ded4a2c0f3c7c5561993256bfa1c493975fb9dc7bfa828a1", size = 414056, upload-time = "2026-04-25T11:06:44.343Z" }, + { url = "https://files.pythonhosted.org/packages/a0/aa/5c58e9bc8071b8afd8dcf297ff362f723c4892168faba149f19904132bf4/xxhash-3.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b59ee2ac81de57771a09ecad09191e840a1d2fae1ef684208320591055768f83", size = 191485, upload-time = "2026-04-25T11:06:46.262Z" }, + { url = "https://files.pythonhosted.org/packages/d4/69/a929cf9d1e2e65a48b818cdce72cb6b69eab2e6877f21436d0a1942aff43/xxhash-3.7.0-cp312-cp312-win32.whl", hash = "sha256:74bbd92f8c7fcc397ba0a11bfdc106bc72ad7f11e3a60277753f87e7532b4d81", size = 30671, upload-time = "2026-04-25T11:06:48.039Z" }, + { url = "https://files.pythonhosted.org/packages/b9/1b/104b41a8947f4e1d4a66ce1e628eea752f37d1890bfd7453559ca7a3d950/xxhash-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:7bd7bc82dd4f185f28f35193c2e968ef46131628e3cac62f639dadf321cba4d1", size = 31514, upload-time = "2026-04-25T11:06:49.279Z" }, + { url = "https://files.pythonhosted.org/packages/98/a0/1fd0ea1f1b886d9e7c73f0397571e22333a7d79e31da6d7127c2a4a71d75/xxhash-3.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:7d7148180ec99ba36585b42c8c5de25e9b40191613bc4be68909b4d25a77a852", size = 27761, upload-time = "2026-04-25T11:06:50.448Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ca/d5174b4c36d10f64d4ca7050563138c5a599efb01a765858ddefc9c1202a/xxhash-3.7.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:4b6d6b33f141158692bd4eafbb96edbc5aa0dabdb593a962db01a91983d4f8fa", size = 36813, upload-time = "2026-04-25T11:06:51.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/d0/abc6c9d347ba1f1e1e1d98125d0881a0452c7f9a76a9dd03a7b5d2197f23/xxhash-3.7.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:845d347df254d6c619f616afa921331bada8614b8d373d58725c663ba97c3605", size = 35121, upload-time = "2026-04-25T11:06:53.048Z" }, + { url = "https://files.pythonhosted.org/packages/bf/11/4cc834eb3d79f2f2b3a6ef7324195208bcdfbdcf7534d2b17267aa5f3a8f/xxhash-3.7.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:fddbbb69a6fff4f421e7a0d1fa28f894b20112e9e3fab306af451e2dfd0e459b", size = 29624, upload-time = "2026-04-25T11:06:54.311Z" }, + { url = "https://files.pythonhosted.org/packages/23/83/e97d3e7b635fe73a1dfb1e91f805324dd6d930bb42041cbf18f183bc0b6d/xxhash-3.7.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:54876a4e45101cec2bf8f31a973cda073a23e2e108538dad224ba07f85f22487", size = 30638, upload-time = "2026-04-25T11:06:55.864Z" }, + { url = "https://files.pythonhosted.org/packages/f4/40/d84951d80c35db1f4c40a29a64a8520eea5d56e764c603906b4fe763580f/xxhash-3.7.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:0c72fe9c7e3d6dfd7f1e21e224a877917fa09c465694ba4e06464b9511b65544", size = 33323, upload-time = "2026-04-25T11:06:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/c7dc6558d97e9ab023f663d69ab28b340ed9bf4d2d94f2c259cf896bb354/xxhash-3.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a6d73a830b17ef49bc04e00182bd839164c1b3c59c127cd7c54fcb10c7ed8ee8", size = 33362, upload-time = "2026-04-25T11:06:58.656Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6e/46b84017b1301d54091430353d4ad5901654a3e0871649877a416f7f1644/xxhash-3.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:91c3b07cf3362086d8f126c6aecd8e5e9396ad8b2f2219ea7e49a8250c318acd", size = 30874, upload-time = "2026-04-25T11:06:59.834Z" }, + { url = "https://files.pythonhosted.org/packages/df/5e/8f9158e3ab906ad3fec51e09b5ea0093e769f12207bfa42a368ca204e7ab/xxhash-3.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:50e879ebbac351c81565ca108db766d7832f5b8b6a5b14b8c0151f7190028e3d", size = 194185, upload-time = "2026-04-25T11:07:01.658Z" }, + { url = "https://files.pythonhosted.org/packages/f3/29/a804ded9f5d3d3758292678d23e7528b08fda7b7e750688d08b052322475/xxhash-3.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:921c14e93817842dd0dd9f372890a0f0c72e534650b6ab13c5be5cd0db11d47e", size = 213033, upload-time = "2026-04-25T11:07:03.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/91/1ce5a7d2fdc975267320e2c78fc1cecfe7ab735ccbcf6993ec5dd541cb2c/xxhash-3.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e64a7c9d7dfca3e0fafcbc5e455519090706a3e36e95d655cec3e04e79f95aaa", size = 236140, upload-time = "2026-04-25T11:07:05.396Z" }, + { url = "https://files.pythonhosted.org/packages/34/04/fd595a4fd8617b05fa27bd9b684ecb4985bfed27917848eea85d54036d06/xxhash-3.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2220af08163baf5fa36c2b8af079dc2cbe6e66ae061385267f9472362dfd53c6", size = 212291, upload-time = "2026-04-25T11:07:06.966Z" }, + { url = "https://files.pythonhosted.org/packages/03/fb/f1a379cbc372ae5b9f4ab36154c48a849ca6ebe3ac477067a57865bf3bc6/xxhash-3.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f14bb8b22a4a91325813e3d553b8963c10cf8c756cff65ee50c194431296c655", size = 445532, upload-time = "2026-04-25T11:07:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/65/59/172424b79f8cfd4b6d8a122b2193e6b8ad4b11f7159bb3b6f9b3191329bb/xxhash-3.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:496736f86a9bedaf64b0dc70e3539d0766df01c71ea22032698e88f3f04a1ce9", size = 193990, upload-time = "2026-04-25T11:07:10.315Z" }, + { url = "https://files.pythonhosted.org/packages/b9/19/aeac22161d953f139f07ba5586cb4a17c5b7b6dff985122803bb12933500/xxhash-3.7.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0ff71596bd79816975b3de7130ab1ff4541410285a3c084584eeb1c8239996fd", size = 284876, upload-time = "2026-04-25T11:07:12.15Z" }, + { url = "https://files.pythonhosted.org/packages/77/d5/4fd0b59e7a02242953da05ff679fbb961b0a4368eac97a217e11dae110c1/xxhash-3.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1ad86695c19b1d46fe106925db3c7a37f16be37669dcf58dcc70a9dd6e324676", size = 210495, upload-time = "2026-04-25T11:07:13.952Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fb/976a3165c728c7faf74aa1b5ab3cf6a85e6d731612894741840524c7d28c/xxhash-3.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:970f9f8c50961d639cbd0d988c96f80ddf66006de93641719282c4fe7a87c5e6", size = 241331, upload-time = "2026-04-25T11:07:15.557Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2c/6763d5901d53ac9e6ba296e5717ae599025c9d268396e8faa8b4b0a8e0ac/xxhash-3.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5886ad85e9e347911783760a1d16cb6b393e8f9e3b52c982568226cb56927bdc", size = 198037, upload-time = "2026-04-25T11:07:17.563Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/876e722d533833f5f9a83473e6ba993e48745701096944e77bbecf29b2c3/xxhash-3.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e934bbae1e0ec74e27d5f0d7f37ef547ce5ff9f0a7e63fb39e559fc99526734", size = 210744, upload-time = "2026-04-25T11:07:19.055Z" }, + { url = "https://files.pythonhosted.org/packages/21/e6/d7e7baef7ce24166b4668d3c48557bb35a23b92ecadcac7e7718d099ab69/xxhash-3.7.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:3b6b3d28228af044ebcded71c4a3dd86e1dbd7e2f4645bf40f7b5da65bb5fb5a", size = 275406, upload-time = "2026-04-25T11:07:20.908Z" }, + { url = "https://files.pythonhosted.org/packages/92/fe/198b3763b2e01ca908f2154969a2352ec99bda892b574a11a9a151c5ede4/xxhash-3.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:6be4d70d9ab76c9f324ead9c01af6ff52c324745ea0c3731682a0cf99720f1fe", size = 414125, upload-time = "2026-04-25T11:07:23.037Z" }, + { url = "https://files.pythonhosted.org/packages/3a/6d/019a11affd5a5499137cacca53808659964785439855b5aa40dfd3412916/xxhash-3.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:151d7520838d4465461a0b7f4ae488b3b00de16183dd3214c1a6b14bf89d7fb6", size = 191555, upload-time = "2026-04-25T11:07:24.991Z" }, + { url = "https://files.pythonhosted.org/packages/76/21/b96d58568df2d01533244c3e0e5cbdd0c8b2b25c4bec4d72f19259a292d7/xxhash-3.7.0-cp313-cp313-win32.whl", hash = "sha256:d798c1e291bffb8e37b5bbe0dda77fc767cd19e89cadaf66e6ed5d0ff88c9fe6", size = 30668, upload-time = "2026-04-25T11:07:26.665Z" }, + { url = "https://files.pythonhosted.org/packages/99/57/d849a8d3afa1f8f4bc6a831cd89f49f9706fbbad94d2975d6140a171988c/xxhash-3.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:875811ba23c543b1a1c3143c926e43996eb27ebb8f52d3500744aa608c275aed", size = 31524, upload-time = "2026-04-25T11:07:27.92Z" }, + { url = "https://files.pythonhosted.org/packages/81/52/bacc753e92dee78b058af8dcef0a50815f5f860986c664a92d75f965b6a5/xxhash-3.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:54a675cb300dda83d71daae2a599389d22db8021a0f8db0dd659e14626eb3ecc", size = 27768, upload-time = "2026-04-25T11:07:29.113Z" }, + { url = "https://files.pythonhosted.org/packages/1c/47/ddbd683b7fc7e592c1a8d9d65f73ce9ab513f082b3967eee2baf549b8fc6/xxhash-3.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a3b19a42111c4057c1547a4a1396a53961dca576a0f6b82bfa88a2d1561764b2", size = 33576, upload-time = "2026-04-25T11:07:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/07/f2/36d3310161db7f72efb4562aadde0ed429f1d0531782dd6345b12d2da527/xxhash-3.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8f4608a06e4d61b7a3425665a46d00e0579122e1a2fae97a0c52953a3aad9aa3", size = 31123, upload-time = "2026-04-25T11:07:31.989Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3f/75937a5c69556ed213021e43cbedd84c8e0279d0d74e7d41a255d84ba4b1/xxhash-3.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ad37c7792479e49cf96c1ab25517d7003fe0d93687a772ba19a097d235bbe41e", size = 196491, upload-time = "2026-04-25T11:07:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/f10d7ff8c7a733d4403a43b9de18c8fabc005f98cec054644f04418659ee/xxhash-3.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc026e3b89d98e30a8288c95cb696e77d150b3f0fb7a51f73dcd49ee6b5577fa", size = 215793, upload-time = "2026-04-25T11:07:34.919Z" }, + { url = "https://files.pythonhosted.org/packages/8b/fd/778f60aa295f58907938f030a8b514611f391405614a525cccd2ffc00eb5/xxhash-3.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c9b31ab1f28b078a6a1ac1a54eb35e7d5390deddd56870d0be3a0a733d1c321c", size = 237993, upload-time = "2026-04-25T11:07:36.638Z" }, + { url = "https://files.pythonhosted.org/packages/70/f5/736db5de387b4a540e37a05b84b40dc58a1ce974bfd2b4e5754ce29b68c3/xxhash-3.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3bb5fd680c038fd5229e44e9c493782f90df9bef632fd0499d442374688ff70b", size = 214887, upload-time = "2026-04-25T11:07:38.564Z" }, + { url = "https://files.pythonhosted.org/packages/4d/aa/09a095f22fdb9a27fbb716841fbff52119721f9ca4261952d07a912f7839/xxhash-3.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:030c0fd688fce3569fbb49a2feefd4110cbb0b650186fb4610759ecfac677548", size = 448407, upload-time = "2026-04-25T11:07:40.552Z" }, + { url = "https://files.pythonhosted.org/packages/74/8a/b745efeeca9e34a91c26fdc97ad8514c43d5a81ac78565cba80a1353870a/xxhash-3.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b1bde10324f4c31812ae0d0502e92d916ae8917cad7209353f122b8b8f610c3", size = 196119, upload-time = "2026-04-25T11:07:42.101Z" }, + { url = "https://files.pythonhosted.org/packages/8a/5c/0cfceb024af90c191f665c7933b1f318ee234f4797858383bebd1881d52f/xxhash-3.7.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:503722d52a615f2604f5e7611de7d43878df010dc0053094ef91cb9a9ac3d987", size = 286751, upload-time = "2026-04-25T11:07:43.568Z" }, + { url = "https://files.pythonhosted.org/packages/0b/0a/0793e405dc3cf8f4ebe2c1acec1e4e4608cd9e7e50ea691dabbc2a95ccbb/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c72500a3b6d6c30ebfc135035bcace9eb5884f2dc220804efcaaba43e9f611dd", size = 212961, upload-time = "2026-04-25T11:07:45.388Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7e/721118ffc63bfff94aa565bcf2555a820f9f4bdb0f001e0d609bdfad70de/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:43475925a766d01ca8cd9a857fd87f3d50406983c8506a4c07c4df12adcc867f", size = 243703, upload-time = "2026-04-25T11:07:47.053Z" }, + { url = "https://files.pythonhosted.org/packages/6e/18/16f6267160488b8276fd3d449d425712512add292ba545c1b6946bfdb7dd/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8d09dfd2ab135b985daf868b594315ebe11ad86cd9fea46e6c69f19b28f7d25a", size = 200894, upload-time = "2026-04-25T11:07:48.657Z" }, + { url = "https://files.pythonhosted.org/packages/2d/94/80ba841287fd97e3e9cac1d228788c8ef623746f570404961eec748ecb5c/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c50269d0055ac1faecfd559886d2cbe4b730de236585aba0e873f9d9dadbe585", size = 213357, upload-time = "2026-04-25T11:07:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7e/106d4067130c59f1e18a55ffadcd876d8c68534883a1e02685b29d3d8153/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1910df4756a5ab58cfad8744fc2d0f23926e3efcc346ee76e87b974abab922f4", size = 277600, upload-time = "2026-04-25T11:07:51.745Z" }, + { url = "https://files.pythonhosted.org/packages/c5/86/a081dd30da71d720b2612a792bfd55e45fa9a07ac76a0507f60487473c25/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d006faf3b491957efcb433489be3c149efe4787b7063d5cddb8ddaefdc60e0c1", size = 416980, upload-time = "2026-04-25T11:07:53.504Z" }, + { url = "https://files.pythonhosted.org/packages/35/29/1a95221a029a3c1293773869e1ab47b07cbbdd82444a42809e8c60156626/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:abb65b4e947e958f7b3b0d71db3ce447d1bc5f37f5eab871ce7223bda8768a04", size = 193840, upload-time = "2026-04-25T11:07:55.103Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/db909dd0823285de2286f67e10ee4d81e96ad35d7d8e964ecb07fccd8af9/xxhash-3.7.0-cp313-cp313t-win32.whl", hash = "sha256:178959906cb1716a1ce08e0d69c82886c70a15a6f2790fc084fdd146ca30cd49", size = 30966, upload-time = "2026-04-25T11:07:56.524Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ff/d705b15b22f21ee106adce239cb65d35067a158c630b240270f09b17c2e6/xxhash-3.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2524a1e20d4c231d13b50f7cf39e44265b055669a64a7a4b9a2a44faa03f19b6", size = 31784, upload-time = "2026-04-25T11:07:57.758Z" }, + { url = "https://files.pythonhosted.org/packages/a2/1f/b2cf83c3638fd0588e0b17f22e5a9400bdfb1a3e3755324ac0aee2250b88/xxhash-3.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:37d994d0ffe81ef087bb330d392caa809bb5853c77e22ea3f71db024a0543dba", size = 27932, upload-time = "2026-04-25T11:07:59.109Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cc/431db584f6fbb9312e40a173af027644e5580d39df1f73603cbb9dca4d6b/xxhash-3.7.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:8c5fcfd806c335bfa2adf1cd0b3110a44fc7b6995c3a648c27489bae85801465", size = 36644, upload-time = "2026-04-25T11:08:00.658Z" }, + { url = "https://files.pythonhosted.org/packages/bc/01/255ec513e0a705d1f9a61413e78dfce4e3235203f0ed525a24c2b4b56345/xxhash-3.7.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:506a0b488f190f0a06769575e30caf71615c898ed93ab18b0dbcb6dec5c3713c", size = 35003, upload-time = "2026-04-25T11:08:02.338Z" }, + { url = "https://files.pythonhosted.org/packages/68/70/c55fc33c93445b44d8fc5a17b41ed99e3cebe92bcf8396809e63fc9a1165/xxhash-3.7.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:ec68dbba21532c0173a9872298e65c89749f7c9d21538c3a78b5bb6105871568", size = 29655, upload-time = "2026-04-25T11:08:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/c2/72/ff8de73df000d74467d12a59ce6d6e2b2a368b978d41ab7b1fba5ed442be/xxhash-3.7.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:fa77e7ec1450d415d20129961814787c9abd9a07f98872f070b1fe96c5084611", size = 30664, upload-time = "2026-04-25T11:08:05.011Z" }, + { url = "https://files.pythonhosted.org/packages/b6/91/08416d9bd9bc3bf39d831abe8a5631ac2db5141dfd6fe81c3fe59a1f9264/xxhash-3.7.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:fe32736295ea38e43e7d9424053c8c47c9f64fecfc7c895fb3da9b30b131c9ee", size = 33317, upload-time = "2026-04-25T11:08:06.413Z" }, + { url = "https://files.pythonhosted.org/packages/0e/3b/86b1caa4dee10a99f4bf9521e623359341c5e50d05158fa10c275b2bd079/xxhash-3.7.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ab9dd2c83c4bbd63e422181a76f13502d049d3ddcac9a1bdc29196263d692bb8", size = 33457, upload-time = "2026-04-25T11:08:08.099Z" }, + { url = "https://files.pythonhosted.org/packages/ed/38/98ea14ad1517e1461292a65906951458d520689782bfbae111050145bdba/xxhash-3.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3afec3a336a2286601a437cb07562ab0227685e6fbb9ec17e8c18457ff348ecf", size = 30894, upload-time = "2026-04-25T11:08:09.429Z" }, + { url = "https://files.pythonhosted.org/packages/61/a2/074654d0b893606541199993c7db70067d9fc63b748e0d60020a52a1bd36/xxhash-3.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:565df64437a9390f84465dcca33e7377114c7ede8d05cd2cf20081f831ea788e", size = 194409, upload-time = "2026-04-25T11:08:10.91Z" }, + { url = "https://files.pythonhosted.org/packages/e2/26/6d2a1afc468189f77ca28c32e1c83e1b9da1178231e05641dbc1b350e332/xxhash-3.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12eca820a5d558633d423bf8bb78ce72a55394823f64089247f788a7e0ae691e", size = 213135, upload-time = "2026-04-25T11:08:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0e/d8aecf95e09c42547453137be74d2f7b8b14e08f5177fa2fab6144a19061/xxhash-3.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f262b8f7599516567e070abf607b9af649052b2c4bd6f9be02b0cb41b7024805", size = 236379, upload-time = "2026-04-25T11:08:14.206Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/8140e8210536b3dd0cc816c4faaeb5ba6e63e8125ab25af4bcddd6a037b3/xxhash-3.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1598916cb197681e03e601901e4ab96a9a963de398c59d0964f8a6f44a2b361", size = 212447, upload-time = "2026-04-25T11:08:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/462001d2903b4bee5a5689598a0a55e5e7cd1ac7f4247a5545cff10d3ebb/xxhash-3.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:322b2f0622230f526aeb1738149948a7ae357a9e2ceb1383c6fd1fdaecdafa16", size = 445660, upload-time = "2026-04-25T11:08:17.441Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/2bd1ed7f8689b20e51727952cac8329d50c694dc32b2eba06ba5bc742b37/xxhash-3.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cc22070880cc57b830a65cde4e65fa884c6d9b28ae4803b5ee05911e7bafba", size = 194076, upload-time = "2026-04-25T11:08:19.134Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6e/692302cd0a5f4ac4e6289f37fa888dc2e1e07750b68fe3e4bfe939b8cea3/xxhash-3.7.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb5a888a968b2434abf9ecda357b5d43f10d7b5a6da6fdbbe036208473aff0e2", size = 284990, upload-time = "2026-04-25T11:08:20.618Z" }, + { url = "https://files.pythonhosted.org/packages/05/d9/e54b159b3d9df7999d2a7c676ce7b323d1b5588a64f8f51ed8172567bd87/xxhash-3.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a999771ff97bec27d18341be4f3a36b163bb1ac41ec17bef6d2dabd84acd33c7", size = 210590, upload-time = "2026-04-25T11:08:22.24Z" }, + { url = "https://files.pythonhosted.org/packages/50/93/0e0df1a3a196ced4ca71de76d65ead25d8e87bbfb87b64306ea47a40c00d/xxhash-3.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ed4a6efe2dee1655adb73e7ad40c6aa955a6892422b1e3b95de6a34de56e3cbb", size = 241442, upload-time = "2026-04-25T11:08:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a9/d917a7a814e90b218f8a0d37967105eea91bf752c3303683c99a1f7bfc1f/xxhash-3.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9fd17f14ac0faa12126c2f9ca774a8cf342957265ec3c8669c144e5e6cdb478c", size = 198356, upload-time = "2026-04-25T11:08:25.99Z" }, + { url = "https://files.pythonhosted.org/packages/89/5e/f2ba1877c39469abbefc72991d6ebdcbd4c0880db01ae8cb1f553b0c537d/xxhash-3.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:05fd1254268c59b5cb2a029dfc204275e9fc52de2913f1e53aa8d01442c96b4d", size = 210898, upload-time = "2026-04-25T11:08:27.608Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/be56b58e73de531f39a10de1355bb77ceb663900dc4bf2d6d3002a9c3f9e/xxhash-3.7.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:a2eae53197c6276d5b317f75a1be226bbf440c20b58bf525f36b5d0e1f657ca6", size = 275519, upload-time = "2026-04-25T11:08:29.301Z" }, + { url = "https://files.pythonhosted.org/packages/92/e2/17ddc85d5765b9c709f192009ed8f5a1fc876f4eb35bba7c307b5b1169f9/xxhash-3.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:bfe6f92e3522dcbe8c4281efd74fa7542a336cb00b0e3272c4ec0edabeaeaf67", size = 414191, upload-time = "2026-04-25T11:08:31.16Z" }, + { url = "https://files.pythonhosted.org/packages/9c/42/85f5b79f4bf1ec7ba052491164adfd4f4e9519f5dc7246de4fbd64a1bd56/xxhash-3.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7ab9a49c410d8c6c786ab99e79c529938d894c01433130353dd0fe999111077a", size = 191604, upload-time = "2026-04-25T11:08:32.862Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/6127b623aa4cca18d8b7743592b048d689fd6c6e37ff26a22cddf6cd9d7f/xxhash-3.7.0-cp314-cp314-win32.whl", hash = "sha256:040ea63668f9185b92bc74942df09c7e65703deed71431333678fc6e739a9955", size = 31271, upload-time = "2026-04-25T11:08:34.651Z" }, + { url = "https://files.pythonhosted.org/packages/64/4f/44fc4788568004c43921701cbc127f48218a1eede2c9aea231115323564d/xxhash-3.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2a61e2a3fb23c892496d587b470dee7fa1b58b248a187719c65ea8e94ec13257", size = 32284, upload-time = "2026-04-25T11:08:35.987Z" }, + { url = "https://files.pythonhosted.org/packages/6d/77/18bb895eb60a49453d16e17d67990e5caff557c78eafc90ad4e2eabf4570/xxhash-3.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:c7741c7524961d8c0cb4d4c21b28957ff731a3fd5b5cd8b856dc80a40e9e5acc", size = 28701, upload-time = "2026-04-25T11:08:37.767Z" }, + { url = "https://files.pythonhosted.org/packages/45/a0/46f72244570c550fbbb7db1ef554183dd5ebe9136385f30e032b781ae8f6/xxhash-3.7.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:fc84bf7aa7592f31ec63a3e7b11d624f468a3f19f5238cec7282a42e838ab1d7", size = 33646, upload-time = "2026-04-25T11:08:39.109Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3a/453846a7eceea11e75def361eed01ec6a0205b9822c19927ed364ccae7cc/xxhash-3.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9f1563fdc8abfc389748e6932c7e4e99c89a53e4ec37d4563c24fc06f5e5644b", size = 31125, upload-time = "2026-04-25T11:08:40.467Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3e/49434aba738885d512f9e486db1bdd19db28dfa40372b56da26ef7a4e738/xxhash-3.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2d415f18becf6f153046ab6adc97da77e3643a0ee205dae61c4012604113a020", size = 196633, upload-time = "2026-04-25T11:08:41.943Z" }, + { url = "https://files.pythonhosted.org/packages/a4/e9/006cb6127baeb9f8abe6d15e62faa01349f09b34e2bfd65175b2422d026b/xxhash-3.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bb16aa13ed175bc9be5c2491ba031b85a9b51c4ed90e0b3d4ebe63cf3fb54f8e", size = 215899, upload-time = "2026-04-25T11:08:43.645Z" }, + { url = "https://files.pythonhosted.org/packages/27/e4/cc57d72e66df0ae29b914335f1c6dcf61e8f3746ddf0ae3c471aa4f15e00/xxhash-3.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f9fd595f1e5941b3d7863e4774e4b30caa6731fc34b9277da032295aa5656ee5", size = 238116, upload-time = "2026-04-25T11:08:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/af/78/3531d4a3fd8a0038cc6be1f265a69c1b3587f557a10b677dd736de2202c1/xxhash-3.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1295325c5a98d552333fa53dc2b026b0ef0ec9c8e73ca3a952990b4c7d65d459", size = 215012, upload-time = "2026-04-25T11:08:47.355Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f6/259fb1eaaec921f59b17203b0daee69829761226d3b980d5191d7723dd83/xxhash-3.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3573a651d146912da9daa9e29e5fbc45994420daaa9ef1e2fa5823e1dc485513", size = 448534, upload-time = "2026-04-25T11:08:49.149Z" }, + { url = "https://files.pythonhosted.org/packages/7b/16/a66d0eaf6a7e68532c07714361ddc904c663ec940f3b028c1ae4a21a7b9d/xxhash-3.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ec1e080a3d02d94ea9335bfab0e3374b877e25411422c18f51a943fa4b46381", size = 196217, upload-time = "2026-04-25T11:08:50.805Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ef/d2efc7fc51756dc52509109d1a25cefc859d74bc4b19a167b12dbd8c2786/xxhash-3.7.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84415265192072d8638a3afc3c1bc5995e310570cd9acb54dc46d3939e364fe0", size = 286906, upload-time = "2026-04-25T11:08:52.418Z" }, + { url = "https://files.pythonhosted.org/packages/fc/67/25decd1d4a4018582ec4db2a868a2b7e40640f4adb20dfeb19ac923aa825/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d4dea659b57443989ef32f4295104fd6912c73d0bf26d1d148bb88a9f159b02", size = 213057, upload-time = "2026-04-25T11:08:54.105Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5d/17651eb29d06786cdc40c60ae3d27d645aa5d61d2eca6237a7ba0b94789b/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:05ece0fe4d9c9c2728912d1981ae1566cfc83a011571b24732cbf76e1fb70dca", size = 243886, upload-time = "2026-04-25T11:08:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/8a/d4/174d9cf7502243d586e6a9ae842b1ae23026620995114f85f1380e588bc9/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fd880353cf1ffaf321bc18dd663e111976dbd0d3bbd8a66d58d2b470dfa7f396", size = 201015, upload-time = "2026-04-25T11:08:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/91/8c/2254e2d06c3ac5e6fe22eaf3da791b87ea823ae9f2c17b4af66755c5752d/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4e15cc9e2817f6481160f930c62842b3ff419e20e13072bcbab12230943092bc", size = 213457, upload-time = "2026-04-25T11:08:59.826Z" }, + { url = "https://files.pythonhosted.org/packages/79/a2/e3daa762545921173e3360f3b4ff7fc63c2d27359f7230ec1a7a74e117f6/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:90b9d1a8bd37d768ffc92a1f651ec69afc532a96fa1ac2ea7abbed5d630b3237", size = 277738, upload-time = "2026-04-25T11:09:01.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4c/e186da2c46b87f5204640e008d42730bf3c1ee9f0efb71ae1ebcdfeac681/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:157c49475b34ecea8809e51123d9769a534e139d1247942f7a4bc67710bb2533", size = 417127, upload-time = "2026-04-25T11:09:03.592Z" }, + { url = "https://files.pythonhosted.org/packages/17/28/3798e15007a3712d0da3d3fe70f8e11916569858b5cc371053bc26270832/xxhash-3.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5a6ddec83325685e729ca119d1f5c518ec39294212ecd770e60693cdc5f7eb79", size = 193962, upload-time = "2026-04-25T11:09:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/ad/95/a26baa93b5241fd7630998816a4ec47a5a0bad193b3f8fc8f3593e1a4a67/xxhash-3.7.0-cp314-cp314t-win32.whl", hash = "sha256:a04a6cab47e2166435aaf5b9e5ee41d1532cc8300efdef87f2a4d0acb7db19ed", size = 31643, upload-time = "2026-04-25T11:09:08.153Z" }, + { url = "https://files.pythonhosted.org/packages/44/36/5454f13c447e395f9b06a3e91274c59f503d31fad84e1836efe3bdb71f6a/xxhash-3.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8653dd7c2eda020545bb2c71c7f7039b53fe7434d0fc1a0a9deb79ab3f1a4fc1", size = 32522, upload-time = "2026-04-25T11:09:09.534Z" }, + { url = "https://files.pythonhosted.org/packages/74/35/698e7e3ff38e22992ea24870a511d8762474fb6783627a2910ff22a185c2/xxhash-3.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:468f0fc114faaa4b36699f8e328bbc3bb11dc418ba94ac52c26dd736d4b6c637", size = 28807, upload-time = "2026-04-25T11:09:11.234Z" }, ] [[package]] name = "yarl" -version = "1.22.0" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, - { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, - { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, - { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, - { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, - { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, - { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, - { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, - { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, - { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, - { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, - { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, - { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, - { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, - { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, - { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, - { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, - { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, - { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, - { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, - { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, - { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, - { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, - { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, - { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, - { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, - { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, - { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, - { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, - { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, - { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, - { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, - { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, - { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, - { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, - { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, - { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, - { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, - { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, - { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, - { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, - { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, - { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, - { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, - { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, + { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, + { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, + { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, + { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, + { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, + { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, + { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, + { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, + { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, + { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, + { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, + { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, + { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, + { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, + { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, + { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, + { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, + { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, + { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, + { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, + { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, + { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, + { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] [[package]] name = "zipp" -version = "3.23.0" +version = "3.23.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, ] [[package]]