From 969c8682171f7212975cd244f0221583acc2f397 Mon Sep 17 00:00:00 2001 From: fn-registry agent Date: Thu, 21 May 2026 18:26:30 +0200 Subject: [PATCH] chore: sync from fn-registry agent --- .claude/CLAUDE.md | 40 + .ipython/profile_default/history.sqlite | Bin 0 -> 36864 bytes .../profile_default/startup/00_fn_registry.py | 100 + .jupyter-port | 1 + .jupyter/collaboration_sessions.json | 7 + .jupyter_ystore.db | Bin 0 -> 229376 bytes .mcp.json | 12 + .python-version | 1 + README.md | 53 + analysis.md | 17 + create_dashboard.py | 308 ++ create_dashboard_v2.py | 280 ++ create_doc.py | 231 ++ data/results/00_users_callcenter.csv | 2 + data/results/00_users_callcenter.json | 12 + data/results/01_conversion_origen.csv | 3 + data/results/01_conversion_origen.json | 22 + data/results/02_kpi_3_por_centro.csv | 140 + data/results/02_kpi_3_por_centro.json | 1544 ++++++++ data/results/03_regen_por_centro.csv | 31 + data/results/03_regen_por_centro.json | 221 ++ data/results/04_regen_vs_conversion.csv | 3 + data/results/04_regen_vs_conversion.json | 22 + data/results/totales_globales.json | 10 + fix_cards.py | 40 + flip_b_to_union.py | 139 + main.py | 6 + .../00_resultados_ejecutados-checkpoint.ipynb | 224 ++ .../01_exploracion-checkpoint.ipynb | 214 ++ .../02_metricas_3kpi-checkpoint.ipynb | 244 ++ .../03_regeneracion-checkpoint.ipynb | 367 ++ notebooks/00_resultados_ejecutados.ipynb | 970 +++++ notebooks/01_exploracion.ipynb | 214 ++ notebooks/02_metricas_3kpi.ipynb | 244 ++ notebooks/03_regeneracion.ipynb | 367 ++ pyproject.toml | 17 + rewire_filters_by_name.py | 270 ++ run-jupyter-lab.sh | 50 + run_via_metabase.py | 343 ++ setup_dropdowns.py | 138 + uv.lock | 3242 +++++++++++++++++ 41 files changed, 10149 insertions(+) create mode 100644 .claude/CLAUDE.md create mode 100644 .ipython/profile_default/history.sqlite create mode 100644 .ipython/profile_default/startup/00_fn_registry.py create mode 100644 .jupyter-port create mode 100644 .jupyter/collaboration_sessions.json create mode 100644 .jupyter_ystore.db create mode 100644 .mcp.json create mode 100644 .python-version create mode 100644 README.md create mode 100644 analysis.md create mode 100644 create_dashboard.py create mode 100644 create_dashboard_v2.py create mode 100644 create_doc.py create mode 100644 data/results/00_users_callcenter.csv create mode 100644 data/results/00_users_callcenter.json create mode 100644 data/results/01_conversion_origen.csv create mode 100644 data/results/01_conversion_origen.json create mode 100644 data/results/02_kpi_3_por_centro.csv create mode 100644 data/results/02_kpi_3_por_centro.json create mode 100644 data/results/03_regen_por_centro.csv create mode 100644 data/results/03_regen_por_centro.json create mode 100644 data/results/04_regen_vs_conversion.csv create mode 100644 data/results/04_regen_vs_conversion.json create mode 100644 data/results/totales_globales.json create mode 100644 fix_cards.py create mode 100644 flip_b_to_union.py create mode 100644 main.py create mode 100644 notebooks/.ipynb_checkpoints/00_resultados_ejecutados-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/01_exploracion-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/02_metricas_3kpi-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/03_regeneracion-checkpoint.ipynb create mode 100644 notebooks/00_resultados_ejecutados.ipynb create mode 100644 notebooks/01_exploracion.ipynb create mode 100644 notebooks/02_metricas_3kpi.ipynb create mode 100644 notebooks/03_regeneracion.ipynb create mode 100644 pyproject.toml create mode 100644 rewire_filters_by_name.py create mode 100755 run-jupyter-lab.sh create mode 100644 run_via_metabase.py create mode 100644 setup_dropdowns.py create mode 100644 uv.lock diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..36a65c7 --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,40 @@ +# JUPYTER HABILITADO EN ESTE ANALISIS + +## Reglas OBLIGATORIAS para Claude + +### 1. CODIGO INMUTABLE — NUNCA MODIFICAR CELDAS EXISTENTES +- **PROHIBIDO** usar NotebookEdit para reemplazar celdas existentes +- **SIEMPRE** anadir celdas NUEVAS al final del notebook +- Si hay un error en una celda, crear celda nueva con la correccion +- El historial de trabajo debe quedar intacto para trazabilidad + +### 2. PROGRAMACION FUNCIONAL OBLIGATORIA +- **Funciones puras**: sin efectos secundarios, mismo input -> mismo output +- **Inmutabilidad**: nunca mutar datos, crear copias transformadas +- **Composicion**: funciones pequenas que se combinan +- Preferir: `map`, `filter`, `reduce`, list comprehensions +- Evitar: loops con mutacion, `global`, modificar argumentos in-place + +### 3. SIEMPRE usar MCP jupyter para ejecutar codigo Python +- Las ejecuciones se ven en tiempo real en Jupyter Lab del usuario +- Compartimos variables y estado del kernel +- **NUNCA usar bash para ejecutar Python en este analisis** + +### 4. Verificar Jupyter activo ANTES de ejecutar +- Si no esta activo: pedir al usuario que ejecute `./run-jupyter-lab.sh` + +### 5. Gestion de notebooks +- Notebooks en la carpeta `notebooks/` o subcarpetas +- Si un notebook tiene >50 celdas, crear uno nuevo +- Nombrar descriptivamente: `01_exploracion.ipynb`, `02_limpieza.ipynb` + +### 6. Gestion de Python +- **SIEMPRE usar `uv`** para gestionar dependencias +- Anadir paquetes con `uv add nombre_paquete` + +### 7. Acceso al fn_registry +- `FN_REGISTRY_ROOT` apunta a la raiz del registry +- Para importar funciones Python: `sys.path.insert(0, os.path.join(os.environ["FN_REGISTRY_ROOT"], "python", "functions"))` +- Para consultar registry.db: `sqlite3` o `import sqlite3` con la ruta `$FN_REGISTRY_ROOT/registry.db` + + diff --git a/.ipython/profile_default/history.sqlite b/.ipython/profile_default/history.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..1782698d57a633080d0a0930ce7b1e1b1b5325e0 GIT binary patch literal 36864 zcmeI4O>7%Q6o7aAZ^!O(sFXuhF{o7DRh_MWl9Z%MR0p}JqNu+hDnwVC-Ep#Hy}Q|2 zCoxqe8dZ^c=fnZTox%xD+Lufm5WwDNz?UPdO&KzD}pEr=Liu5;VArN;jeeZ;Uv+!fKnVd-|zIOpl&IJ zBR>kM{9{3qkNjNt{m2*j$A$a*J%IO-01`j~NB{{S0VIF~kN^@u0?$L>&iQ0|Tv5c$ zw*r09rfxg%+JUxgvB32^!&j*{uQuw}8{~R@;bMaf*X78FLuQmQ%XNt51ayh|C1P6+ z-M;FoA_3h9N+T6rzIx%E`qdlc?Zyq#Q`%LgC}&ft@k@#*SdK|I*s2Y`+%&x%xZ$-n z+*_?Oe4V~iji<+t9TPXth7=<6qarb6cXV^le)jsbZQ8J*%x(Jy?HWqD7n-lHkFb1{ z#S@9tc>UOZ7DxTmD$z+2yd=Xt<#H@Fe(IEXBeXOE#pr6AItJZw86UEIN2ToOEn0#n zl{@c>>G9*o#m(DYo!!x9(WtZ7u$HK{KY%@0dlKz=mFHV6-S3bU+9BOhHGJBlPEaB& z(EWe}R*S+}%Ny-M)G-G{iPLUrM$2TqK9mS()%}%lM3e&1N=oku(nINc=`(2qPVqnj zNB{{S0VIF~kN^@u0!RP}AOR$R1fGciNv4FlAQYhwf;YNA>pmFjG5X0}#VXC}{7 z%Vm<-N1{5Z*2=Z%+BAvpBT;!ntyZUJW+q8&KZ&YZo2pJu)rh#K#N=$brdG;Rl{01j z`(Kp)6ySvi5OM zxs`b>@pt08gde*Ulf-WhjnRk2keg%4tVrpY*(7tsc6C!OmaE!|XK6LfbA8Q#a7-II4uW~~-< zC?Fp(*U2?~w?#ZXShlT25>;G=%UpEs>5i#00x!?(-Gluop6v$kgz9zpSy*icx!gki zS_91I3gn`yo;LMBKkZZ2wgXmFR5)|(H7YB)oJpHqN_-uUG8-oJ}JJ~+93+Yft`gwG0y`BPB-BPxcRN#8uUcgX? zz3In}YT2&w!R+ir<-=UlS}GBJ17tiqP+5DCJ0+9hHnTpab8@9zBGX`JhilQDB`Vw0 zk^8!#M&D2ub$?mzlt}-!x?1kGO?};TnWnF{tx%HDK%1*4xe-dq#S`R8naCz3hHl&8G(ml(Yize+LLCCD%Rrzvg+v+x zE3m0tyzY8Y6&rXAVvT@Ok4K-^hUeYE28cXUHlbnQ0_8d^Q*_rAh%C-8u$Gns&DQw> zOc^W-nJ&BQveHL`qwxZa#`{SKHBC!~aRDO|g path hardcoded > descubrimiento automatico +def _discover_registry_root(): + if os.environ.get("FN_REGISTRY_ROOT"): + return Path(os.environ["FN_REGISTRY_ROOT"]).resolve() + hardcoded = Path("/home/egutierrez/fn_registry") + if (hardcoded / "registry.db").exists(): + return hardcoded + # Subir desde CWD hasta encontrar registry.db + p = Path.cwd() + for _ in range(10): + if (p / "registry.db").exists(): + return p + if p.parent == p: + break + p = p.parent + return hardcoded + +FN_REGISTRY_ROOT = _discover_registry_root() +os.environ["FN_REGISTRY_ROOT"] = str(FN_REGISTRY_ROOT) + +# ── sys.path: importar funciones Python del registry ──────── +_python_functions = FN_REGISTRY_ROOT / "python" / "functions" +for _domain in sorted(_python_functions.iterdir()) if _python_functions.exists() else []: + if _domain.is_dir() and not _domain.name.startswith("_"): + _path = str(_domain) + if _path not in sys.path: + sys.path.insert(0, _path) + +# Tambien el directorio padre para imports por dominio: from core import filter_list +_pf = str(_python_functions) +if _pf not in sys.path: + sys.path.insert(0, _pf) + +# ── fn_query: consultar registry.db desde el notebook ─────── +_REGISTRY_DB = FN_REGISTRY_ROOT / "registry.db" + +def fn_query(sql, params=()): + """Ejecuta una consulta SQL sobre registry.db y retorna las filas. + + Ejemplos: + fn_query("SELECT id, description FROM functions WHERE domain = ?", ("finance",)) + fn_query("SELECT id FROM functions_fts WHERE functions_fts MATCH ?", ("slice*",)) + """ + if not _REGISTRY_DB.exists(): + raise FileNotFoundError(f"registry.db no encontrado en {_REGISTRY_DB}") + con = sqlite3.connect(str(_REGISTRY_DB)) + con.row_factory = sqlite3.Row + try: + rows = con.execute(sql, params).fetchall() + return [dict(r) for r in rows] + finally: + con.close() + +def fn_search(term): + """Busca funciones y tipos en el registry por nombre o descripcion. + + Ejemplo: + fn_search("slice") + fn_search("finance") + """ + fts_term = f"name:{term}* OR description:{term}*" + functions = fn_query( + "SELECT id, kind, purity, lang, description FROM functions " + "WHERE id IN (SELECT id FROM functions_fts WHERE functions_fts MATCH ?) " + "ORDER BY name", (fts_term,) + ) + types = fn_query( + "SELECT id, algebraic, lang, description FROM types " + "WHERE id IN (SELECT id FROM types_fts WHERE types_fts MATCH ?) " + "ORDER BY name", (fts_term,) + ) + return {"functions": functions, "types": types} + +def fn_code(function_id): + """Retorna el codigo fuente de una funcion del registry. + + Ejemplo: + print(fn_code("filter_list_py_core")) + """ + rows = fn_query("SELECT code FROM functions WHERE id = ?", (function_id,)) + if not rows: + raise KeyError(f"Funcion no encontrada: {function_id}") + return rows[0]["code"] + +# ── Mensaje de bienvenida ─────────────────────────────────── +print(f"fn_registry conectado: {FN_REGISTRY_ROOT}") +print(f" registry.db: {'OK' if _REGISTRY_DB.exists() else 'NO ENCONTRADO'}") +print(f" Python functions: {_pf}") +print(f" Helpers: fn_query(), fn_search(), fn_code()") diff --git a/.jupyter-port b/.jupyter-port new file mode 100644 index 0000000..5246073 --- /dev/null +++ b/.jupyter-port @@ -0,0 +1 @@ +8888 diff --git a/.jupyter/collaboration_sessions.json b/.jupyter/collaboration_sessions.json new file mode 100644 index 0000000..791233f --- /dev/null +++ b/.jupyter/collaboration_sessions.json @@ -0,0 +1,7 @@ +{ + "577c4238-54a0-43dd-9392-9c50040ee0d2": { + "version": "2.4.0", + "created_at": "2026-05-21T10:39:30.038590+00:00", + "document_version": "2.0.0" + } +} \ No newline at end of file diff --git a/.jupyter_ystore.db b/.jupyter_ystore.db new file mode 100644 index 0000000000000000000000000000000000000000..22db68a36973dd730e15f7a22fb5239975d3dac0 GIT binary patch literal 229376 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

-Y<%NPf_xD`MewqAi@TWJpy15 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 DSAu=r literal 0 HcmV?d00001 diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..3f46706 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "jupyter": { + "command": "/home/egutierrez/fn_registry/projects/aurgi/analysis/presupuestos_callcenter/.venv/bin/python", + "args": ["-m", "jupyter_mcp_server.server"], + "env": { + "SERVER_URL": "http://localhost:8888", + "TOKEN": "" + } + } + } +} diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/README.md b/README.md new file mode 100644 index 0000000..583c0ba --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# presupuestos_callcenter + +Atribución de presupuestos generados por call_center → factura. + +## Hipótesis + +1. Agentes del call_center generan presupuestos (`tpv_orders_quote`) para un cliente identificado por `(customer_id, vehicle_id)` (matrícula + tlf vía joins). +2. El cliente luego acude a un centro físico. Allí: + - **Acepta el quote del call_center** → mismo `order_id` → invoice. CONVIERTE. + - **Genera quote nuevo en TPV centro** → otro `order_id` → invoice. REGENERA y convierte. + - **No vuelve** → quote sin invoice. +3. La facturación total a esos clientes en el centro suele ser mayor que el valor del quote inicial (productos/servicios adicionales que el técnico añade en recepción). + +## Datasets + +| Origen | Tabla / propósito | +|---|---| +| `psql_dcpublic.tpv_orders_quote` | Quote raw — `created_by_id`, `order_id`, `accepted`, `status` | +| `psql_dcpublic.tpv_authorization_tpvuser` | Users TPV. ID = `created_by_id` | +| `psql_dcpublic.tpv_authorization_tpvuser_centers` | Mapeo user ↔ centro (`dccenter_id`) | +| `psql_dcpublic.centers` | Catálogo centros. **id 159 (CALL CENTER AURGI) e id 162 (CALL CENTER)** son los centros call_center | +| `psql_dcpublic.tpv_orders_order` | Order. `customer_id`, `vehicle_id`, `terminal_id`, `total_cost` | +| `psql_dcpublic.tpv_terminals` | Mapeo `terminal_id → center_id` | +| `psql_dcpublic.tpv_orders_invoice` | Invoice. Match con order via `order_id` | +| `psql_dcpublic.tpv_customers.entity_phone_number` | Tlf cliente | +| `psql_dcpublic.tpv_vehicles_vehicle.license_plate` | Matrícula | + +## Notebooks + +1. **`01_exploracion.ipynb`** — schemas, sanity counts, conversion rate global. +2. **`02_metricas_3kpi.ipynb`** — A/B/C por centro: + - A = € facturados de quotes call_center que CONVIRTIERON (mismo order_id). + - B = € facturados al mismo `(customer_id, vehicle_id)` en centro (excluye call_center). + - C = € totales del centro. +3. **`03_regeneracion.ipynb`** — Q0 (call_center) vs Q1+ (centro). Centros que más regeneran, distribución temporal, impacto en conversión. + +## Identidad cliente + +Por defecto `(customer_id, vehicle_id)` (FK estables). Si necesitas normalizar via tlf+matrícula: + +```sql +JOIN `psql_dcpublic.tpv_customers` cus ON o.customer_id = cus.id +JOIN `psql_dcpublic.tpv_vehicles_vehicle` v ON o.vehicle_id = v.id +-- cus.entity_phone_number, v.license_plate +``` + +Ventana temporal default: 90 días sobre Q0, 60 días para detectar regeneración posterior. Editar `WINDOW_DAYS` / `REGEN_WINDOW_DAYS` arriba en cada notebook. + +## Próximos pasos + +- Validar que `created_by_id` no es null en todos los quotes call_center. +- Refinar identidad cliente con normalización de teléfono (la BI views `*_telefono_normalizado` existen). +- Si la métrica B es estable, candidatos a dashboard Metabase paralelo al 999. diff --git a/analysis.md b/analysis.md new file mode 100644 index 0000000..ba9cfcc --- /dev/null +++ b/analysis.md @@ -0,0 +1,17 @@ +--- +name: presupuestos_callcenter +lang: py +domain: datascience +description: "Atribucion de presupuestos call_center -> factura: total convertido, valor mismo cliente en centro, facturacion total centro, regeneracion de quotes por centro" +tags: [aurgi, call_center, quotes, bigquery] +uses_functions: [] +uses_types: [] +framework: "jupyterlab" +entry_point: "notebooks/main.ipynb" +dir_path: "projects/aurgi/analysis/presupuestos_callcenter" +repo_url: "" +--- + +## Notas + +Atribucion de presupuestos call_center -> factura: total convertido, valor mismo cliente en centro, facturacion total centro, regeneracion de quotes por centro diff --git a/create_dashboard.py b/create_dashboard.py new file mode 100644 index 0000000..6696437 --- /dev/null +++ b/create_dashboard.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 +"""Build Metabase dashboard 'Presupuestos Call Center → Facturación'. + +5 dashboard filters: fecha (date/range), centro, agente CC, compañía, producto. +3 KPIs × 3 cards each = 9 scalar cards: + A — Presupuestos Call center (quote CC → invoice mismo order_id) + B — Presupuestos CallC regenerados (Q0 CC → Q1 en centro físico → invoice) + C — Total facturado (invoice en centros, excluye 159/162) + +Métricas por KPI: + - Total facturado (€) + - # Facturas + - Ticket medio (€) = Total / # +""" +import json +import os +import subprocess +import sys + +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +DB_ID = 6 +COLLECTION_ID = 559 # "Datos de call center" + +# Field IDs (precomputados via /api/table//query_metadata) +F_INVOICE_CREATED_AT = 16235 +F_CENTER_ID = 17327 +F_TPVUSER_ID = 17965 +F_COMPANY_ID = 17157 +F_PRODUCT_ID = 16698 + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=120) + + +# ---------- Template tags ---------- +def field_filter_tag(name: str, field_id: int, widget: str, display_name: str): + return { + "id": name + "-tag", + "name": name, + "display-name": display_name, + "type": "dimension", + "dimension": ["field", field_id, None], + "widget-type": widget, + "default": None, + } + +# Tag set para A y B (5 filtros) +TAGS_AB = { + "date": field_filter_tag("date", F_INVOICE_CREATED_AT, "date/range", "Fecha"), + "centro": field_filter_tag("centro", F_CENTER_ID, "id", "Centro"), + "agente": field_filter_tag("agente", F_TPVUSER_ID, "id", "Agente CC"), + "compania": field_filter_tag("compania", F_COMPANY_ID, "id", "Compañía"), + "producto": field_filter_tag("producto", F_PRODUCT_ID, "id", "Producto"), +} + +# Tag set para C (4 filtros — sin agente) +TAGS_C = {k: v for k, v in TAGS_AB.items() if k != "agente"} + + +# ---------- SQL skeletons ---------- +SQL_A = """ +WITH +cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + AND COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{agente}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +SQL_B = """ +WITH +cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +q0 AS ( + SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts, + q.created_by_id AS cc_agent_id, + o.customer_id, o.vehicle_id + FROM `psql_dcpublic.tpv_orders_quote` q + JOIN cc_users cc ON q.created_by_id = cc.user_id + JOIN `psql_dcpublic.tpv_orders_order` o ON q.order_id = o.id + WHERE q.deleted_at IS NULL + AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL +), +qN AS ( + SELECT q.id AS qn_id, q.order_id AS qn_order, q.created_at AS qn_ts, + o.customer_id, o.vehicle_id, t.center_id + FROM `psql_dcpublic.tpv_orders_quote` q + JOIN `psql_dcpublic.tpv_orders_order` o ON q.order_id = o.id + LEFT JOIN `psql_dcpublic.tpv_terminals` t ON o.terminal_id = t.id + WHERE q.deleted_at IS NULL + AND t.center_id IS NOT NULL AND t.center_id NOT IN (159, 162) +), +pairs AS ( + SELECT DISTINCT q0.cc_agent_id, qN.qn_order + FROM q0 + JOIN qN + ON q0.customer_id = qN.customer_id + AND q0.vehicle_id = qN.vehicle_id + AND qN.qn_ts > q0.q0_ts + AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL 60 DAY) + AND qN.qn_order != q0.q0_order +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM pairs + JOIN `psql_dcpublic.tpv_orders_order` ON pairs.qn_order = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON pairs.cc_agent_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE 1=1 + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{agente}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +SQL_C = """ +WITH filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_invoice` + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +AGG = { + "total": "ROUND(SUM(total_cost), 2)", + "count": "COUNT(*)", + "ticket": "ROUND(SAFE_DIVIDE(SUM(total_cost), NULLIF(COUNT(*), 0)), 2)", +} + + +def make_card(name: str, sql_skel: str, agg_key: str, tags: dict, display: str, currency: bool): + sql = sql_skel.replace("__AGG__", AGG[agg_key]) + viz = {} + if currency: + viz = { + "column_settings": { + '["name","valor"]': { + "number_style": "currency", + "currency": "EUR", + "currency_style": "symbol", + "currency_in_header": False, + "decimals": 0, + } + } + } + body = { + "name": name, + "type": "question", + "display": display, + "visualization_settings": viz, + "dataset_query": { + "type": "native", + "database": DB_ID, + "native": {"query": sql, "template-tags": tags}, + }, + "collection_id": COLLECTION_ID, + "description": name, + "result_metadata": None, + } + r = client.post("/api/card", json=body) + if r.status_code >= 400: + print(r.status_code, r.text[:500]) + r.raise_for_status() + return r.json() + + +# ---------- Build 9 cards ---------- +specs = [ + # (id, name, skeleton, agg, tags, display, currency) + ("a_total", "A · Presupuestos Call center — Total facturado", SQL_A, "total", TAGS_AB, "scalar", True), + ("a_count", "A · Presupuestos Call center — # Facturas", SQL_A, "count", TAGS_AB, "scalar", False), + ("a_ticket", "A · Presupuestos Call center — Ticket medio", SQL_A, "ticket", TAGS_AB, "scalar", True), + + ("b_total", "B · Presupuestos CallC regenerados — Total facturado", SQL_B, "total", TAGS_AB, "scalar", True), + ("b_count", "B · Presupuestos CallC regenerados — # Facturas", SQL_B, "count", TAGS_AB, "scalar", False), + ("b_ticket", "B · Presupuestos CallC regenerados — Ticket medio", SQL_B, "ticket", TAGS_AB, "scalar", True), + + ("c_total", "C · Total facturado — Total facturado", SQL_C, "total", TAGS_C, "scalar", True), + ("c_count", "C · Total facturado — # Facturas", SQL_C, "count", TAGS_C, "scalar", False), + ("c_ticket", "C · Total facturado — Ticket medio", SQL_C, "ticket", TAGS_C, "scalar", True), +] + +cards = {} +for sid, name, skel, agg, tags, display, currency in specs: + print(f"creating {sid} ... {name}") + c = make_card(name, skel, agg, tags, display, currency) + cards[sid] = c + print(f" -> id={c['id']}") + + +# ---------- Build dashboard ---------- +print("\ncreating dashboard") +dash = client.post("/api/dashboard", json={ + "name": "Call Center — Presupuestos · KPIs (90d)", + "collection_id": COLLECTION_ID, + "description": "A=Quotes CC facturados · B=CallC regenerados · C=Total facturado · Filtros: fecha/centro/agente/compañía/producto", +}).json() +DID = dash["id"] +print(f" dashboard id={DID}") + +# Dashboard-level parameters +DPARAMS = [ + {"id": "p_date", "name": "Fecha", "slug": "fecha", "type": "date/range", "sectionId": "date"}, + {"id": "p_centro", "name": "Centro", "slug": "centro", "type": "id", "sectionId": "id"}, + {"id": "p_agente", "name": "Agente CC", "slug": "agente", "type": "id", "sectionId": "id"}, + {"id": "p_compania", "name": "Compañía", "slug": "compania", "type": "id", "sectionId": "id"}, + {"id": "p_producto", "name": "Producto", "slug": "producto", "type": "id", "sectionId": "id"}, +] + +# Parameter mappings: each dashboard param → each card's template-tag target +def mapping_for_card(card_id: int, tag_keys: list[str]): + return [ + { + "parameter_id": f"p_{k}", + "card_id": card_id, + "target": ["dimension", ["template-tag", k]], + } + for k in tag_keys + ] + +# Grid: 24 wide. Columns 0/8/16 = 8 wide. Rows 0/4/8 by KPI band. +DASHCARDS = [] +layout = [ + # (sid, row, col, h) + ("a_total", 0, 0, 4), ("a_count", 0, 8, 4), ("a_ticket", 0, 16, 4), + ("b_total", 4, 0, 4), ("b_count", 4, 8, 4), ("b_ticket", 4, 16, 4), + ("c_total", 8, 0, 4), ("c_count", 8, 8, 4), ("c_ticket", 8, 16, 4), +] + +neg = -1 +for sid, row, col, h in layout: + card = cards[sid] + tag_keys = list((TAGS_AB if sid[0] in "ab" else TAGS_C).keys()) + DASHCARDS.append({ + "id": neg, + "card_id": card["id"], + "row": row, + "col": col, + "size_x": 8, + "size_y": h, + "parameter_mappings": mapping_for_card(card["id"], tag_keys), + "visualization_settings": {}, + }) + neg -= 1 + +# Update dashboard with params + dashcards +r = client.put(f"/api/dashboard/{DID}", json={ + "parameters": DPARAMS, + "dashcards": DASHCARDS, +}) +if r.status_code >= 400: + print(r.status_code, r.text[:800]) + r.raise_for_status() + +print(f"\nDONE") +print(f"dashboard URL: {BASE}/dashboard/{DID}") +client.close() diff --git a/create_dashboard_v2.py b/create_dashboard_v2.py new file mode 100644 index 0000000..ed1b176 --- /dev/null +++ b/create_dashboard_v2.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +"""Dashboard v2 — coherencia: + - Date filter en `tpv_orders_quote.created_at` (creacion de presupuesto) para A B C. + - A = quotes CC -> factura (mismo order_id). + - B = (A) ∪ (quotes regenerados en centro fisico desde Q0 CC dentro 60d) -> facturas. + - C = invoices de centros fisicos cuyo order tiene AL MENOS un quote en la ventana + (98.7% de invoices tienen quote, solo cae 3.7% del valor — aceptable). +""" +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +DB_ID = 6 +COLLECTION_ID = 559 + +F_QUOTE_CREATED_AT = 16588 +F_CENTER_ID = 17327 +F_TPVUSER_ID = 17965 +F_COMPANY_ID = 17157 +F_PRODUCT_ID = 16698 + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=180) + + +def field_filter_tag(name: str, field_id: int, widget: str, display_name: str): + return { + "id": name + "-tag", + "name": name, + "display-name": display_name, + "type": "dimension", + "dimension": ["field", field_id, None], + "widget-type": widget, + "default": None, + } + +TAGS_AB = { + "date": field_filter_tag("date", F_QUOTE_CREATED_AT, "date/range", "Fecha presupuesto"), + "centro": field_filter_tag("centro", F_CENTER_ID, "id", "Centro"), + "agente": field_filter_tag("agente", F_TPVUSER_ID, "id", "Agente CC"), + "compania": field_filter_tag("compania", F_COMPANY_ID, "id", "Compañía"), + "producto": field_filter_tag("producto", F_PRODUCT_ID, "id", "Producto"), +} +TAGS_C = {k: v for k, v in TAGS_AB.items() if k != "agente"} + + +# ---- SQL ---- +# Convention: tabla cuya columna se filtra via field-filter NO lleva alias. +# Demas tablas pueden usar alias o full ref. + +SQL_A = """ +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + AND COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{agente}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +# B: union de Q-CC directos + Q1 regenerados (desde Q0-CC dentro 60d). +# Q1 vive en una CTE clon de la tabla quote para no chocar con field-filter de Q-CC. +SQL_B = """ +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +quotes_q1 AS ( + SELECT id, order_id, created_at, deleted_at + FROM `psql_dcpublic.tpv_orders_quote` +), +orders_q1 AS ( + SELECT id, customer_id, vehicle_id, terminal_id + FROM `psql_dcpublic.tpv_orders_order` +), +terminals_q1 AS ( + SELECT id, center_id FROM `psql_dcpublic.tpv_terminals` +), +-- Q0 (CC) anchor; field-filters (date/agente) aplican sobre la quote CC +cc_anchored AS ( + SELECT + `psql_dcpublic.tpv_orders_quote`.id AS q0_id, + `psql_dcpublic.tpv_orders_quote`.order_id AS q0_order, + `psql_dcpublic.tpv_orders_quote`.created_at AS q0_ts, + `psql_dcpublic.tpv_orders_quote`.created_by_id AS cc_agent_id, + `psql_dcpublic.tpv_orders_order`.customer_id AS cust_id, + `psql_dcpublic.tpv_orders_order`.vehicle_id AS veh_id + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + [[AND {{date}}]] + [[AND {{agente}}]] +), +-- Orders incluidos: Q-CC directos + Q1 regenerados +b_orders AS ( + SELECT q0_order AS order_id FROM cc_anchored + UNION DISTINCT + SELECT q1.order_id AS order_id + FROM cc_anchored a + JOIN quotes_q1 q1 + ON q1.deleted_at IS NULL + AND q1.created_at > a.q0_ts + AND q1.created_at <= TIMESTAMP_ADD(a.q0_ts, INTERVAL 60 DAY) + AND q1.order_id != a.q0_order + JOIN orders_q1 o1 ON q1.order_id = o1.id + LEFT JOIN terminals_q1 t1 ON o1.terminal_id = t1.id + WHERE o1.customer_id = a.cust_id + AND o1.vehicle_id = a.veh_id + AND t1.center_id IS NOT NULL + AND t1.center_id NOT IN (159, 162) +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM b_orders + JOIN `psql_dcpublic.tpv_orders_order` ON b_orders.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +# C: total facturado en centros fisicos cuyos orders tienen al menos un quote en la ventana +SQL_C = """ +WITH filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_quote` + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + AND COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +AGG = { + "total": "ROUND(SUM(total_cost), 2)", + "count": "COUNT(*)", + "ticket": "ROUND(SAFE_DIVIDE(SUM(total_cost), NULLIF(COUNT(*), 0)), 2)", +} + + +def make_card(name, sql_skel, agg_key, tags, display, currency): + sql = sql_skel.replace("__AGG__", AGG[agg_key]) + viz = {} + if currency: + viz = {"column_settings": {'["name","valor"]': { + "number_style": "currency", "currency": "EUR", + "currency_style": "symbol", "currency_in_header": False, "decimals": 0, + }}} + body = { + "name": name, + "type": "question", + "display": display, + "visualization_settings": viz, + "dataset_query": { + "type": "native", "database": DB_ID, + "native": {"query": sql, "template-tags": tags}, + }, + "collection_id": COLLECTION_ID, + "description": name, + "result_metadata": None, + } + r = client.post("/api/card", json=body) + if r.status_code >= 400: + print(r.status_code, r.text[:500]); r.raise_for_status() + return r.json() + + +specs = [ + ("a_total", "A · Presupuestos Call center — Total facturado", SQL_A, "total", TAGS_AB, "scalar", True), + ("a_count", "A · Presupuestos Call center — # Facturas", SQL_A, "count", TAGS_AB, "scalar", False), + ("a_ticket", "A · Presupuestos Call center — Ticket medio", SQL_A, "ticket", TAGS_AB, "scalar", True), + + ("b_total", "B · Presupuestos CallC + Regenerados — Total facturado", SQL_B, "total", TAGS_AB, "scalar", True), + ("b_count", "B · Presupuestos CallC + Regenerados — # Facturas", SQL_B, "count", TAGS_AB, "scalar", False), + ("b_ticket", "B · Presupuestos CallC + Regenerados — Ticket medio", SQL_B, "ticket", TAGS_AB, "scalar", True), + + ("c_total", "C · Total facturado — Total facturado", SQL_C, "total", TAGS_C, "scalar", True), + ("c_count", "C · Total facturado — # Facturas", SQL_C, "count", TAGS_C, "scalar", False), + ("c_ticket", "C · Total facturado — Ticket medio", SQL_C, "ticket", TAGS_C, "scalar", True), +] + +cards = {} +for sid, name, skel, agg, tags, display, currency in specs: + print(f"creating {sid} ... {name}") + c = make_card(name, skel, agg, tags, display, currency) + cards[sid] = c + print(f" -> id={c['id']}") + +print("\ncreating dashboard v2") +dash = client.post("/api/dashboard", json={ + "name": "Call Center — Presupuestos · KPIs (v2)", + "collection_id": COLLECTION_ID, + "description": "A=Quotes CC · B=CC + Regenerados · C=Total facturado (orders con quote). Filtros: fecha-presupuesto/centro/agente/compañía/producto", +}).json() +DID = dash["id"] +print(f" dashboard id={DID}") + +DPARAMS = [ + {"id": "p_date", "name": "Fecha presupuesto", "slug": "fecha", "type": "date/range", "sectionId": "date"}, + {"id": "p_centro", "name": "Centro", "slug": "centro", "type": "id", "sectionId": "id"}, + {"id": "p_agente", "name": "Agente CC", "slug": "agente", "type": "id", "sectionId": "id"}, + {"id": "p_compania", "name": "Compañía", "slug": "compania", "type": "id", "sectionId": "id"}, + {"id": "p_producto", "name": "Producto", "slug": "producto", "type": "id", "sectionId": "id"}, +] + +def mapping_for_card(card_id, tag_keys): + return [{"parameter_id": f"p_{k}", "card_id": card_id, + "target": ["dimension", ["template-tag", k]]} for k in tag_keys] + +DASHCARDS = [] +layout = [ + ("a_total", 0, 0, 4), ("a_count", 0, 8, 4), ("a_ticket", 0, 16, 4), + ("b_total", 4, 0, 4), ("b_count", 4, 8, 4), ("b_ticket", 4, 16, 4), + ("c_total", 8, 0, 4), ("c_count", 8, 8, 4), ("c_ticket", 8, 16, 4), +] +neg = -1 +for sid, row, col, h in layout: + card = cards[sid] + tag_keys = list((TAGS_AB if sid[0] in "ab" else TAGS_C).keys()) + DASHCARDS.append({ + "id": neg, "card_id": card["id"], + "row": row, "col": col, "size_x": 8, "size_y": h, + "parameter_mappings": mapping_for_card(card["id"], tag_keys), + "visualization_settings": {}, + }) + neg -= 1 + +r = client.put(f"/api/dashboard/{DID}", json={"parameters": DPARAMS, "dashcards": DASHCARDS}) +if r.status_code >= 400: + print(r.status_code, r.text[:800]); r.raise_for_status() + +print(f"\nDONE") +print(f"dashboard URL: {BASE}/dashboard/{DID}") +client.close() diff --git a/create_doc.py b/create_doc.py new file mode 100644 index 0000000..ea9e7a3 --- /dev/null +++ b/create_doc.py @@ -0,0 +1,231 @@ +#!/usr/bin/env python3 +"""Create Metabase document with analysis results.""" +import json +import os +import subprocess +import sys +from pathlib import Path + +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +HERE = Path(__file__).parent +RES = HERE / "data" / "results" +COLLECTION_ID = 559 # "Datos de call center" + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=120) + +# ---- load results ---- +totales = json.loads((RES / "totales_globales.json").read_text()) +conv = json.loads((RES / "01_conversion_origen.json").read_text()) +kpi = json.loads((RES / "02_kpi_3_por_centro.json").read_text()) +regen = json.loads((RES / "03_regen_por_centro.json").read_text()) +rvc = json.loads((RES / "04_regen_vs_conversion.json").read_text()) + +# ---- prosemirror builders ---- +ALLOWED = {"doc","heading","paragraph","text","horizontalRule","blockquote", + "bulletList","listItem","codeBlock"} + +def h(level, text): + return {"type": "heading", "attrs": {"level": level}, + "content": [{"type": "text", "text": text}]} + +def p(*parts): + content = [] + for x in parts: + if isinstance(x, str): + content.append({"type": "text", "text": x}) + else: + content.append(x) + return {"type": "paragraph", "content": content} + +def bold(text): + return {"type": "text", "text": text, "marks": [{"type": "bold"}]} + +def code(text): + return {"type": "text", "text": text, "marks": [{"type": "code"}]} + +def bullet_list(items): + nodes = [] + for it in items: + if isinstance(it, str): + paras = [p(it)] + elif isinstance(it, list): + paras = it + else: + paras = [it] + nodes.append({"type": "listItem", "content": paras}) + return {"type": "bulletList", "content": nodes} + +def hr(): + return {"type": "horizontalRule"} + +def code_block(text, lang="sql"): + return {"type": "codeBlock", "attrs": {"language": lang}, + "content": [{"type": "text", "text": text}]} + +def fmt_eur(n): + return f"{n:,.0f} €".replace(",", "X").replace(".", ",").replace("X", ".") + +def fmt_pct(n): + return f"{n*100:.2f}%".replace(".", ",") + +# ---- build content ---- + +# KPI table emulated as bullet list (table not allowed) +kpi_rows = kpi["rows"] +top10_a = sorted(kpi_rows, key=lambda r: r[3], reverse=True)[:10] +top10_c = sorted(kpi_rows, key=lambda r: r[5], reverse=True)[:10] +regen_rows = regen["rows"] +top10_regen = regen_rows[:10] + +conv_rows = conv["rows"] +conv_cc = next(r for r in conv_rows if r[0] == "call_center") +conv_otro = next(r for r in conv_rows if r[0] == "otro") + +doc_content = [ + h(1, "Presupuestos generados por Call Center → Facturación"), + p("Ventana: últimos 90 días. Datos: ", code("psql_dcpublic"), " en BigQuery ", code("autingo-159109"), + ". Centros call_center excluidos del cómputo de facturación física: ", + code("159 CALL CENTER AURGI"), " y ", code("162 CALL CENTER"), "."), + + h(2, "Metodología"), + p("Identificación del origen call_center vía ", + code("tpv_authorization_tpvuser_centers.dccenter_id IN (159, 162)"), + ". El ", code("tpv_orders_quote.created_by_id"), " se cruza con ese conjunto de usuarios (249 usuarios call_center)."), + p("Cadena de joins:"), + code_block( + "tpv_authorization_tpvuser_centers (dccenter_id ∈ {159, 162})\n" + " └─ tpvuser_id ─► tpv_orders_quote.created_by_id\n" + " └─ order_id ─► tpv_orders_order ─► terminal_id ─► tpv_terminals.center_id ─► centers\n" + " └─ order_id ─► tpv_orders_invoice (convertido si fila existe)\n" + " └─ customer_id, vehicle_id (identidad cliente)", + "text"), + p("Identidad del cliente = ", code("(customer_id, vehicle_id)"), " del order. " + "Conversión a factura = existe fila en ", code("tpv_orders_invoice"), " con el mismo ", code("order_id"), "."), + + hr(), + + h(2, "Totales globales (90 días)"), + bullet_list([ + [p(bold("A — € quotes call_center facturados (mismo order_id): "), fmt_eur(totales["A_quote_cc_eur"]))], + [p(bold("B — € facturados a esos mismos clientes en centros físicos: "), fmt_eur(totales["B_mismo_cliente_eur"]), + " (lift ", f"{totales['lift_B_vs_A']:.2f}×".replace(".", ","), " sobre A)")], + [p(bold("C — € totales facturados en centros físicos: "), fmt_eur(totales["C_total_centros_eur"]))], + [p(bold("A / C = "), fmt_pct(totales["A_sobre_C"]), + " — peso directo del call_center en facturación de centros")], + [p(bold("B / C = "), fmt_pct(totales["B_sobre_C"]), + " — peso de clientes tocados por call_center")], + [p(bold("Centros activos en ventana: "), str(totales["centros_activos"]))], + ]), + p("Lectura: el call_center trae directamente ~21,6% de la facturación de centros, " + "pero sus clientes acaban facturando ~23,4% (1,08× más): el centro suele añadir " + "valor al ticket cuando el cliente acude. Brecha B−A = ", + fmt_eur(totales["B_mismo_cliente_eur"] - totales["A_quote_cc_eur"]), "."), + + hr(), + + h(2, "Conversión de quote → factura por origen"), + bullet_list([ + [p(bold(f"Call center: "), f"{conv_cc[1]:,} quotes / 90d → {conv_cc[2]:,} facturas → ", + bold(fmt_pct(conv_cc[3])))], + [p(bold(f"Otros usuarios: "), f"{conv_otro[1]:,} quotes / 90d → {conv_otro[2]:,} facturas → ", + bold(fmt_pct(conv_otro[3])))], + ]), + p("Brecha esperable de ~10 pp: el quote del centro se hace casi siempre con el " + "cliente delante; el del call_center es 'en frío' (vía teléfono)."), + + hr(), + + h(2, "Top 10 centros por A (más facturado vía quote call_center)"), + bullet_list([ + [p(bold(r[1]), " — A=", fmt_eur(r[3]), " · B=", fmt_eur(r[4]), " · C=", fmt_eur(r[5]), + " · A/C=", fmt_pct(r[6]), " · lift B/A=", str(r[8]) if r[8] is not None else "—", "×")] + for r in top10_a + ]), + + h(2, "Top 10 centros por C (facturación total)"), + bullet_list([ + [p(bold(r[1]), " — A=", fmt_eur(r[3]), " · B=", fmt_eur(r[4]), " · C=", fmt_eur(r[5]), + " · A/C=", fmt_pct(r[6]), " · B/C=", fmt_pct(r[7]))] + for r in top10_c + ]), + + hr(), + + h(2, "Regeneración del presupuesto"), + p("Regeneración = un mismo par ", code("(customer_id, vehicle_id)"), + " con un Q0 abierto por call_center y un Q1 posterior abierto en un terminal de " + "centro físico no-call_center con ", code("order_id"), " distinto, dentro de los 60 días siguientes."), + p(bold("Volumen Q0 con / sin regeneración:")), + bullet_list([ + [p(bold("No regenerado: "), f"{rvc['rows'][0][1]:,} Q0 — convierte ", + bold(fmt_pct(rvc['rows'][0][3])), " sobre su order_id original")], + [p(bold("Regenerado: "), f"{rvc['rows'][1][1]:,} Q0 — convierte ", + bold(fmt_pct(rvc['rows'][1][3])), " sobre su order_id original")], + ]), + p("Es decir, ~34,2% de los Q0 del call_center entran en patrón de regeneración. " + "La conversión sobre el order_id original cae del 63,1% al 38,7% en ese segmento, " + "pero el cliente puede haber facturado por el order_id del centro — esa parte queda " + "capturada por el KPI B."), + + h(2, "Top 10 centros que MÁS regeneran (90d / window 60d)"), + bullet_list([ + [p(bold(r[1]), " — Q0 regenerados aquí: ", str(r[2]), + " · eventos: ", str(r[3]), + " · días promedio entre Q0 y regeneración: ", f"{r[4]:.1f}".replace(".", ","))] + for r in top10_regen + ]), + + hr(), + + h(2, "Cuestiones abiertas"), + bullet_list([ + "Filtrar invoices por status válido (excluir rectificativas/anuladas)", + "¿Sumar líneas (orderitem.total_price) en vez de order.total_cost? Captura descuentos finales mejor", + "Refinar identidad cliente con teléfono normalizado (BI views *_telefono_normalizado)", + "Validar si algún centro fuera de 159/162 actúa como call_center mixto", + ]), + + h(2, "Origen del análisis"), + p("Notebooks ejecutados: ", + code("projects/aurgi/analysis/presupuestos_callcenter/notebooks/"), + " en el repo ", code("fn_registry"), + ". Datos crudos: ", code("data/results/*.csv"), "."), +] + +doc = {"type": "doc", "content": doc_content} + +# ---- validate before POST ---- +def validate(node, path=""): + errs = [] + if isinstance(node, dict): + typ = node.get("type", "?") + if typ not in ALLOWED: + errs.append(f"{path}: tipo no permitido '{typ}'") + for i, c in enumerate(node.get("content", []) or []): + errs += validate(c, f"{path}/{typ}[{i}]") + return errs + +errs = validate(doc) +if errs: + print("INVALID DOC:") + for e in errs: + print(" ", e) + sys.exit(1) +print("doc valid, posting...") + +# ---- POST ---- +r = client.post("/api/document", json={ + "name": "Call Center — Presupuestos → Facturación (90d)", + "collection_id": COLLECTION_ID, + "document": doc, +}) +if r.status_code >= 400: + print(r.status_code, r.text) + sys.exit(1) +data = r.json() +print(f"created document id={data['id']}") +print(f"url: {BASE}/document/{data['id']}") +client.close() diff --git a/data/results/00_users_callcenter.csv b/data/results/00_users_callcenter.csv new file mode 100644 index 0000000..d5fca93 --- /dev/null +++ b/data/results/00_users_callcenter.csv @@ -0,0 +1,2 @@ +users_totales,users_activos +249,497 diff --git a/data/results/00_users_callcenter.json b/data/results/00_users_callcenter.json new file mode 100644 index 0000000..47912a9 --- /dev/null +++ b/data/results/00_users_callcenter.json @@ -0,0 +1,12 @@ +{ + "cols": [ + "users_totales", + "users_activos" + ], + "rows": [ + [ + 249, + 497 + ] + ] +} \ No newline at end of file diff --git a/data/results/01_conversion_origen.csv b/data/results/01_conversion_origen.csv new file mode 100644 index 0000000..24681ac --- /dev/null +++ b/data/results/01_conversion_origen.csv @@ -0,0 +1,3 @@ +origen,quotes,convertidos,conv_rate +call_center,62779,29576,0.4711 +otro,477095,273764,0.5738 diff --git a/data/results/01_conversion_origen.json b/data/results/01_conversion_origen.json new file mode 100644 index 0000000..d3c9d2f --- /dev/null +++ b/data/results/01_conversion_origen.json @@ -0,0 +1,22 @@ +{ + "cols": [ + "origen", + "quotes", + "convertidos", + "conv_rate" + ], + "rows": [ + [ + "call_center", + 62779, + 29576, + 0.4711 + ], + [ + "otro", + 477095, + 273764, + 0.5738 + ] + ] +} \ No newline at end of file diff --git a/data/results/02_kpi_3_por_centro.csv b/data/results/02_kpi_3_por_centro.csv new file mode 100644 index 0000000..7e55186 --- /dev/null +++ b/data/results/02_kpi_3_por_centro.csv @@ -0,0 +1,140 @@ +center_id,center_name,quotes_cc_facturados,A_quote_cc_eur,B_mismo_cliente_eur,C_total_centro_eur,A_sobre_C,B_sobre_C,lift_B_vs_A +144,Velez Malaga,158,21890.28,37700.63,653333.86,0.0335,0.0577,1.72 +75,Store,607,150402.5,167424.36,644637.94,0.2333,0.2597,1.11 +54,Leganes,516,62620.06,87800.04,637007.16,0.0983,0.1378,1.4 +121,Villalba,316,41725.46,57526.94,524985.02,0.0795,0.1096,1.38 +168,Goya GLASS,1773,414629.07,418220.06,497398.12,0.8336,0.8408,1.01 +73,Malaga,379,64408.08,77124.76,489986.85,0.1314,0.1574,1.2 +130,Alcorcon,210,29467.17,42686.28,487245.3,0.0605,0.0876,1.45 +35,MT Sanchinarro,480,78658.96,87172.31,487013.5,0.1615,0.179,1.11 +82,Vallecas,307,40691.79,57401.47,460004.1,0.0885,0.1248,1.41 +146,Vaguada,384,52572.11,66427.6,453792.26,0.1159,0.1464,1.26 +74,La Red,149,20090,28795.52,453685.44,0.0443,0.0635,1.43 +86,Almeria,206,27675.26,41355.76,447008.24,0.0619,0.0925,1.49 +160,Aurgi Web,0,0,32.76,434152.84,0,0.0001, +76,Barbera,146,20540.91,32027.62,428700.38,0.0479,0.0747,1.56 +55,MT Pozuelo,148,29616.45,41182.26,428580,0.0691,0.0961,1.39 +63,San Fernando,212,40205.6,47217.16,427069.15,0.0941,0.1106,1.17 +171,Vallecas CRISTALES,1463,331148.6,333739.92,401405.53,0.825,0.8314,1.01 +187,Santa Engracia CRISTALES,1348,329681.23,331496.25,392774.08,0.8394,0.844,1.01 +125,Cornella,111,15571.48,21147.91,391400.35,0.0398,0.054,1.36 +126,Alcala Henares,72,10900.34,15705.3,380211.91,0.0287,0.0413,1.44 +7,Sant Cugat,58,7763.24,13564.45,378412.32,0.0205,0.0358,1.75 +169,MT El Bercial CRISTALES,1308,330748.83,332453.44,376719.85,0.878,0.8825,1.01 +72,Las Rozas,205,33158.64,47830.21,373018.48,0.0889,0.1282,1.44 +81,Granada,299,47903.35,54525.44,371155.24,0.1291,0.1469,1.14 +84,Cordoba,48,11288.3,17263.68,366709.5,0.0308,0.0471,1.53 +129,Valdemoro,133,17213.85,25731.54,354756.19,0.0485,0.0725,1.49 +131,San Juan,237,43924.29,50351.18,349943.56,0.1255,0.1439,1.15 +17,Granollers,114,15622.97,24005.78,345773.76,0.0452,0.0694,1.54 +127,Alcobendas,200,29518.42,40648.59,343632.11,0.0859,0.1183,1.38 +136,Emilio Muñoz,187,24739.45,34694.08,341627.1,0.0724,0.1016,1.4 +143,Majadahonda,192,31276.73,44971.82,340391.08,0.0919,0.1321,1.44 +15,Islazul,126,21984.03,29037.25,339479.77,0.0648,0.0855,1.32 +178,MT San Jose de Valderas CRISTALES,1161,281222.38,281715.46,318152.82,0.8839,0.8855,1 +179,Leganes CRISTALES,987,265504.51,266191.45,317917.47,0.8351,0.8373,1 +70,San Sebastian,172,25052.46,34852.71,316956.08,0.079,0.11,1.39 +85,Gta. Cadiz,165,21422.85,33067.75,314647.04,0.0681,0.1051,1.54 +4,Denia,51,8000.13,12828.23,306405.66,0.0261,0.0419,1.6 +153,Gava,106,14083.57,21989.08,306073.49,0.046,0.0718,1.56 +158,Roquetas,0,0,65.16,298977.66,0,0.0002, +177,Alcobendas CRISTALES,1051,269955.49,270601.04,298382.31,0.9047,0.9069,1 +148,Cornella 2,592,96134.21,100573.91,296797.99,0.3239,0.3389,1.05 +173,Las Rozas CRISTALES,888,245368.18,246898.16,292203.52,0.8397,0.845,1.01 +135,Sabadell,101,13238.18,17443.95,290542.96,0.0456,0.06,1.32 +172,Villalba CRISTALES,885,232394.1,232769.47,290040.42,0.8012,0.8025,1 +68,MT Cornella,536,103189.78,105522.57,289781.5,0.3561,0.3641,1.02 +176,Alcala Henares CRISTALES,873,246470.51,247304.4,289184.89,0.8523,0.8552,1 +47,MT Campo de las Naciones,211,39703.45,50583.64,287865.64,0.1379,0.1757,1.27 +128,Mostoles,133,21200.57,31128.67,287784.26,0.0737,0.1082,1.47 +157,AUR ALICANTE AV. NOVELDA,145,20770.08,31319.51,286873.34,0.0724,0.1092,1.51 +154,Torrevieja,36,4073.8,4560.73,278330.4,0.0146,0.0164,1.12 +170,San Fernando CRISTALES,908,227844.83,229641.99,275826.67,0.826,0.8326,1.01 +145,Fuengirola,123,17562.19,22214.43,264709.16,0.0663,0.0839,1.26 +12,Torremolinos,93,12503.16,20883.84,255659.79,0.0489,0.0817,1.67 +137,Avda. Toreros,191,24358.6,33144.91,252478.86,0.0965,0.1313,1.36 +2,Vall D'Uixo,7,951.37,1177.09,242236.49,0.0039,0.0049,1.24 +80,Sant Boi,86,14467.37,18441.03,241629.5,0.0599,0.0763,1.27 +5,Aluche,25,5264.01,7271.62,240940.88,0.0218,0.0302,1.38 +71,Pinto,78,11014.94,16229.78,237649.58,0.0463,0.0683,1.47 +62,MT Siete Palmas,8,1529.55,1529.55,227455.75,0.0067,0.0067,1 +196,San Sebastian CRISTALES,696,185155.98,185859.21,224569.04,0.8245,0.8276,1 +52,MT Compostela,52,9256.22,10811.55,206916.08,0.0447,0.0523,1.17 +151,Puerto de Santa Maria,37,5087.11,6051,206400.33,0.0246,0.0293,1.19 +183,Aurgi Asociados Gruas,0,0,0,205234.47,0,0, +152,Villanueva de la Serena,44,5433.46,7159.23,201920.97,0.0269,0.0355,1.32 +140,Marques Vadillo,112,13760.46,23911.84,198371.08,0.0694,0.1205,1.74 +3,Xativa,36,4944.67,8936.41,196945.1,0.0251,0.0454,1.81 +139,Olias del Rey,99,12674.41,16752.24,194246.83,0.0652,0.0862,1.32 +16,Zaragoza,70,12267.94,16538.83,193574.84,0.0634,0.0854,1.35 +175,MT Pozuelo CRISTALES,582,165660.74,165713.78,192385.99,0.8611,0.8614,1 +49,MT San Jose de Valderas,61,14991.76,19566.14,190501.93,0.0787,0.1027,1.31 +138,Arganda,46,8350.57,11300.86,189509.48,0.0441,0.0596,1.35 +10,Badajoz,77,9368.53,12066.14,182832.34,0.0512,0.066,1.29 +14,Huelva,138,15963.93,20659.18,181994.31,0.0877,0.1135,1.29 +87,Linares,83,9545.41,12120.64,180444.4,0.0529,0.0672,1.27 +9,Sant Celoni,31,5014.96,6555.14,179714.84,0.0279,0.0365,1.31 +39,MT Xanadu,46,8257.93,10728.95,174160.49,0.0474,0.0616,1.3 +65,MT Bahia de Malaga,230,54588.03,54898.26,173394.01,0.3148,0.3166,1.01 +44,MT Alcala de Henares,45,7898.49,11414.08,172249.29,0.0459,0.0663,1.45 +150,Alfafar,131,22094.69,28683.36,171669.07,0.1287,0.1671,1.3 +114,Rivas,77,11415.44,15251.13,167509.18,0.0681,0.091,1.34 +58,MT El Bercial,81,17010.34,23055.27,158228.81,0.1075,0.1457,1.36 +185,MT Avenida de Francia CRISTALES,434,130993.68,130993.68,157172.93,0.8334,0.8334,1 +69,MT Bahia de Santander,55,8303.33,10238.89,144137.82,0.0576,0.071,1.23 +182,MT Monasterio CRISTALES,380,112996.56,113678.99,135043.75,0.8367,0.8418,1.01 +186,Santa Engracia,66,9667.07,13594.88,130549.62,0.074,0.1041,1.41 +20,MT Castellana,65,8613.86,11728.55,128307.4,0.0671,0.0914,1.36 +56,MT Costa de Marbella,29,5393.21,6215.55,128083.53,0.0421,0.0485,1.15 +64,MT Bahia de Cadiz,17,2565.2,2822.03,126955.96,0.0202,0.0222,1.1 +195,Zaragoza CRISTALES,368,97169.88,98730.64,120766.79,0.8046,0.8175,1.02 +51,MT Gijon,1,110.99,110.99,118236.41,0.0009,0.0009,1 +155,Elche,54,8385.01,11009.52,111975.73,0.0749,0.0983,1.31 +11,Finestrat,68,7470.14,9966.23,111270.18,0.0671,0.0896,1.33 +199,Barbera CRISTALES,295,78373.14,78926.29,103207.81,0.7594,0.7647,1.01 +188,San Juan CRISTALES,291,79172.97,79686.13,100873.29,0.7849,0.79,1.01 +79,Mataro,24,3783.85,5451.63,98348.75,0.0385,0.0554,1.44 +57,MT Bahia de Algeciras,46,8659.07,9742.71,92987.24,0.0931,0.1048,1.13 +29,MT Ramon y Cajal,54,9549.58,9598.06,90904.79,0.1051,0.1056,1.01 +37,MT Tres de Mayo,16,2601.63,2714.24,90660.63,0.0287,0.0299,1.04 +34,MT Avenida de Francia,27,3381.63,4224.51,90103.94,0.0375,0.0469,1.25 +190,Store CRISTALES,244,59349.38,59581.83,83733.78,0.7088,0.7116,1 +32,MT San Juan de Aznalfarache,5,2141.5,3030.57,83374.16,0.0257,0.0363,1.42 +48,MT Ronda de Cordoba,2,72.48,72.48,77640.25,0.0009,0.0009,1 +41,MT Monasterio,32,5912.41,7227,77453.79,0.0763,0.0933,1.22 +18,MT Goya,28,5333.72,6082.91,76017.66,0.0702,0.08,1.14 +167,Autingo,0,0,0,75778.19,0,0, +193,MT Cornella CRISTALES,204,49304.4,49304.4,74662.85,0.6604,0.6604,1 +40,MT Ctra de Madrid-Irun km. 236,13,2347.9,2575.04,73744.33,0.0318,0.0349,1.1 +26,MT Malaga,44,4864.2,5052.17,71516.57,0.068,0.0706,1.04 +43,MT Gran Casa,48,7443.89,8108.43,70587.48,0.1055,0.1149,1.09 +59,MT Ciudad de Elche,18,2413.82,3232.7,69880.96,0.0345,0.0463,1.34 +27,MT Nuevo Centro,38,7164.94,7578.46,68997.21,0.1038,0.1098,1.06 +197,MT Ramon y Cajal CRISTALES,199,62096.18,62157.08,67476.67,0.9203,0.9212,1 +156,MT Costa Mijas,4,556.5,852.39,65321.85,0.0085,0.013,1.53 +60,MT Jaen,124,37246.93,37246.93,64164.78,0.5805,0.5805,1 +200,Unidad Movil Madrid Glass,191,39717.04,39777.94,56923.41,0.6977,0.6988,1 +31,MT Alexandre Rosello,101,35027.15,35411.35,53680.12,0.6525,0.6597,1.01 +36,MT Conquistadores,4,618.56,618.56,52295.77,0.0118,0.0118,1 +38,MT Jerez,15,1827.28,1827.28,52093.94,0.0351,0.0351,1 +46,MT Puerto Venecia,21,3805.56,5082.72,51536.81,0.0738,0.0986,1.34 +33,MT El Corte Ingles Cartagena,11,2309.83,3308.05,51368.02,0.045,0.0644,1.43 +206,Arganda CRISTALES,172,47691.39,47691.39,47874.09,0.9962,0.9962,1 +23,MT Avenida de la Libertad,12,2541.59,2749.56,45596.45,0.0557,0.0603,1.08 +28,MT Nervion,29,3469.91,3504.9,41910.86,0.0828,0.0836,1.01 +66,MT Paseo de Morella,12,2767.14,4367.52,40230.44,0.0688,0.1086,1.58 +181,Huelva CRISTALES,90,29242.65,29242.65,37407.34,0.7817,0.7817,1 +198,MT Compostela CRISTALES,87,28174.23,28174.23,36717.66,0.7673,0.7673,1 +204,Implant Centauro Alicante,337,34975.59,34975.59,35324.21,0.9901,0.9901,1 +194,MT Maria Auxiliadora CRISTALES,103,27493.09,27875.74,33957.08,0.8096,0.8209,1.01 +61,MT Avenida de España,0,0,0,32895.15,0,0, +30,MT Alicante,12,2753.03,2949.78,32304.57,0.0852,0.0913,1.07 +25,MT Vigo,11,3193.17,4321.84,32198.1,0.0992,0.1342,1.35 +180,Puerto de Santa Maria CRISTALES,96,26934.72,27009.61,31691.8,0.8499,0.8523,1 +53,MT Maria Auxiliadora,3,502.88,623.86,30068.91,0.0167,0.0207,1.24 +202,Cordoba CRISTALES,76,17913.72,17913.72,29649.87,0.6042,0.6042,1 +67,MT Talavera de la Reina,5,281.85,281.85,28310.59,0.01,0.01,1 +203,San Fernando MOVIL,354,20543.85,20631.01,21780.37,0.9432,0.9472,1 +192,MT Ctra de Madrid-Irun km. 236 CRISTALES,63,18083.01,18083.01,21574.22,0.8382,0.8382,1 +161,MT Web,0,0,0,7576.48,0,0, +184,Aurgi Asociados,0,0,0,620,0,0, diff --git a/data/results/02_kpi_3_por_centro.json b/data/results/02_kpi_3_por_centro.json new file mode 100644 index 0000000..fd0de98 --- /dev/null +++ b/data/results/02_kpi_3_por_centro.json @@ -0,0 +1,1544 @@ +{ + "cols": [ + "center_id", + "center_name", + "quotes_cc_facturados", + "A_quote_cc_eur", + "B_mismo_cliente_eur", + "C_total_centro_eur", + "A_sobre_C", + "B_sobre_C", + "lift_B_vs_A" + ], + "rows": [ + [ + 144, + "Velez Malaga", + 158, + 21890.28, + 37700.63, + 653333.86, + 0.0335, + 0.0577, + 1.72 + ], + [ + 75, + "Store", + 607, + 150402.5, + 167424.36, + 644637.94, + 0.2333, + 0.2597, + 1.11 + ], + [ + 54, + "Leganes", + 516, + 62620.06, + 87800.04, + 637007.16, + 0.0983, + 0.1378, + 1.4 + ], + [ + 121, + "Villalba", + 316, + 41725.46, + 57526.94, + 524985.02, + 0.0795, + 0.1096, + 1.38 + ], + [ + 168, + "Goya GLASS", + 1773, + 414629.07, + 418220.06, + 497398.12, + 0.8336, + 0.8408, + 1.01 + ], + [ + 73, + "Malaga", + 379, + 64408.08, + 77124.76, + 489986.85, + 0.1314, + 0.1574, + 1.2 + ], + [ + 130, + "Alcorcon", + 210, + 29467.17, + 42686.28, + 487245.3, + 0.0605, + 0.0876, + 1.45 + ], + [ + 35, + "MT Sanchinarro", + 480, + 78658.96, + 87172.31, + 487013.5, + 0.1615, + 0.179, + 1.11 + ], + [ + 82, + "Vallecas", + 307, + 40691.79, + 57401.47, + 460004.1, + 0.0885, + 0.1248, + 1.41 + ], + [ + 146, + "Vaguada", + 384, + 52572.11, + 66427.6, + 453792.26, + 0.1159, + 0.1464, + 1.26 + ], + [ + 74, + "La Red", + 149, + 20090, + 28795.52, + 453685.44, + 0.0443, + 0.0635, + 1.43 + ], + [ + 86, + "Almeria", + 206, + 27675.26, + 41355.76, + 447008.24, + 0.0619, + 0.0925, + 1.49 + ], + [ + 160, + "Aurgi Web", + 0, + 0, + 32.76, + 434152.84, + 0, + 0.0001, + null + ], + [ + 76, + "Barbera", + 146, + 20540.91, + 32027.62, + 428700.38, + 0.0479, + 0.0747, + 1.56 + ], + [ + 55, + "MT Pozuelo", + 148, + 29616.45, + 41182.26, + 428580, + 0.0691, + 0.0961, + 1.39 + ], + [ + 63, + "San Fernando", + 212, + 40205.6, + 47217.16, + 427069.15, + 0.0941, + 0.1106, + 1.17 + ], + [ + 171, + "Vallecas CRISTALES", + 1463, + 331148.6, + 333739.92, + 401405.53, + 0.825, + 0.8314, + 1.01 + ], + [ + 187, + "Santa Engracia CRISTALES", + 1348, + 329681.23, + 331496.25, + 392774.08, + 0.8394, + 0.844, + 1.01 + ], + [ + 125, + "Cornella", + 111, + 15571.48, + 21147.91, + 391400.35, + 0.0398, + 0.054, + 1.36 + ], + [ + 126, + "Alcala Henares", + 72, + 10900.34, + 15705.3, + 380211.91, + 0.0287, + 0.0413, + 1.44 + ], + [ + 7, + "Sant Cugat", + 58, + 7763.24, + 13564.45, + 378412.32, + 0.0205, + 0.0358, + 1.75 + ], + [ + 169, + "MT El Bercial CRISTALES", + 1308, + 330748.83, + 332453.44, + 376719.85, + 0.878, + 0.8825, + 1.01 + ], + [ + 72, + "Las Rozas", + 205, + 33158.64, + 47830.21, + 373018.48, + 0.0889, + 0.1282, + 1.44 + ], + [ + 81, + "Granada", + 299, + 47903.35, + 54525.44, + 371155.24, + 0.1291, + 0.1469, + 1.14 + ], + [ + 84, + "Cordoba", + 48, + 11288.3, + 17263.68, + 366709.5, + 0.0308, + 0.0471, + 1.53 + ], + [ + 129, + "Valdemoro", + 133, + 17213.85, + 25731.54, + 354756.19, + 0.0485, + 0.0725, + 1.49 + ], + [ + 131, + "San Juan", + 237, + 43924.29, + 50351.18, + 349943.56, + 0.1255, + 0.1439, + 1.15 + ], + [ + 17, + "Granollers", + 114, + 15622.97, + 24005.78, + 345773.76, + 0.0452, + 0.0694, + 1.54 + ], + [ + 127, + "Alcobendas", + 200, + 29518.42, + 40648.59, + 343632.11, + 0.0859, + 0.1183, + 1.38 + ], + [ + 136, + "Emilio Mu\u00f1oz", + 187, + 24739.45, + 34694.08, + 341627.1, + 0.0724, + 0.1016, + 1.4 + ], + [ + 143, + "Majadahonda", + 192, + 31276.73, + 44971.82, + 340391.08, + 0.0919, + 0.1321, + 1.44 + ], + [ + 15, + "Islazul", + 126, + 21984.03, + 29037.25, + 339479.77, + 0.0648, + 0.0855, + 1.32 + ], + [ + 178, + "MT San Jose de Valderas CRISTALES", + 1161, + 281222.38, + 281715.46, + 318152.82, + 0.8839, + 0.8855, + 1 + ], + [ + 179, + "Leganes CRISTALES", + 987, + 265504.51, + 266191.45, + 317917.47, + 0.8351, + 0.8373, + 1 + ], + [ + 70, + "San Sebastian", + 172, + 25052.46, + 34852.71, + 316956.08, + 0.079, + 0.11, + 1.39 + ], + [ + 85, + "Gta. Cadiz", + 165, + 21422.85, + 33067.75, + 314647.04, + 0.0681, + 0.1051, + 1.54 + ], + [ + 4, + "Denia", + 51, + 8000.13, + 12828.23, + 306405.66, + 0.0261, + 0.0419, + 1.6 + ], + [ + 153, + "Gava", + 106, + 14083.57, + 21989.08, + 306073.49, + 0.046, + 0.0718, + 1.56 + ], + [ + 158, + "Roquetas", + 0, + 0, + 65.16, + 298977.66, + 0, + 0.0002, + null + ], + [ + 177, + "Alcobendas CRISTALES", + 1051, + 269955.49, + 270601.04, + 298382.31, + 0.9047, + 0.9069, + 1 + ], + [ + 148, + "Cornella 2", + 592, + 96134.21, + 100573.91, + 296797.99, + 0.3239, + 0.3389, + 1.05 + ], + [ + 173, + "Las Rozas CRISTALES", + 888, + 245368.18, + 246898.16, + 292203.52, + 0.8397, + 0.845, + 1.01 + ], + [ + 135, + "Sabadell", + 101, + 13238.18, + 17443.95, + 290542.96, + 0.0456, + 0.06, + 1.32 + ], + [ + 172, + "Villalba CRISTALES", + 885, + 232394.1, + 232769.47, + 290040.42, + 0.8012, + 0.8025, + 1 + ], + [ + 68, + "MT Cornella", + 536, + 103189.78, + 105522.57, + 289781.5, + 0.3561, + 0.3641, + 1.02 + ], + [ + 176, + "Alcala Henares CRISTALES", + 873, + 246470.51, + 247304.4, + 289184.89, + 0.8523, + 0.8552, + 1 + ], + [ + 47, + "MT Campo de las Naciones", + 211, + 39703.45, + 50583.64, + 287865.64, + 0.1379, + 0.1757, + 1.27 + ], + [ + 128, + "Mostoles", + 133, + 21200.57, + 31128.67, + 287784.26, + 0.0737, + 0.1082, + 1.47 + ], + [ + 157, + "AUR ALICANTE AV. NOVELDA", + 145, + 20770.08, + 31319.51, + 286873.34, + 0.0724, + 0.1092, + 1.51 + ], + [ + 154, + "Torrevieja", + 36, + 4073.8, + 4560.73, + 278330.4, + 0.0146, + 0.0164, + 1.12 + ], + [ + 170, + "San Fernando CRISTALES", + 908, + 227844.83, + 229641.99, + 275826.67, + 0.826, + 0.8326, + 1.01 + ], + [ + 145, + "Fuengirola", + 123, + 17562.19, + 22214.43, + 264709.16, + 0.0663, + 0.0839, + 1.26 + ], + [ + 12, + "Torremolinos", + 93, + 12503.16, + 20883.84, + 255659.79, + 0.0489, + 0.0817, + 1.67 + ], + [ + 137, + "Avda. Toreros", + 191, + 24358.6, + 33144.91, + 252478.86, + 0.0965, + 0.1313, + 1.36 + ], + [ + 2, + "Vall D'Uixo", + 7, + 951.37, + 1177.09, + 242236.49, + 0.0039, + 0.0049, + 1.24 + ], + [ + 80, + "Sant Boi", + 86, + 14467.37, + 18441.03, + 241629.5, + 0.0599, + 0.0763, + 1.27 + ], + [ + 5, + "Aluche", + 25, + 5264.01, + 7271.62, + 240940.88, + 0.0218, + 0.0302, + 1.38 + ], + [ + 71, + "Pinto", + 78, + 11014.94, + 16229.78, + 237649.58, + 0.0463, + 0.0683, + 1.47 + ], + [ + 62, + "MT Siete Palmas", + 8, + 1529.55, + 1529.55, + 227455.75, + 0.0067, + 0.0067, + 1 + ], + [ + 196, + "San Sebastian CRISTALES", + 696, + 185155.98, + 185859.21, + 224569.04, + 0.8245, + 0.8276, + 1 + ], + [ + 52, + "MT Compostela", + 52, + 9256.22, + 10811.55, + 206916.08, + 0.0447, + 0.0523, + 1.17 + ], + [ + 151, + "Puerto de Santa Maria", + 37, + 5087.11, + 6051, + 206400.33, + 0.0246, + 0.0293, + 1.19 + ], + [ + 183, + "Aurgi Asociados Gruas", + 0, + 0, + 0, + 205234.47, + 0, + 0, + null + ], + [ + 152, + "Villanueva de la Serena", + 44, + 5433.46, + 7159.23, + 201920.97, + 0.0269, + 0.0355, + 1.32 + ], + [ + 140, + "Marques Vadillo", + 112, + 13760.46, + 23911.84, + 198371.08, + 0.0694, + 0.1205, + 1.74 + ], + [ + 3, + "Xativa", + 36, + 4944.67, + 8936.41, + 196945.1, + 0.0251, + 0.0454, + 1.81 + ], + [ + 139, + "Olias del Rey", + 99, + 12674.41, + 16752.24, + 194246.83, + 0.0652, + 0.0862, + 1.32 + ], + [ + 16, + "Zaragoza", + 70, + 12267.94, + 16538.83, + 193574.84, + 0.0634, + 0.0854, + 1.35 + ], + [ + 175, + "MT Pozuelo CRISTALES", + 582, + 165660.74, + 165713.78, + 192385.99, + 0.8611, + 0.8614, + 1 + ], + [ + 49, + "MT San Jose de Valderas", + 61, + 14991.76, + 19566.14, + 190501.93, + 0.0787, + 0.1027, + 1.31 + ], + [ + 138, + "Arganda", + 46, + 8350.57, + 11300.86, + 189509.48, + 0.0441, + 0.0596, + 1.35 + ], + [ + 10, + "Badajoz", + 77, + 9368.53, + 12066.14, + 182832.34, + 0.0512, + 0.066, + 1.29 + ], + [ + 14, + "Huelva", + 138, + 15963.93, + 20659.18, + 181994.31, + 0.0877, + 0.1135, + 1.29 + ], + [ + 87, + "Linares", + 83, + 9545.41, + 12120.64, + 180444.4, + 0.0529, + 0.0672, + 1.27 + ], + [ + 9, + "Sant Celoni", + 31, + 5014.96, + 6555.14, + 179714.84, + 0.0279, + 0.0365, + 1.31 + ], + [ + 39, + "MT Xanadu", + 46, + 8257.93, + 10728.95, + 174160.49, + 0.0474, + 0.0616, + 1.3 + ], + [ + 65, + "MT Bahia de Malaga", + 230, + 54588.03, + 54898.26, + 173394.01, + 0.3148, + 0.3166, + 1.01 + ], + [ + 44, + "MT Alcala de Henares", + 45, + 7898.49, + 11414.08, + 172249.29, + 0.0459, + 0.0663, + 1.45 + ], + [ + 150, + "Alfafar", + 131, + 22094.69, + 28683.36, + 171669.07, + 0.1287, + 0.1671, + 1.3 + ], + [ + 114, + "Rivas", + 77, + 11415.44, + 15251.13, + 167509.18, + 0.0681, + 0.091, + 1.34 + ], + [ + 58, + "MT El Bercial", + 81, + 17010.34, + 23055.27, + 158228.81, + 0.1075, + 0.1457, + 1.36 + ], + [ + 185, + "MT Avenida de Francia CRISTALES", + 434, + 130993.68, + 130993.68, + 157172.93, + 0.8334, + 0.8334, + 1 + ], + [ + 69, + "MT Bahia de Santander", + 55, + 8303.33, + 10238.89, + 144137.82, + 0.0576, + 0.071, + 1.23 + ], + [ + 182, + "MT Monasterio CRISTALES", + 380, + 112996.56, + 113678.99, + 135043.75, + 0.8367, + 0.8418, + 1.01 + ], + [ + 186, + "Santa Engracia", + 66, + 9667.07, + 13594.88, + 130549.62, + 0.074, + 0.1041, + 1.41 + ], + [ + 20, + "MT Castellana", + 65, + 8613.86, + 11728.55, + 128307.4, + 0.0671, + 0.0914, + 1.36 + ], + [ + 56, + "MT Costa de Marbella", + 29, + 5393.21, + 6215.55, + 128083.53, + 0.0421, + 0.0485, + 1.15 + ], + [ + 64, + "MT Bahia de Cadiz", + 17, + 2565.2, + 2822.03, + 126955.96, + 0.0202, + 0.0222, + 1.1 + ], + [ + 195, + "Zaragoza CRISTALES", + 368, + 97169.88, + 98730.64, + 120766.79, + 0.8046, + 0.8175, + 1.02 + ], + [ + 51, + "MT Gijon", + 1, + 110.99, + 110.99, + 118236.41, + 0.0009, + 0.0009, + 1 + ], + [ + 155, + "Elche", + 54, + 8385.01, + 11009.52, + 111975.73, + 0.0749, + 0.0983, + 1.31 + ], + [ + 11, + "Finestrat", + 68, + 7470.14, + 9966.23, + 111270.18, + 0.0671, + 0.0896, + 1.33 + ], + [ + 199, + "Barbera CRISTALES", + 295, + 78373.14, + 78926.29, + 103207.81, + 0.7594, + 0.7647, + 1.01 + ], + [ + 188, + "San Juan CRISTALES", + 291, + 79172.97, + 79686.13, + 100873.29, + 0.7849, + 0.79, + 1.01 + ], + [ + 79, + "Mataro", + 24, + 3783.85, + 5451.63, + 98348.75, + 0.0385, + 0.0554, + 1.44 + ], + [ + 57, + "MT Bahia de Algeciras", + 46, + 8659.07, + 9742.71, + 92987.24, + 0.0931, + 0.1048, + 1.13 + ], + [ + 29, + "MT Ramon y Cajal", + 54, + 9549.58, + 9598.06, + 90904.79, + 0.1051, + 0.1056, + 1.01 + ], + [ + 37, + "MT Tres de Mayo", + 16, + 2601.63, + 2714.24, + 90660.63, + 0.0287, + 0.0299, + 1.04 + ], + [ + 34, + "MT Avenida de Francia", + 27, + 3381.63, + 4224.51, + 90103.94, + 0.0375, + 0.0469, + 1.25 + ], + [ + 190, + "Store CRISTALES", + 244, + 59349.38, + 59581.83, + 83733.78, + 0.7088, + 0.7116, + 1 + ], + [ + 32, + "MT San Juan de Aznalfarache", + 5, + 2141.5, + 3030.57, + 83374.16, + 0.0257, + 0.0363, + 1.42 + ], + [ + 48, + "MT Ronda de Cordoba", + 2, + 72.48, + 72.48, + 77640.25, + 0.0009, + 0.0009, + 1 + ], + [ + 41, + "MT Monasterio", + 32, + 5912.41, + 7227, + 77453.79, + 0.0763, + 0.0933, + 1.22 + ], + [ + 18, + "MT Goya", + 28, + 5333.72, + 6082.91, + 76017.66, + 0.0702, + 0.08, + 1.14 + ], + [ + 167, + "Autingo", + 0, + 0, + 0, + 75778.19, + 0, + 0, + null + ], + [ + 193, + "MT Cornella CRISTALES", + 204, + 49304.4, + 49304.4, + 74662.85, + 0.6604, + 0.6604, + 1 + ], + [ + 40, + "MT Ctra de Madrid-Irun km. 236", + 13, + 2347.9, + 2575.04, + 73744.33, + 0.0318, + 0.0349, + 1.1 + ], + [ + 26, + "MT Malaga", + 44, + 4864.2, + 5052.17, + 71516.57, + 0.068, + 0.0706, + 1.04 + ], + [ + 43, + "MT Gran Casa", + 48, + 7443.89, + 8108.43, + 70587.48, + 0.1055, + 0.1149, + 1.09 + ], + [ + 59, + "MT Ciudad de Elche", + 18, + 2413.82, + 3232.7, + 69880.96, + 0.0345, + 0.0463, + 1.34 + ], + [ + 27, + "MT Nuevo Centro", + 38, + 7164.94, + 7578.46, + 68997.21, + 0.1038, + 0.1098, + 1.06 + ], + [ + 197, + "MT Ramon y Cajal CRISTALES", + 199, + 62096.18, + 62157.08, + 67476.67, + 0.9203, + 0.9212, + 1 + ], + [ + 156, + "MT Costa Mijas", + 4, + 556.5, + 852.39, + 65321.85, + 0.0085, + 0.013, + 1.53 + ], + [ + 60, + "MT Jaen", + 124, + 37246.93, + 37246.93, + 64164.78, + 0.5805, + 0.5805, + 1 + ], + [ + 200, + "Unidad Movil Madrid Glass", + 191, + 39717.04, + 39777.94, + 56923.41, + 0.6977, + 0.6988, + 1 + ], + [ + 31, + "MT Alexandre Rosello", + 101, + 35027.15, + 35411.35, + 53680.12, + 0.6525, + 0.6597, + 1.01 + ], + [ + 36, + "MT Conquistadores", + 4, + 618.56, + 618.56, + 52295.77, + 0.0118, + 0.0118, + 1 + ], + [ + 38, + "MT Jerez", + 15, + 1827.28, + 1827.28, + 52093.94, + 0.0351, + 0.0351, + 1 + ], + [ + 46, + "MT Puerto Venecia", + 21, + 3805.56, + 5082.72, + 51536.81, + 0.0738, + 0.0986, + 1.34 + ], + [ + 33, + "MT El Corte Ingles Cartagena", + 11, + 2309.83, + 3308.05, + 51368.02, + 0.045, + 0.0644, + 1.43 + ], + [ + 206, + "Arganda CRISTALES", + 172, + 47691.39, + 47691.39, + 47874.09, + 0.9962, + 0.9962, + 1 + ], + [ + 23, + "MT Avenida de la Libertad", + 12, + 2541.59, + 2749.56, + 45596.45, + 0.0557, + 0.0603, + 1.08 + ], + [ + 28, + "MT Nervion", + 29, + 3469.91, + 3504.9, + 41910.86, + 0.0828, + 0.0836, + 1.01 + ], + [ + 66, + "MT Paseo de Morella", + 12, + 2767.14, + 4367.52, + 40230.44, + 0.0688, + 0.1086, + 1.58 + ], + [ + 181, + "Huelva CRISTALES", + 90, + 29242.65, + 29242.65, + 37407.34, + 0.7817, + 0.7817, + 1 + ], + [ + 198, + "MT Compostela CRISTALES", + 87, + 28174.23, + 28174.23, + 36717.66, + 0.7673, + 0.7673, + 1 + ], + [ + 204, + "Implant Centauro Alicante", + 337, + 34975.59, + 34975.59, + 35324.21, + 0.9901, + 0.9901, + 1 + ], + [ + 194, + "MT Maria Auxiliadora CRISTALES", + 103, + 27493.09, + 27875.74, + 33957.08, + 0.8096, + 0.8209, + 1.01 + ], + [ + 61, + "MT Avenida de Espa\u00f1a", + 0, + 0, + 0, + 32895.15, + 0, + 0, + null + ], + [ + 30, + "MT Alicante", + 12, + 2753.03, + 2949.78, + 32304.57, + 0.0852, + 0.0913, + 1.07 + ], + [ + 25, + "MT Vigo", + 11, + 3193.17, + 4321.84, + 32198.1, + 0.0992, + 0.1342, + 1.35 + ], + [ + 180, + "Puerto de Santa Maria CRISTALES", + 96, + 26934.72, + 27009.61, + 31691.8, + 0.8499, + 0.8523, + 1 + ], + [ + 53, + "MT Maria Auxiliadora", + 3, + 502.88, + 623.86, + 30068.91, + 0.0167, + 0.0207, + 1.24 + ], + [ + 202, + "Cordoba CRISTALES", + 76, + 17913.72, + 17913.72, + 29649.87, + 0.6042, + 0.6042, + 1 + ], + [ + 67, + "MT Talavera de la Reina", + 5, + 281.85, + 281.85, + 28310.59, + 0.01, + 0.01, + 1 + ], + [ + 203, + "San Fernando MOVIL", + 354, + 20543.85, + 20631.01, + 21780.37, + 0.9432, + 0.9472, + 1 + ], + [ + 192, + "MT Ctra de Madrid-Irun km. 236 CRISTALES", + 63, + 18083.01, + 18083.01, + 21574.22, + 0.8382, + 0.8382, + 1 + ], + [ + 161, + "MT Web", + 0, + 0, + 0, + 7576.48, + 0, + 0, + null + ], + [ + 184, + "Aurgi Asociados", + 0, + 0, + 0, + 620, + 0, + 0, + null + ] + ] +} \ No newline at end of file diff --git a/data/results/03_regen_por_centro.csv b/data/results/03_regen_por_centro.csv new file mode 100644 index 0000000..853df98 --- /dev/null +++ b/data/results/03_regen_por_centro.csv @@ -0,0 +1,31 @@ +center_id,center_name,q0_regenerados_aqui,regen_events,dias_avg_regen +146,Vaguada,594,1371,4.9 +54,Leganes,575,1246,5.7 +75,Store,530,1167,8.1 +35,MT Sanchinarro,508,1273,5.6 +168,Goya GLASS,461,519,7.3 +82,Vallecas,427,895,5.6 +81,Granada,419,782,5.6 +55,MT Pozuelo,410,1097,5.3 +73,Malaga,397,833,5.0 +121,Villalba,396,927,5.2 +68,MT Cornella,376,714,14.1 +130,Alcorcon,349,744,3.0 +74,La Red,346,852,6.1 +86,Almeria,327,735,3.6 +148,Cornella 2,327,495,18.8 +131,San Juan,326,731,5.7 +63,San Fernando,325,668,3.6 +143,Majadahonda,324,722,4.2 +70,San Sebastian,324,901,2.9 +72,Las Rozas,320,678,4.4 +127,Alcobendas,306,765,3.8 +47,MT Campo de las Naciones,303,730,4.9 +85,Gta. Cadiz,288,667,4.6 +136,Emilio Muñoz,282,589,4.5 +144,Velez Malaga,280,583,5.0 +137,Avda. Toreros,277,571,4.3 +76,Barbera,257,786,3.8 +58,MT El Bercial,236,564,3.5 +15,Islazul,234,506,4.3 +187,Santa Engracia CRISTALES,230,269,7.4 diff --git a/data/results/03_regen_por_centro.json b/data/results/03_regen_por_centro.json new file mode 100644 index 0000000..7ff6ab5 --- /dev/null +++ b/data/results/03_regen_por_centro.json @@ -0,0 +1,221 @@ +{ + "cols": [ + "center_id", + "center_name", + "q0_regenerados_aqui", + "regen_events", + "dias_avg_regen" + ], + "rows": [ + [ + 146, + "Vaguada", + 594, + 1371, + 4.9 + ], + [ + 54, + "Leganes", + 575, + 1246, + 5.7 + ], + [ + 75, + "Store", + 530, + 1167, + 8.1 + ], + [ + 35, + "MT Sanchinarro", + 508, + 1273, + 5.6 + ], + [ + 168, + "Goya GLASS", + 461, + 519, + 7.3 + ], + [ + 82, + "Vallecas", + 427, + 895, + 5.6 + ], + [ + 81, + "Granada", + 419, + 782, + 5.6 + ], + [ + 55, + "MT Pozuelo", + 410, + 1097, + 5.3 + ], + [ + 73, + "Malaga", + 397, + 833, + 5.0 + ], + [ + 121, + "Villalba", + 396, + 927, + 5.2 + ], + [ + 68, + "MT Cornella", + 376, + 714, + 14.1 + ], + [ + 130, + "Alcorcon", + 349, + 744, + 3.0 + ], + [ + 74, + "La Red", + 346, + 852, + 6.1 + ], + [ + 86, + "Almeria", + 327, + 735, + 3.6 + ], + [ + 148, + "Cornella 2", + 327, + 495, + 18.8 + ], + [ + 131, + "San Juan", + 326, + 731, + 5.7 + ], + [ + 63, + "San Fernando", + 325, + 668, + 3.6 + ], + [ + 143, + "Majadahonda", + 324, + 722, + 4.2 + ], + [ + 70, + "San Sebastian", + 324, + 901, + 2.9 + ], + [ + 72, + "Las Rozas", + 320, + 678, + 4.4 + ], + [ + 127, + "Alcobendas", + 306, + 765, + 3.8 + ], + [ + 47, + "MT Campo de las Naciones", + 303, + 730, + 4.9 + ], + [ + 85, + "Gta. Cadiz", + 288, + 667, + 4.6 + ], + [ + 136, + "Emilio Mu\u00f1oz", + 282, + 589, + 4.5 + ], + [ + 144, + "Velez Malaga", + 280, + 583, + 5.0 + ], + [ + 137, + "Avda. Toreros", + 277, + 571, + 4.3 + ], + [ + 76, + "Barbera", + 257, + 786, + 3.8 + ], + [ + 58, + "MT El Bercial", + 236, + 564, + 3.5 + ], + [ + 15, + "Islazul", + 234, + 506, + 4.3 + ], + [ + 187, + "Santa Engracia CRISTALES", + 230, + 269, + 7.4 + ] + ] +} \ No newline at end of file diff --git a/data/results/04_regen_vs_conversion.csv b/data/results/04_regen_vs_conversion.csv new file mode 100644 index 0000000..ca9d088 --- /dev/null +++ b/data/results/04_regen_vs_conversion.csv @@ -0,0 +1,3 @@ +bucket,q0_total,q0_facturado_propio,conv_q0_propio +no_regenerado,35507,22390,0.6306 +regenerado,18488,7158,0.3872 diff --git a/data/results/04_regen_vs_conversion.json b/data/results/04_regen_vs_conversion.json new file mode 100644 index 0000000..4267061 --- /dev/null +++ b/data/results/04_regen_vs_conversion.json @@ -0,0 +1,22 @@ +{ + "cols": [ + "bucket", + "q0_total", + "q0_facturado_propio", + "conv_q0_propio" + ], + "rows": [ + [ + "no_regenerado", + 35507, + 22390, + 0.6306 + ], + [ + "regenerado", + 18488, + 7158, + 0.3872 + ] + ] +} \ No newline at end of file diff --git a/data/results/totales_globales.json b/data/results/totales_globales.json new file mode 100644 index 0000000..a9e6173 --- /dev/null +++ b/data/results/totales_globales.json @@ -0,0 +1,10 @@ +{ + "window_days": 90, + "A_quote_cc_eur": 6392965.08, + "B_mismo_cliente_eur": 6923203.81, + "C_total_centros_eur": 29635811.36, + "A_sobre_C": 0.2157, + "B_sobre_C": 0.2336, + "lift_B_vs_A": 1.08, + "centros_activos": 139 +} \ No newline at end of file diff --git a/fix_cards.py b/fix_cards.py new file mode 100644 index 0000000..bcbc58d --- /dev/null +++ b/fix_cards.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""Remove project prefix `autingo-159109.` from cards 10221-10229. + +Reason: Metabase field-filter substitution emits `psql_dcpublic..` (no project). +BigQuery rejects since the rest of the SQL uses `autingo-159109.psql_dcpublic.
`. +Mixed qualifiers in same query break. +""" +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=120) + +for cid in range(10221, 10230): + card = client.get(f"/api/card/{cid}").json() + dq = card["dataset_query"] + # MBQL5 stages format: dq["stages"][0]["native"] is the string, "template-tags" lives at stage level + stage = dq["stages"][0] + sql = stage["native"] + new_sql = sql.replace("`autingo-159109.psql_dcpublic.", "`psql_dcpublic.") + if new_sql == sql: + print(f" {cid}: no change") + continue + # Rewrite as legacy native query (Metabase writes legacy on PUT) + new_dq = { + "type": "native", + "database": dq.get("database", 6), + "native": { + "query": new_sql, + "template-tags": stage.get("template-tags", {}), + }, + } + r = client.put(f"/api/card/{cid}", json={"dataset_query": new_dq}) + r.raise_for_status() + print(f" {cid}: updated") + +client.close() +print("done") diff --git a/flip_b_to_union.py b/flip_b_to_union.py new file mode 100644 index 0000000..a9fe8d1 --- /dev/null +++ b/flip_b_to_union.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +"""B = (A) UNION (regenerados): vuelve la union al SQL de cards B. + +Mantiene los field-filters por NAME (multi-select dropdown) ya aplicados en rewire_filters_by_name. +""" +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +DB_ID = 6 + +F_QUOTE_CREATED_AT = 16588 +F_CENTER_NAME = 17330 +F_TPVUSER_NAME = 17958 +F_COMPANY_NAME = 17158 +F_PRODUCT_DESC = 16795 + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=180) + + +def field_filter_tag(name, field_id, widget, display_name): + return { + "id": name + "-tag", + "name": name, + "display-name": display_name, + "type": "dimension", + "dimension": ["field", field_id, None], + "widget-type": widget, + "default": None, + } + + +TAGS_AB = { + "date": field_filter_tag("date", F_QUOTE_CREATED_AT, "date/range", "Fecha presupuesto"), + "centro": field_filter_tag("centro", F_CENTER_NAME, "string/=", "Centro"), + "agente": field_filter_tag("agente", F_TPVUSER_NAME, "string/=", "Agente CC"), + "compania": field_filter_tag("compania", F_COMPANY_NAME, "string/=", "Compañía"), + "producto": field_filter_tag("producto", F_PRODUCT_DESC, "string/contains", "Producto"), +} + + +SQL_B = """ +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +quotes_q1 AS (SELECT id, order_id, created_at, deleted_at FROM `psql_dcpublic.tpv_orders_quote`), +orders_q1 AS (SELECT id, customer_id, vehicle_id, terminal_id FROM `psql_dcpublic.tpv_orders_order`), +terminals_q1 AS (SELECT id, center_id FROM `psql_dcpublic.tpv_terminals`), +cc_anchored AS ( + SELECT + `psql_dcpublic.tpv_orders_quote`.id AS q0_id, + `psql_dcpublic.tpv_orders_quote`.order_id AS q0_order, + `psql_dcpublic.tpv_orders_quote`.created_at AS q0_ts, + `psql_dcpublic.tpv_orders_quote`.created_by_id AS cc_agent_id, + `psql_dcpublic.tpv_orders_order`.customer_id AS cust_id, + `psql_dcpublic.tpv_orders_order`.vehicle_id AS veh_id + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + [[AND {{date}}]] + [[AND {{agente}}]] +), +b_orders AS ( + -- A: orders directos del Q-CC + SELECT q0_order AS order_id FROM cc_anchored + UNION DISTINCT + -- Regenerados: Q1 dentro 60d desde Q0-CC, distinto order, centro NO-CC, mismo cliente+vehiculo + SELECT q1.order_id AS order_id + FROM cc_anchored a + JOIN quotes_q1 q1 + ON q1.deleted_at IS NULL + AND q1.created_at > a.q0_ts + AND q1.created_at <= TIMESTAMP_ADD(a.q0_ts, INTERVAL 60 DAY) + AND q1.order_id != a.q0_order + JOIN orders_q1 o1 ON q1.order_id = o1.id + LEFT JOIN terminals_q1 t1 ON o1.terminal_id = t1.id + WHERE o1.customer_id = a.cust_id + AND o1.vehicle_id = a.veh_id + AND t1.center_id IS NOT NULL + AND t1.center_id NOT IN (159, 162) +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM b_orders + JOIN `psql_dcpublic.tpv_orders_order` ON b_orders.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.products` ON `psql_dcpublic.tpv_orders_orderitem`.product_id = `psql_dcpublic.products`.id + WHERE COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +AGG = { + "total": "ROUND(SUM(total_cost), 2)", + "count": "COUNT(*)", + "ticket": "ROUND(SAFE_DIVIDE(SUM(total_cost), NULLIF(COUNT(*), 0)), 2)", +} + +CARDS = { + 10251: ("total", "B · Presupuestos CallC + Regenerados — Total facturado"), + 10252: ("count", "B · Presupuestos CallC + Regenerados — # Facturas"), + 10253: ("ticket", "B · Presupuestos CallC + Regenerados — Ticket medio"), +} + + +for cid, (agg, name) in CARDS.items(): + cur = client.get(f"/api/card/{cid}").json() + viz = cur.get("visualization_settings", {}) + sql = SQL_B.replace("__AGG__", AGG[agg]) + body = { + "name": name, + "description": name, + "dataset_query": { + "type": "native", "database": DB_ID, + "native": {"query": sql, "template-tags": TAGS_AB}, + }, + "visualization_settings": viz, + } + r = client.put(f"/api/card/{cid}", json=body) + r.raise_for_status() + print(f" card {cid} ({agg}) updated -> name='{name}'") + +client.close() +print("done") diff --git a/main.py b/main.py new file mode 100644 index 0000000..ed989fe --- /dev/null +++ b/main.py @@ -0,0 +1,6 @@ +def main(): + print("Hello from presupuestos-callcenter!") + + +if __name__ == "__main__": + main() diff --git a/notebooks/.ipynb_checkpoints/00_resultados_ejecutados-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/00_resultados_ejecutados-checkpoint.ipynb new file mode 100644 index 0000000..6bbea0a --- /dev/null +++ b/notebooks/.ipynb_checkpoints/00_resultados_ejecutados-checkpoint.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2b3d1ae8", + "metadata": {}, + "source": [ + "# 00 — Resultados ejecutados (vía Metabase, sin ADC)\n", + "\n", + "Resultados de la ejecución del script `run_via_metabase.py` (BigQuery `autingo-159109.psql_dcpublic`).\n", + "\n", + "Ventana: 90 días Q0, 60 días para detectar regeneración.\n", + "Centros call_center excluidos del cómputo: 159 (CALL CENTER AURGI), 162 (CALL CENTER)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c39f6e2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'window_days': 90,\n", + " 'A_quote_cc_eur': 6392965.08,\n", + " 'B_mismo_cliente_eur': 6923203.81,\n", + " 'C_total_centros_eur': 29635811.36,\n", + " 'A_sobre_C': 0.2157,\n", + " 'B_sobre_C': 0.2336,\n", + " 'lift_B_vs_A': 1.08,\n", + " 'centros_activos': 139}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "from pathlib import Path\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "BASE = Path('../data/results').resolve()\n", + "\n", + "def load(name):\n", + " return pd.read_csv(BASE / f'{name}.csv')\n", + "\n", + "totales = json.loads((BASE / 'totales_globales.json').read_text())\n", + "totales" + ] + }, + { + "cell_type": "markdown", + "id": "33adaf14", + "metadata": {}, + "source": [ + "## Q1 — Tasa de conversión por origen del usuario que generó la quote" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24471a70", + "metadata": {}, + "outputs": [], + "source": [ + "load('01_conversion_origen')" + ] + }, + { + "cell_type": "markdown", + "id": "5847ffda", + "metadata": {}, + "source": [ + "**Lectura:** \n", + "- Call center genera 62.8K quotes / 90d, convierte 47.1% (29.6K facturas con mismo `order_id`).\n", + "- Otros usuarios generan 477K quotes / 90d, convierten 57.4% (273.8K facturas).\n", + "- Brecha de ~10pp es esperable: el call_center genera quote en frío (cliente no presente), el TPV de centro genera quote casi siempre con el cliente ya en mostrador." + ] + }, + { + "cell_type": "markdown", + "id": "3484eeb6", + "metadata": {}, + "source": [ + "## Q2 — 3 KPI por centro\n", + "\n", + "- **A** = € facturados desde quotes creados por call_center (mismo order_id).\n", + "- **B** = € facturados a los mismos clientes (`customer_id` + `vehicle_id`) en centros físicos NO call_center.\n", + "- **C** = € facturados totales del centro (todos los clientes).\n", + "- `lift_B_vs_A`: 1.0 = solo factura el quote inicial; >1 = el centro factura más al cliente que sólo el quote." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2bc0458", + "metadata": {}, + "outputs": [], + "source": [ + "df = load('02_kpi_3_por_centro')\n", + "df.head(15)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "201ac95f", + "metadata": {}, + "outputs": [], + "source": [ + "# Top 15 centros por valor A (más facturado vía call_center)\n", + "top = df.sort_values('A_quote_cc_eur', ascending=False).head(15).iloc[::-1]\n", + "fig, ax = plt.subplots(figsize=(10, 7))\n", + "y = range(len(top))\n", + "ax.barh(y, top.A_quote_cc_eur, label='A (cc -> factura)')\n", + "ax.barh(y, (top.B_mismo_cliente_eur - top.A_quote_cc_eur).clip(lower=0),\n", + " left=top.A_quote_cc_eur, label='B-A (mismo cliente extra)')\n", + "ax.set_yticks(list(y)); ax.set_yticklabels(top.center_name)\n", + "ax.set_xlabel('€ facturados (90d)')\n", + "ax.legend(); ax.set_title('Top 15 centros — quotes call_center -> factura')\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "291fa4af", + "metadata": {}, + "outputs": [], + "source": [ + "print('TOTALES 90d (excluye centros call_center 159/162):')\n", + "for k, v in totales.items():\n", + " print(f' {k:25} {v}')" + ] + }, + { + "cell_type": "markdown", + "id": "3d161868", + "metadata": {}, + "source": [ + "## Q3 — Centros que MÁS regeneran el presupuesto\n", + "\n", + "Definición operativa: para un par `(customer_id, vehicle_id)` cuyo primer presupuesto (Q0) lo abrió el call_center, hay un Q1+ posterior con **distinto `order_id`** abierto en un terminal del centro físico dentro de 60 días." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7831e9fe", + "metadata": {}, + "outputs": [], + "source": [ + "regen = load('03_regen_por_centro')\n", + "regen" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83758dc9", + "metadata": {}, + "outputs": [], + "source": [ + "top_regen = regen.head(15).iloc[::-1]\n", + "fig, ax = plt.subplots(figsize=(10, 6))\n", + "y = range(len(top_regen))\n", + "ax.barh(y, top_regen.q0_regenerados_aqui)\n", + "ax.set_yticks(list(y)); ax.set_yticklabels(top_regen.center_name)\n", + "ax.set_xlabel('# Q0 (de call_center) regenerados en este centro')\n", + "ax.set_title('Top centros regeneradores de presupuesto call_center (90d Q0, 60d window)')\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b0f6c55c", + "metadata": {}, + "source": [ + "## Q4 — ¿Regenerar perjudica la conversión propia del Q0?\n", + "\n", + "Conversión del Q0 = el invoice se genera contra el MISMO order_id del Q0 (no contra el order_id regenerado en centro). Si regeneran, ese flujo cae." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "423b68cd", + "metadata": {}, + "outputs": [], + "source": [ + "load('04_regen_vs_conversion')" + ] + }, + { + "cell_type": "markdown", + "id": "4956e2d1", + "metadata": {}, + "source": [ + "**Lectura:**\n", + "- 35.5K Q0 sin regeneración convierten al **63.1%** (sobre el order_id original).\n", + "- 18.5K Q0 con regeneración convierten al **38.7%** sobre el order_id original.\n", + "- Los 'regenerados' no se 'pierden' necesariamente — el cliente puede haberse facturado vía un order_id distinto (el del centro). Esa parte está capturada en el KPI **B** del cuadro anterior.\n", + "- Aprox **34.2% de los Q0 call_center** entran en patrón de regeneración (18488 / 53995)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/.ipynb_checkpoints/01_exploracion-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/01_exploracion-checkpoint.ipynb new file mode 100644 index 0000000..de9e67c --- /dev/null +++ b/notebooks/.ipynb_checkpoints/01_exploracion-checkpoint.ipynb @@ -0,0 +1,214 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "07306d98", + "metadata": {}, + "source": [ + "# 01 — Exploración: quotes ↔ call_center ↔ factura\n", + "\n", + "Mapa de tablas y joins en `psql_dcpublic` (BigQuery `autingo-159109`).\n", + "\n", + "## Cadena de joins\n", + "\n", + "```\n", + "tpv_authorization_tpvuser_centers (dccenter_id ∈ {159 CALL_CENTER_AURGI, 162 CALL_CENTER})\n", + " │ tpvuser_id\n", + " ▼\n", + "tpv_orders_quote.created_by_id ──► quote por agente call_center\n", + " │ order_id\n", + " ▼\n", + "tpv_orders_order ─► terminal_id ─► tpv_terminals.center_id ─► centers (centro real de facturación)\n", + " │ │ customer_id │ vehicle_id\n", + " ▼ ▼ ▼\n", + "tpv_orders_invoice (status convertido) tpv_customers (tlf) tpv_vehicles_vehicle (matrícula)\n", + "```\n", + "\n", + "Identidad cliente = `(customer_id, vehicle_id)` o (tlf, matrícula) según necesite normalización." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2b6d545", + "metadata": {}, + "outputs": [], + "source": [ + "import os, sys\n", + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "3238b92e", + "metadata": {}, + "source": [ + "## 1. Usuarios call_center" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34d656ad", + "metadata": {}, + "outputs": [], + "source": [ + "cc_users = q(f\"\"\"\n", + "SELECT u.id, u.name, u.email, u.is_active, u.role_id,\n", + " STRING_AGG(CAST(uc.dccenter_id AS STRING)) AS centers\n", + "FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser` u\n", + "JOIN `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` uc\n", + " ON u.id = uc.tpvuser_id\n", + "WHERE uc.dccenter_id IN (159, 162)\n", + "GROUP BY 1,2,3,4,5\n", + "ORDER BY u.is_active DESC, u.id\n", + "\"\"\")\n", + "print(f\"Total usuarios call_center: {len(cc_users)} (activos: {cc_users.is_active.sum()})\")\n", + "cc_users.head(20)" + ] + }, + { + "cell_type": "markdown", + "id": "9ec102fb", + "metadata": {}, + "source": [ + "## 2. Schema quote — campos clave" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5f94b52", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT column_name, data_type\n", + "FROM `{PROJECT}.{DATASET}.INFORMATION_SCHEMA.COLUMNS`\n", + "WHERE table_name='tpv_orders_quote'\n", + "ORDER BY ordinal_position\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "32ffc1d2", + "metadata": {}, + "source": [ + "## 3. Distribución `status` y `accepted` (últimos 90d)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "609022a9", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT status, accepted, COUNT(*) n\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote`\n", + "WHERE created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND deleted_at IS NULL\n", + "GROUP BY status, accepted\n", + "ORDER BY n DESC\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "73c85198", + "metadata": {}, + "source": [ + "## 4. Conversion quote → invoice (mismo order_id)\n", + "\n", + "Una quote convierte cuando existe `tpv_orders_invoice` con el mismo `order_id`. Ese invoice fija la facturación real (NAV-sync via `nav_id`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46378f84", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT\n", + " COUNT(*) AS quotes,\n", + " COUNT(DISTINCT q.order_id) AS distinct_orders,\n", + " SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) AS quotes_con_invoice,\n", + " SAFE_DIVIDE(SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END), COUNT(*)) AS conversion_rate\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + "LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i\n", + " ON q.order_id = i.order_id\n", + "WHERE q.created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND q.deleted_at IS NULL\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "df8b402c", + "metadata": {}, + "source": [ + "## 5. Sanity: quote por call_center vs otro\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "506744d3", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "WITH cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + ")\n", + "SELECT\n", + " CASE WHEN cc.user_id IS NOT NULL THEN 'call_center' ELSE 'otro' END AS origen_user,\n", + " COUNT(*) AS quotes,\n", + " SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) AS convertidos,\n", + " ROUND(SAFE_DIVIDE(SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END), COUNT(*)), 3) AS conv_rate\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + "LEFT JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + "LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON q.order_id = i.order_id\n", + "WHERE q.created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND q.deleted_at IS NULL\n", + "GROUP BY 1\n", + "\"\"\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/.ipynb_checkpoints/02_metricas_3kpi-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/02_metricas_3kpi-checkpoint.ipynb new file mode 100644 index 0000000..a7a5707 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/02_metricas_3kpi-checkpoint.ipynb @@ -0,0 +1,244 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36ae91c9", + "metadata": {}, + "source": [ + "# 02 — 3 KPI principales\n", + "\n", + "Por **centro real de facturación** (`tpv_terminals.center_id` del invoice) y ventana temporal:\n", + "\n", + "1. **A — Valor facturado de quotes call_center que CONVIRTIERON** \n", + " Quote creado por usuario call_center + existe `tpv_orders_invoice` con el mismo `order_id`. Sumamos `tpv_orders_order.total_cost` o líneas. Centro = centro del invoice.\n", + "\n", + "2. **B — Valor facturado total a esos mismos clientes en centros** \n", + " Misma identidad cliente (`customer_id` y/o `vehicle_id` y/o `tlf`+`matricula` normalizados). Todas las facturas del cliente en ese centro en la misma ventana. Debe ser ≥ A.\n", + "\n", + "3. **C — Facturación total del centro** \n", + " Suma de invoices del centro en la ventana, todos los clientes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7938921f", + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "WINDOW_DAYS = 90\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "c7cfa785", + "metadata": {}, + "source": [ + "## Setup: CTEs base reutilizables\n", + "\n", + "Construimos una query maestra con CTEs para A, B, C juntos por centro." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e06df33", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_KPI = f\"\"\"\n", + "DECLARE window_days INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL window_days DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "-- Quotes creados por call_center que TIENEN invoice (convertidos)\n", + "cc_converted AS (\n", + " SELECT\n", + " q.id AS quote_id,\n", + " q.order_id,\n", + " q.created_at AS quote_ts,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id,\n", + " o.total_cost,\n", + " i.id AS invoice_id,\n", + " i.created_at AS invoice_ts\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.created_at >= t_start\n", + " AND q.deleted_at IS NULL\n", + "),\n", + "-- Clientes \"tocados\" por call_center (customer_id + vehicle_id)\n", + "cc_clients AS (\n", + " SELECT DISTINCT center_id, customer_id, vehicle_id\n", + " FROM cc_converted\n", + " WHERE customer_id IS NOT NULL\n", + "),\n", + "-- Todas las facturas en la ventana, con centro real\n", + "all_invoices AS (\n", + " SELECT\n", + " i.id AS invoice_id,\n", + " i.order_id,\n", + " i.created_at AS invoice_ts,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id,\n", + " o.total_cost\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_invoice` i\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON i.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE i.created_at >= t_start\n", + "),\n", + "-- B: facturas de los mismos clientes en cualquier centro NO call_center\n", + "client_invoices_in_centers AS (\n", + " SELECT ai.*\n", + " FROM all_invoices ai\n", + " JOIN cc_clients cc ON ai.customer_id = cc.customer_id\n", + " WHERE ai.center_id NOT IN (159, 162) -- excluye los propios centros call_center\n", + "),\n", + "kpi_a AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT quote_id) AS quotes_cc_convertidos,\n", + " COUNT(DISTINCT invoice_id) AS invoices_a,\n", + " SUM(total_cost) AS valor_a\n", + " FROM cc_converted\n", + " WHERE center_id IS NOT NULL\n", + " GROUP BY center_id\n", + "),\n", + "kpi_b AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT invoice_id) AS invoices_b,\n", + " SUM(total_cost) AS valor_b\n", + " FROM client_invoices_in_centers\n", + " GROUP BY center_id\n", + "),\n", + "kpi_c AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT invoice_id) AS invoices_c,\n", + " SUM(total_cost) AS valor_c\n", + " FROM all_invoices\n", + " WHERE center_id IS NOT NULL\n", + " GROUP BY center_id\n", + ")\n", + "SELECT\n", + " c.id AS center_id,\n", + " c.name AS center_name,\n", + " COALESCE(a.quotes_cc_convertidos, 0) AS quotes_cc_convertidos,\n", + " ROUND(COALESCE(a.valor_a, 0), 2) AS A_valor_quote_cc_convertido,\n", + " ROUND(COALESCE(b.valor_b, 0), 2) AS B_valor_mismo_cliente_centro,\n", + " ROUND(COALESCE(c2.valor_c, 0), 2) AS C_valor_total_centro,\n", + " ROUND(SAFE_DIVIDE(COALESCE(a.valor_a, 0), c2.valor_c), 4) AS A_sobre_C,\n", + " ROUND(SAFE_DIVIDE(COALESCE(b.valor_b, 0), c2.valor_c), 4) AS B_sobre_C\n", + "FROM `{PROJECT}.{DATASET}.centers` c\n", + "LEFT JOIN kpi_a a ON c.id = a.center_id\n", + "LEFT JOIN kpi_b b ON c.id = b.center_id\n", + "LEFT JOIN kpi_c c2 ON c.id = c2.center_id\n", + "WHERE c.id NOT IN (159, 162)\n", + " AND COALESCE(c2.valor_c, 0) > 0\n", + "ORDER BY C_valor_total_centro DESC\n", + "\"\"\"\n", + "\n", + "df = q(SQL_KPI)\n", + "print(f\"Centros con actividad ({WINDOW_DAYS}d): {len(df)}\")\n", + "df.head(30)" + ] + }, + { + "cell_type": "markdown", + "id": "724baf5c", + "metadata": {}, + "source": [ + "## Totales globales" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75c3297e", + "metadata": {}, + "outputs": [], + "source": [ + "totals = df[[\"A_valor_quote_cc_convertido\", \"B_valor_mismo_cliente_centro\", \"C_valor_total_centro\"]].sum()\n", + "print(totals.to_string())\n", + "print()\n", + "print(f\"A/C global: {totals.A_valor_quote_cc_convertido / totals.C_valor_total_centro:.4f}\")\n", + "print(f\"B/C global: {totals.B_valor_mismo_cliente_centro / totals.C_valor_total_centro:.4f}\")\n", + "print(f\"Lift B vs A: {totals.B_valor_mismo_cliente_centro / totals.A_valor_quote_cc_convertido:.2f}x\")" + ] + }, + { + "cell_type": "markdown", + "id": "0fba60db", + "metadata": {}, + "source": [ + "## Top 15 centros por A (valor traído por call_center)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f90abe7e", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "top = df.sort_values(\"A_valor_quote_cc_convertido\", ascending=False).head(15)\n", + "fig, ax = plt.subplots(figsize=(10, 6))\n", + "x = range(len(top))\n", + "ax.barh(x, top.A_valor_quote_cc_convertido, label=\"A (cc → factura)\")\n", + "ax.barh(x, top.B_valor_mismo_cliente_centro - top.A_valor_quote_cc_convertido,\n", + " left=top.A_valor_quote_cc_convertido, label=\"B−A (mismo cliente extra)\")\n", + "ax.set_yticks(x)\n", + "ax.set_yticklabels(top.center_name)\n", + "ax.invert_yaxis()\n", + "ax.set_xlabel(\"€ facturados\")\n", + "ax.legend()\n", + "ax.set_title(f\"Top 15 centros — quotes call_center ({WINDOW_DAYS}d)\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/.ipynb_checkpoints/03_regeneracion-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/03_regeneracion-checkpoint.ipynb new file mode 100644 index 0000000..11d8edd --- /dev/null +++ b/notebooks/.ipynb_checkpoints/03_regeneracion-checkpoint.ipynb @@ -0,0 +1,367 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b090f346", + "metadata": {}, + "source": [ + "# 03 — Regeneración de presupuestos\n", + "\n", + "**Hipótesis:** un mismo cliente (`customer_id` + `vehicle_id`) recibe N quotes antes de convertir. El centro \"regenera\" el presupuesto cuando descarta el de call_center y abre uno nuevo en TPV local.\n", + "\n", + "Definición operativa de regeneración:\n", + "- Existe quote call_center previa (Q0) para el par cliente+vehículo.\n", + "- Existe quote posterior (Q1...Qn) en un terminal de centro NO call_center, dentro de ventana D días.\n", + "- Q1 puede tener distinto `order_id` que Q0 (regenera de cero) o mismo (reescribe — menos común).\n", + "\n", + "Métricas pedidas:\n", + "1. Centros que MÁS regeneran (cuentan regeneraciones absolutas y % sobre quotes call_center recibidos).\n", + "2. Quotes call_center con regeneración vs sin regeneración." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5626c2cd", + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "WINDOW_DAYS = 90 # ventana de análisis sobre quote call_center\n", + "REGEN_WINDOW_DAYS = 60 # ventana para detectar regeneración posterior\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17cff6ce", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_REGEN = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "-- Q0: quotes generados por call_center\n", + "q0 AS (\n", + " SELECT\n", + " q.id AS q0_id,\n", + " q.order_id AS q0_order,\n", + " q.created_at AS q0_ts,\n", + " o.customer_id,\n", + " o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start\n", + " AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL\n", + " AND o.vehicle_id IS NOT NULL\n", + "),\n", + "-- Q1..Qn: quotes posteriores para mismo cliente+vehículo, en centro NO call_center\n", + "qN AS (\n", + " SELECT\n", + " q.id AS qn_id,\n", + " q.order_id AS qn_order,\n", + " q.created_at AS qn_ts,\n", + " q.created_by_id,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL\n", + " AND t.center_id NOT IN (159, 162)\n", + "),\n", + "-- Empareja Q0 con Q1+ dentro de regen_win días\n", + "regen AS (\n", + " SELECT\n", + " q0.q0_id,\n", + " q0.q0_order,\n", + " q0.customer_id,\n", + " q0.vehicle_id,\n", + " qN.qn_id,\n", + " qN.qn_order,\n", + " qN.center_id AS regen_center,\n", + " TIMESTAMP_DIFF(qN.qn_ts, q0.q0_ts, HOUR) / 24 AS dias_entre\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "),\n", + "-- Para cada Q0, ¿hay al menos UNA regeneración?\n", + "q0_has_regen AS (\n", + " SELECT q0_id, COUNT(*) AS regen_count,\n", + " MIN(dias_entre) AS dias_a_regen,\n", + " APPROX_TOP_COUNT(regen_center, 1)[OFFSET(0)].value AS first_regen_center\n", + " FROM regen\n", + " GROUP BY q0_id\n", + ")\n", + "\n", + "-- Vista por centro: cuántos Q0 regenera cada centro\n", + "SELECT\n", + " c.id AS center_id,\n", + " c.name AS center_name,\n", + " COUNT(DISTINCT r.q0_id) AS q0_regenerados_aqui,\n", + " COUNT(*) AS regen_events,\n", + " ROUND(AVG(r.dias_entre), 1) AS dias_avg_regen\n", + "FROM regen r\n", + "JOIN `{PROJECT}.{DATASET}.centers` c ON r.regen_center = c.id\n", + "GROUP BY c.id, c.name\n", + "ORDER BY q0_regenerados_aqui DESC\n", + "LIMIT 30\n", + "\"\"\"\n", + "\n", + "df_centros = q(SQL_REGEN)\n", + "print(f\"Centros con eventos de regeneración: {len(df_centros)}\")\n", + "df_centros.head(30)" + ] + }, + { + "cell_type": "markdown", + "id": "43add847", + "metadata": {}, + "source": [ + "## Totales: Q0 con regeneración vs sin regeneración" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "736158ba", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_TOT = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + "),\n", + "regen AS (\n", + " SELECT DISTINCT q0.q0_id\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + ")\n", + "SELECT\n", + " COUNT(*) AS q0_total,\n", + " COUNT(DISTINCT r.q0_id) AS q0_regenerados,\n", + " COUNT(*) - COUNT(DISTINCT r.q0_id) AS q0_no_regenerados,\n", + " ROUND(SAFE_DIVIDE(COUNT(DISTINCT r.q0_id), COUNT(*)), 4) AS pct_regenerados\n", + "FROM q0\n", + "LEFT JOIN regen r USING (q0_id)\n", + "\"\"\"\n", + "q(SQL_TOT)" + ] + }, + { + "cell_type": "markdown", + "id": "c183a653", + "metadata": {}, + "source": [ + "## Distribución días hasta regeneración" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aab452ca", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_DIAS = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + ")\n", + "SELECT\n", + " TIMESTAMP_DIFF(qN.qn_ts, q0.q0_ts, HOUR)/24 AS dias_entre\n", + "FROM q0\n", + "JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "\"\"\"\n", + "dias = q(SQL_DIAS)\n", + "print(dias.describe())\n", + "import matplotlib.pyplot as plt\n", + "dias[\"dias_entre\"].clip(upper=60).hist(bins=30)\n", + "plt.xlabel(\"Días entre Q0 (call_center) y Q1 (centro)\")\n", + "plt.ylabel(\"# eventos\")\n", + "plt.title(\"Distribución de regeneración temporal\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0feaa9c1", + "metadata": {}, + "source": [ + "## Cruzar regeneración con conversión a factura\n", + "\n", + "¿Los Q0 regenerados convierten MENOS que los Q0 no regenerados? (Hipótesis: el cliente prefiere lo que negocia el centro)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "376502d8", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_CONV = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + "),\n", + "regen AS (\n", + " SELECT DISTINCT q0.q0_id\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "),\n", + "q0_inv AS (\n", + " SELECT q0.q0_id,\n", + " CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END AS q0_factura\n", + " FROM q0\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = q0.q0_order\n", + ")\n", + "SELECT\n", + " CASE WHEN r.q0_id IS NOT NULL THEN 'regenerado' ELSE 'no_regenerado' END AS bucket,\n", + " COUNT(*) AS q0_total,\n", + " SUM(qi.q0_factura) AS q0_convertido_propio,\n", + " ROUND(SAFE_DIVIDE(SUM(qi.q0_factura), COUNT(*)), 4) AS conv_q0_propio\n", + "FROM q0_inv qi\n", + "LEFT JOIN regen r USING (q0_id)\n", + "GROUP BY bucket\n", + "\"\"\"\n", + "q(SQL_CONV)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/00_resultados_ejecutados.ipynb b/notebooks/00_resultados_ejecutados.ipynb new file mode 100644 index 0000000..19e94ab --- /dev/null +++ b/notebooks/00_resultados_ejecutados.ipynb @@ -0,0 +1,970 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2b3d1ae8", + "metadata": {}, + "source": [ + "# 00 — Resultados ejecutados (vía Metabase, sin ADC)\n", + "\n", + "Resultados de la ejecución del script `run_via_metabase.py` (BigQuery `autingo-159109.psql_dcpublic`).\n", + "\n", + "Ventana: 90 días Q0, 60 días para detectar regeneración.\n", + "Centros call_center excluidos del cómputo: 159 (CALL CENTER AURGI), 162 (CALL CENTER)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c39f6e2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'window_days': 90,\n", + " 'A_quote_cc_eur': 6392965.08,\n", + " 'B_mismo_cliente_eur': 6923203.81,\n", + " 'C_total_centros_eur': 29635811.36,\n", + " 'A_sobre_C': 0.2157,\n", + " 'B_sobre_C': 0.2336,\n", + " 'lift_B_vs_A': 1.08,\n", + " 'centros_activos': 139}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "from pathlib import Path\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "BASE = Path('../data/results').resolve()\n", + "\n", + "def load(name):\n", + " return pd.read_csv(BASE / f'{name}.csv')\n", + "\n", + "totales = json.loads((BASE / 'totales_globales.json').read_text())\n", + "totales" + ] + }, + { + "cell_type": "markdown", + "id": "33adaf14", + "metadata": {}, + "source": [ + "## Q1 — Tasa de conversión por origen del usuario que generó la quote" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "24471a70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origenquotesconvertidosconv_rate
0call_center62779295760.4711
1otro4770952737640.5738
\n", + "" + ], + "text/plain": [ + " origen quotes convertidos conv_rate\n", + "0 call_center 62779 29576 0.4711\n", + "1 otro 477095 273764 0.5738" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load('01_conversion_origen')" + ] + }, + { + "cell_type": "markdown", + "id": "5847ffda", + "metadata": {}, + "source": [ + "**Lectura:** \n", + "- Call center genera 62.8K quotes / 90d, convierte 47.1% (29.6K facturas con mismo `order_id`).\n", + "- Otros usuarios generan 477K quotes / 90d, convierten 57.4% (273.8K facturas).\n", + "- Brecha de ~10pp es esperable: el call_center genera quote en frío (cliente no presente), el TPV de centro genera quote casi siempre con el cliente ya en mostrador." + ] + }, + { + "cell_type": "markdown", + "id": "3484eeb6", + "metadata": {}, + "source": [ + "## Q2 — 3 KPI por centro\n", + "\n", + "- **A** = € facturados desde quotes creados por call_center (mismo order_id).\n", + "- **B** = € facturados a los mismos clientes (`customer_id` + `vehicle_id`) en centros físicos NO call_center.\n", + "- **C** = € facturados totales del centro (todos los clientes).\n", + "- `lift_B_vs_A`: 1.0 = solo factura el quote inicial; >1 = el centro factura más al cliente que sólo el quote." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f2bc0458", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
center_idcenter_namequotes_cc_facturadosA_quote_cc_eurB_mismo_cliente_eurC_total_centro_eurA_sobre_CB_sobre_Clift_B_vs_A
0144Velez Malaga15821890.2837700.63653333.860.03350.05771.72
175Store607150402.50167424.36644637.940.23330.25971.11
254Leganes51662620.0687800.04637007.160.09830.13781.40
3121Villalba31641725.4657526.94524985.020.07950.10961.38
4168Goya GLASS1773414629.07418220.06497398.120.83360.84081.01
573Malaga37964408.0877124.76489986.850.13140.15741.20
6130Alcorcon21029467.1742686.28487245.300.06050.08761.45
735MT Sanchinarro48078658.9687172.31487013.500.16150.17901.11
882Vallecas30740691.7957401.47460004.100.08850.12481.41
9146Vaguada38452572.1166427.60453792.260.11590.14641.26
1074La Red14920090.0028795.52453685.440.04430.06351.43
1186Almeria20627675.2641355.76447008.240.06190.09251.49
12160Aurgi Web00.0032.76434152.840.00000.0001NaN
1376Barbera14620540.9132027.62428700.380.04790.07471.56
1455MT Pozuelo14829616.4541182.26428580.000.06910.09611.39
\n", + "
" + ], + "text/plain": [ + " center_id center_name quotes_cc_facturados A_quote_cc_eur \\\n", + "0 144 Velez Malaga 158 21890.28 \n", + "1 75 Store 607 150402.50 \n", + "2 54 Leganes 516 62620.06 \n", + "3 121 Villalba 316 41725.46 \n", + "4 168 Goya GLASS 1773 414629.07 \n", + "5 73 Malaga 379 64408.08 \n", + "6 130 Alcorcon 210 29467.17 \n", + "7 35 MT Sanchinarro 480 78658.96 \n", + "8 82 Vallecas 307 40691.79 \n", + "9 146 Vaguada 384 52572.11 \n", + "10 74 La Red 149 20090.00 \n", + "11 86 Almeria 206 27675.26 \n", + "12 160 Aurgi Web 0 0.00 \n", + "13 76 Barbera 146 20540.91 \n", + "14 55 MT Pozuelo 148 29616.45 \n", + "\n", + " B_mismo_cliente_eur C_total_centro_eur A_sobre_C B_sobre_C lift_B_vs_A \n", + "0 37700.63 653333.86 0.0335 0.0577 1.72 \n", + "1 167424.36 644637.94 0.2333 0.2597 1.11 \n", + "2 87800.04 637007.16 0.0983 0.1378 1.40 \n", + "3 57526.94 524985.02 0.0795 0.1096 1.38 \n", + "4 418220.06 497398.12 0.8336 0.8408 1.01 \n", + "5 77124.76 489986.85 0.1314 0.1574 1.20 \n", + "6 42686.28 487245.30 0.0605 0.0876 1.45 \n", + "7 87172.31 487013.50 0.1615 0.1790 1.11 \n", + "8 57401.47 460004.10 0.0885 0.1248 1.41 \n", + "9 66427.60 453792.26 0.1159 0.1464 1.26 \n", + "10 28795.52 453685.44 0.0443 0.0635 1.43 \n", + "11 41355.76 447008.24 0.0619 0.0925 1.49 \n", + "12 32.76 434152.84 0.0000 0.0001 NaN \n", + "13 32027.62 428700.38 0.0479 0.0747 1.56 \n", + "14 41182.26 428580.00 0.0691 0.0961 1.39 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = load('02_kpi_3_por_centro')\n", + "df.head(15)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "201ac95f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zp49W+I5JPq7kwhCJZ6kQkRE9C8hkUgwePDgLz5iRf8eha/bmjx5clWHQkRE/3C8x5uIiIiIiIhIhniPNxERERHJTEnvrf5YWe9aJyL6N2DiTUREREQyU9J7qz/2pd61TkT0d8V7vImIiIhIZl6+fImLFy+WWcfOzq7M174REf3TMfEmIiIiIiIikiE+XI2IiIiIiIhIhniPNxFVSEFBAR4/fgxNTU1IJJKqDoeIiIiIqEoJgoDXr1/D0NAQcnJlj2kz8SaiCnn8+DGMjIyqOgwiIiIior+VR48eoU6dOmXWYeJNRBWiqakJ4MM/LFpaWlUcDRERERFR1crMzISRkZH4d3JZmHgTUYUUTi/X0tJi4k1ERERE9P8qchsmH65GREREREREJENMvImIiIiIiIhkiIk3ERERERERkQwx8SYiIiIiIiKSISbeRERERERERDLExJuIiIiIiIhIhph4ExEREREREckQE28iIiIiIiIiGWLiTURERERERCRDTLyJiIiIiIiIZIiJNxEREREREZEMMfEmIiIiIiIikiEm3kREREREREQyxMSbiIiIiIiISIaYeBMRERERERHJEBNvIiIiIiIiIhli4k1EREREREQkQ0y8iYiIiIiIiGSIiTcRERERERGRDDHxJiIiIiIiIpIhJt5EREREREREMsTEm4iIiIiIiEiGmHgTERERERERyRATbyIiIiIiIiIZYuJNREREREREJEMKVR0AEf2z2E86BDlltaoOg4iIiIj+A9JU/EsumJzx1wbymTjiTURERERERCRDTLyJiIiIiIiIZIiJNxEREREREZEMMfEmIiIiIiIikiEm3kREREREREQyxMSbiIiIiIiISIaYeBMRERERERHJEBNvIiIiIiIiIhli4k1EREREREQkQ0y86R/p6dOnGD58OCwsLKCiooJatWqhZcuWWL58ObKzs6s6PADAtm3b0LZtW1SrVg2qqqqoV68egoODcfnyZbFObGwsdHR0KtSetbU1lJWV8fTp02Jl9+/fh7+/PwwNDaGiooI6derg66+/xs2bN8U6J06cQNu2bVG9enWoqanB0tISgYGBeP/+/WfvKxERERERlY6JN/3j3Lt3Dw4ODjh8+DCmT5+Oy5cv4+zZsxg7diz27t2Lo0ePVnWIGDduHHr27IlGjRph9+7duHXrFjZt2gQzMzOEh4dX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IFUEG2pQjBiwYMOGWLB3JRFrYsQSW+wtmoigxh4bP0ssKIrYiaAUURHFgmJQQCzUef/wMC8rXV3R+P2cM+ewM3fufeburO6zd+ZOZiZGjhwJGxsbtG7dGhcuXMD+/fvRunXrUo8zOzsbf/75Z4n3kHt6emLz5s3is80zMzPh4OAgs3h4eIjl//77bxgYGMgs33zzDQDA2toaGhoamDhxIho2bAgnJyfs2rULGzZsQP/+/UuNk4iIiIiIPoxE4LOFiKgcMjIy3k6y5rsLCqoalR0OERF9Qe6q9QX80ys7DCKij6rg+3F6enqZTzTiiDcRERERERGRHDHxJiIiIiIiIpIjJt5EREREREREcsTEm4iIiIiIiEiOmHgTERERERERyRETbyIiIiIiIiI5YuJNREREREREJEdMvImIiIiIiIjkSKmyAyCiL0v0LDdoaWlVdhhERPRFSa/sAIiIKhVHvImIiIiIiIjkiIk3ERERERERkRwx8SYiIiIiIiKSIybeRERERERERHLExJuIiIiIiIhIjph4ExEREREREckRE28iIiIiIiIiOeJzvImoQmxnHoWCqkZlh0FERF+Au2p93/7hz+d4E9HXjSPeRERERERERHLExJuIiIiIiIhIjph4ExEREREREckRE28iIiIiIiIiOWLiTURERERERCRHTLyJiIiIiIiI5IiJNxEREREREZEcMfEmIiIiIiIikiMm3kRERERERERyxMT7C+fj44OuXbt+svZcXFwgkUggkUigpqYGCwsLzJ8/H4IgfLIY3sft27cxaNAg1K5dG6qqqjAxMYGXlxeuXLkilik4LolEAi0tLTRp0gQHDhyQqScoKAg6Ojri67y8PCxYsACWlpZQV1dHtWrV0KxZM2zYsKFIncUt/v7+Yl2WlpZQVVXF48ePi8Tv4uICX1/fEo+vpPp37Nghlvnjjz9gb28PqVQKHR0dODg4YP78+RXsSSIiIiIiqiilyg6AvjzDhg3D7NmzkZWVhZMnT2L48OHQ0dHBqFGjKju0Yl25cgVt27aFra0t1q9fD0tLS7x48QIHDhzAxIkTcfr0abFsYGAg3N3dkZGRgbVr16JHjx74559/YGdnV2zds2bNwvr167F69Wo0btwYGRkZuHLlCp4/fw4ASE5OFsvu3LkTP//8M+Lj48V1UqkUAHD27Fm8fv0aPXr0wKZN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ypUrMX78eNja2pa4r5KSEsaOHYtFixYVOzLctGlTZGZmYuTIkbCxsUHr1q1x4cIF7N+/v8zL9LOzs/Hnn3+WeA+5p6cnNm/ejJycHABv7293cHCQWQon93///TcMDAxklm+++QYAYG1tDQ0NDUycOBENGzaEk5MTdu3ahQ0bNqB///6lxklERERERB9OIvD5QkRUDhkZGW8nWfPdBQVVjcoOh4iIPrK7CzpWdghERF+Ugu/H6enpZd6WyRFvIiIiIiIiIjli4k1EREREREQkR0y8iYiIiIiIiOSIiTcRERERERGRHDHxJiIiIiIiIpIjJt5EREREREREcsTEm4iIiIiIiEiOmHgTERERERERyRETbyIiIiIiIiI5UqrsAIjoyxI9yw1aWlqVHQYRERER0ReDI95EREREREREcsTEm4iIiIiIiEiOmHgTERERERERyRETbyIiIiIiIiI5YuJNREREREREJEdMvImIiIiIiIjkiI8TI6IKsZ15FAqqGpUdBhERVdBdtb7//8I/vfICISL6CnHEm4iIiIiIiEiOmHgTERERERERyRETbyIiIiIiIiI5YuJNREREREREJEdMvImIiIiIiIjkiIk3ERERERERkRwx8SYiIiIiIiKSIybeRERERERERHLExJs+a8bGxli+fHllh0FERERERPTemHjLwdOnTzFq1CjUqVMHqqqq0NfXh5ubG8LDw+Xa7t27dyGRSIos/fr1k2u7X4JTp06hQ4cO0NXVhYaGBqytrTFx4kQ8fPgQABAaGirTZ3p6eujQoQOuX78uU4+Pjw+6du0qvi7tvX63zuKW0NBQAMCDBw+goqICW1vbYuOXSCTYv39/sdtKa+fx48cAgFevXmHatGmoV68e1NTUoKenh9atW+PAgQMf1rFERERERFQmpcoO4L/I09MT2dnZ2LRpE0xNTfHkyROEhIQgNTX1k7R/4sQJ2NjYiK/V1dXfq57s7GyoqKh8rLAqzfr16zF69GgMHDgQe/bsgbGxMZKSkrB582YsWbIES5cuFcvGx8dDS0sLjx49wqRJk9CxY0fcvn27xH4o7b12d3dHcnKyWHbChAnIyMhAYGCguK5atWoAgKCgIPTq1QtnzpzBxYsX0axZswofZ0HshdWoUQMAMHLkSFy8eBGrVq2CtbU1UlNTce7cuU92ThIRERERfc044v2RpaWlISwsDAsXLkSbNm1Qt25dNG3aFNOmTUPnzp3FckuXLoWdnR2qVKkCIyMjjB49GpmZmeL2oKAg6Ojo4OjRo7CysoJUKi2SyJVEV1cX+vr64qKtrS3GNnToUOjp6UFLSwvffvstoqKixP38/f3RsGFDbNiwASYmJlBTUwPwdrR1w4YN6NatGzQ0NGBubo7g4GBxv7y8PAwZMgQmJiZQV1dH/fr1sWLFCpmYCkaKFy9eDAMDA+jq6mLMmDHIyckRy6SkpMDDwwPq6uowMTHB1q1bixxbUlISunTpAqlUCi0tLfTq1QtPnjwpsS8ePHiA8ePHY/z48di4cSNcXFxgbGyMVq1aYcOGDfj5559lyteoUQP6+vpwdHSEr68v7t+/jxs3bhRbd1nvtYqKisz7oK6uLo6KFywqKioQBAGBgYHo378/+vbti4CAgBKPpzQFsRdeFBTefsSDg4Mxffp0dOjQAcbGxmjUqBHGjRuHwYMHv1dbRERERERUfky8PzKpVAqpVIr9+/cjKyurxHIKCgpYuXIlYmJisGnTJpw8eRKTJ0+WKfPq1SssXrwYW7ZswZkzZ5CUlAQ/P7/3jq1nz55ISUnBkSNHEBERAUdHR7Rt2xbPnj0Ty9y+fRt79uzB3r17ERkZKa6fNWsWevXqhWvXrqFDhw7w9vYW98vPz0ft2rWxe/duxMbG4ueff8b06dOxa9cumfZPnTqFhIQEnDp1Cps2bUJQUBCCgoLE7T4+Prh//z5OnTqFv/76C2vXrkVKSoq4PT8/H126dMGzZ89w+vRpHD9+HHfu3EHv3r1LPObdu3cjOzu7SN8W0NHRKXZ9eno6duzYAQAljnaX970uy6lTp/Dq1Su4urqiX79+2LFjB16+fPne9RVHX18fhw8fxosXLz5qvUREREREVDZeav6RKSkpISgoCMOGDcO6devg6OiI1q1bo0+fPmjQoIFYztfXV/zb2NgYc+fOxciRI7F27VpxfU5ODtatW4d69eoBAMaOHYvZs2eXGUOLFi3EkU4ACAsLw8uXL3Hp0iWkpKRAVVUVALB48WLs378ff/31F4YPHw7g7eXlmzdvhp6enkydPj4+8PLyAgDMmzcPK1euxKVLl+Du7g5lZWXMmjVLLGtiYoLz589j165d6NWrl7i+atWqWL16NRQVFWFpaYmOHTsiJCQEw4YNw82bN3HkyBFcunQJTZo0AQAEBATAyspK3D8kJATXr19HYmIijIyMAACbN2+GjY0NLl++LO5X2K1bt6ClpQUDA4My+w0AateuDQBi4tu5c2dYWloWW7a873VZAgIC0KdPHygqKsLW1hampqbYvXs3fHx8yl1H4dgL1K1bFzExMQCA33//Hd7e3tDV1YW9vT2++eYb9OjRAy1btiyxvqysLJkfFDIyMioUDxERERERvcURbznw9PTEo0ePEBwcDHd3d4SGhsLR0VFmdPfEiRNo27YtatWqBU1NTfTv3x+pqal49eqVWEZDQ0NMugHAwMBAZgS4JDt37kRkZKS4WFtbIyoqCpmZmdDV1RVHaqVSKRITE5GQkCDuW7du3SJJNwCZRLJKlSrQ0tKSiWXNmjVo1KgR9PT0IJVK8fvvvyMpKUmmDhsbGygqKhZ7PHFxcVBSUkKjRo3E7ZaWljIj0nFxcTAyMhKTbgCwtraGjo4O4uLiiu0LQRAgkUjK6jJRWFgYIiIiEBQUBAsLC6xbt67U8uV5r0uTlpaGvXv3ykyA169fv/e63DwsLEzmfT98+LC4rVWrVrhz5w5CQkLQo0cPxMTEwNnZGXPmzCmxvvnz50NbW1tcCvc7ERERERGVH0e85URNTQ3t2rVDu3btMGPGDAwdOhQzZ86Ej48P7t69i06dOmHUqFH45ZdfUK1aNZw9exZDhgxBdnY2NDQ0AADKysoydUokEgiCUGbbRkZGMDMzk1mXmZkJAwMDcRbtwgont1WqVCm2zuJiyc/PBwDs2LEDfn5+WLJkCZo3bw5NTU38+uuvuHjxYrnrkBcLCwukp6cjOTm5XKPeJiYm0NHRQf369ZGSkoLevXvjzJkzpe5T2ntdlm3btuHNmzcyk6kJgoD8/HzcvHkTFhYWZdbxbuwlUVZWhrOzM5ydnTFlyhTMnTsXs2fPxpQpU4q9nH7atGn44YcfxNcZGRlMvomIiIiI3gNHvD8Ra2tr8fLliIgI5OfnY8mSJXBycoKFhQUePXok1/YdHR3x+PFjKCkpwczMTGapXr36B9UdHh6OFi1aYPTo0XBwcICZmZnMKHp5WFpaIjc3FxEREeK6+Ph4pKWlia+trKxw//593L9/X1wXGxuLtLQ0WFtbF1tvjx49oKKigkWLFhW7vXD97xozZgyio6Oxb9++Ch1L4fe6LAEBAZg4caLMSHVUVBScnZ2xcePGCrVbUdbW1sjNzcWbN2+K3a6qqgotLS2ZhYiIiIiIKo4j3h9ZamoqevbsicGDB6NBgwbQ1NTElStXsGjRInTp0gUAYGZmhpycHKxatQoeHh4IDw8v85LmD+Xq6ormzZuja9euWLRokZjsHzp0CN26dUPjxo3fu25zc3Ns3rwZR48ehYmJCbZs2YLLly/DxMSk3HXUr18f7u7uGDFiBH777TcoKSnB19dX5lForq6usLOzg7e3N5YvX47c3FyMHj0arVu3LjF+IyMjLFu2DGPHjkVGRgYGDBgAY2NjPHjwAJs3b4ZUKsWSJUuK3VdDQwPDhg3DzJkz0bVr1yKXrJfnvS5NZGQk/vnnH2zdurXIfeReXl6YPXs25s6dCyWltx/TxMREmQnvgLd9XyAlJaVIEq2rqwtlZWW4uLjAy8sLjRs3hq6uLmJjYzF9+nS0adOGCTURERERkZxxxPsjk0qlaNasGZYtW4ZWrVrB1tYWM2bMwLBhw7B69WoAgL29PZYuXYqFCxfC1tYWW7duxfz58+Ual0QiweHDh9GqVSsMGjQIFhYW6NOnD+7du4eaNWt+UN0jRoxA9+7d0bt3bzRr1gypqakYPXp0hesJDAyEoaEhWrduje7du2P48OHic6gLjuHAgQOoWrUqWrVqBVdXV5iammLnzp2l1jt69GgcO3YMDx8+RLdu3WBpaYmhQ4dCS0urzFnix44di7i4OOzevbvItvK816UJCAiAtbV1sZO3devWDSkpKTL3af/www9wcHCQWa5evSpur1+/PgwMDGSWgisI3NzcsGnTJnz33XewsrLCuHHj4ObmVmTmeSIiIiIi+vgkQnluGiair15GRsbbSdZ8d0FBVaOywyEiogq6q9b3/1/4p1deIERE/xEF34/T09PLvIqUI95EREREREREcsTEm4iIiIiIiEiOmHgTERERERERyRETbyIiIiIiIiI5YuJNREREREREJEdMvImIiIiIiIjkiIk3ERERERERkRwx8SYiIiIiIiKSIybeRERERERERHKkVNkBENGXJXqWG7S0tCo7DCIiqrD0yg6AiOirxRFvIiIiIiIiIjli4k1EREREREQkR0y8iYiIiIiIiOSIiTcRERERERGRHDHxJiIiIiIiIpIjJt5EREREREREcsTHiRFRhdjOPAoFVY3KDoOIqFR31foC/nx8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Ghg2bBhmzpyJrl27FrlkPTU1FT179sTgwYPRoEEDaGpq4sqVK1i0aBG6dOlSZh9HRkbin3/+wdatW4vcR+7l5YXZs2dj7ty5UFJ6+zFNTEws8uOFubm5+HdKSkqRJFpXVxfKyspwcXGBl5cXGjduDF1dXcTGxmL69Olo06YNtLS0yoyViIiIiIjeH0e8vxBaWlqfNEGSSCQ4cOAAqlatilatWsHV1RWmpqbYuXMnAODJkye4ceMGQkJCYGhoCAMDA3EB3l7WvH37dvFRXAsXLsTcuXNl2mjQoAFOnz6NmzdvwtnZGQ4ODvj5559haGj4XjGVZPTo0Th27BgePnyIbt26wdLSEkOHDoWWllapzzgHgLFjxyIuLq7Yyc6kUimaNWuGZcuWoVWrVrC1tcWMGTMwbNiwYn84eFdAQACsra2LnbytW7duSElJkblP+4cffoCDg4PMcvXqVXF7/fr1Zd4HAwMDREREAADc3NywadMmfPfdd7CyssK4cePg5uaGXbt2lRknERERERF9GIlQ+CZcIqISZGRkvJ3d3HcXFFQ1KjscIvrM3VXrC/inV3YYREREclPw/Tg9Pb3MQVKOeBMRERERERHJERNvIiIiIiIiIjli4k1EREREREQkR0y8iYiIiIiIiOSIiTcRERERERGRHDHxJiIiIiIiIpIjJt5EREREREREcsTEm4iIiIiIiEiOlCo7ACL6skTPcoOWllZlh0FEn730yg6AiIjos8ERbyIiIiIiIiI5YuJNREREREREJEdMvImIiIiIiIjkiIk3ERERERERkRwx8SYiIiIiIiKSIybeRERERERERHLEx4kRUYXYzjwKBVWNyg6DiD7QXbW+n64xfz5ajIiIvm4c8SYiIiIiIiKSIybeRERERERERHLExJuIiIiIiIhIjph4ExEREREREckRE28iIiIiIiIiOWLiTURERERERCRHTLyJiIiIiIiI5IiJNxEREREREZEcMfEmIiIiIiIikiMm3kRERERERERyxMSbqJI8ffoUo0aNQp06daCqqgp9fX24ubkhPDwcACCRSLB///7KDZKIiIiIiD6YUmUHQPS18vT0RHZ2NjZt2gRTU1M8efIEISEhSE1N/ajt5OTkQFlZ+aPWSURERERE5ccRb6JKkJaWhrCwMCxcuBBt2rRB3bp10bRpU0ybNg2dO3eGsbExAKBb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Top 15 centros por valor A (más facturado vía call_center)\n", + "top = df.sort_values('A_quote_cc_eur', ascending=False).head(15).iloc[::-1]\n", + "fig, ax = plt.subplots(figsize=(10, 7))\n", + "y = range(len(top))\n", + "ax.barh(y, top.A_quote_cc_eur, label='A (cc -> factura)')\n", + "ax.barh(y, (top.B_mismo_cliente_eur - top.A_quote_cc_eur).clip(lower=0),\n", + " left=top.A_quote_cc_eur, label='B-A (mismo cliente extra)')\n", + "ax.set_yticks(list(y)); ax.set_yticklabels(top.center_name)\n", + "ax.set_xlabel('€ facturados (90d)')\n", + "ax.legend(); ax.set_title('Top 15 centros — quotes call_center -> factura')\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "291fa4af", + "metadata": {}, + "outputs": [], + "source": [ + "print('TOTALES 90d (excluye centros call_center 159/162):')\n", + "for k, v in totales.items():\n", + " print(f' {k:25} {v}')" + ] + }, + { + "cell_type": "markdown", + "id": "3d161868", + "metadata": {}, + "source": [ + "## Q3 — Centros que MÁS regeneran el presupuesto\n", + "\n", + "Definición operativa: para un par `(customer_id, vehicle_id)` cuyo primer presupuesto (Q0) lo abrió el call_center, hay un Q1+ posterior con **distinto `order_id`** abierto en un terminal del centro físico dentro de 60 días." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7831e9fe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
center_idcenter_nameq0_regenerados_aquiregen_eventsdias_avg_regen
0146Vaguada59413714.9
154Leganes57512465.7
275Store53011678.1
335MT Sanchinarro50812735.6
4168Goya GLASS4615197.3
582Vallecas4278955.6
681Granada4197825.6
755MT Pozuelo41010975.3
873Malaga3978335.0
9121Villalba3969275.2
1068MT Cornella37671414.1
11130Alcorcon3497443.0
1274La Red3468526.1
1386Almeria3277353.6
14148Cornella 232749518.8
15131San Juan3267315.7
1663San Fernando3256683.6
17143Majadahonda3247224.2
1870San Sebastian3249012.9
1972Las Rozas3206784.4
20127Alcobendas3067653.8
2147MT Campo de las Naciones3037304.9
2285Gta. Cadiz2886674.6
23136Emilio Muñoz2825894.5
24144Velez Malaga2805835.0
25137Avda. Toreros2775714.3
2676Barbera2577863.8
2758MT El Bercial2365643.5
2815Islazul2345064.3
29187Santa Engracia CRISTALES2302697.4
\n", + "
" + ], + "text/plain": [ + " center_id center_name q0_regenerados_aqui regen_events \\\n", + "0 146 Vaguada 594 1371 \n", + "1 54 Leganes 575 1246 \n", + "2 75 Store 530 1167 \n", + "3 35 MT Sanchinarro 508 1273 \n", + "4 168 Goya GLASS 461 519 \n", + "5 82 Vallecas 427 895 \n", + "6 81 Granada 419 782 \n", + "7 55 MT Pozuelo 410 1097 \n", + "8 73 Malaga 397 833 \n", + "9 121 Villalba 396 927 \n", + "10 68 MT Cornella 376 714 \n", + "11 130 Alcorcon 349 744 \n", + "12 74 La Red 346 852 \n", + "13 86 Almeria 327 735 \n", + "14 148 Cornella 2 327 495 \n", + "15 131 San Juan 326 731 \n", + "16 63 San Fernando 325 668 \n", + "17 143 Majadahonda 324 722 \n", + "18 70 San Sebastian 324 901 \n", + "19 72 Las Rozas 320 678 \n", + "20 127 Alcobendas 306 765 \n", + "21 47 MT Campo de las Naciones 303 730 \n", + "22 85 Gta. Cadiz 288 667 \n", + "23 136 Emilio Muñoz 282 589 \n", + "24 144 Velez Malaga 280 583 \n", + "25 137 Avda. Toreros 277 571 \n", + "26 76 Barbera 257 786 \n", + "27 58 MT El Bercial 236 564 \n", + "28 15 Islazul 234 506 \n", + "29 187 Santa Engracia CRISTALES 230 269 \n", + "\n", + " dias_avg_regen \n", + "0 4.9 \n", + "1 5.7 \n", + "2 8.1 \n", + "3 5.6 \n", + "4 7.3 \n", + "5 5.6 \n", + "6 5.6 \n", + "7 5.3 \n", + "8 5.0 \n", + "9 5.2 \n", + "10 14.1 \n", + "11 3.0 \n", + "12 6.1 \n", + "13 3.6 \n", + "14 18.8 \n", + "15 5.7 \n", + "16 3.6 \n", + "17 4.2 \n", + "18 2.9 \n", + "19 4.4 \n", + "20 3.8 \n", + "21 4.9 \n", + "22 4.6 \n", + "23 4.5 \n", + "24 5.0 \n", + "25 4.3 \n", + "26 3.8 \n", + "27 3.5 \n", + "28 4.3 \n", + "29 7.4 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "regen = load('03_regen_por_centro')\n", + "regen" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "83758dc9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAApeJJREFUeJzs3Xt8z/X///H7e9h7m9nGDBubmY3N+TDnHEKf+YRQIqcM0cGxEkkOS04hQkmSRaRI6tNJiHKoULacYxr6Ip/EZmTYnr8//Pb6eNvGxt7N4Xa9XF4X3s/X8/V8PV7P9/v12vvxfr1ez5fNGGMEAAAAAADynEt+BwAAAAAAwJ2KpBsAAAAAACch6QYAAAAAwElIugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEpJuAAAAAACchKQbAJBvbDabxo4dm99h5Ino6GgFBwfndxi4QwQHBys6Otp6vX79etlsNq1fvz7fYrodPPXUU7rvvvvyZd28R9mLjY2VzWZTYmKiU9q/en+5Vdu8lueff1716tX7x9aHfxZJN3AbsNlsOZru1D/0u3fv1tixY532xxrA3ePcuXMaO3bsHXu8vBVs3rxZY8eO1enTp//R9f722296++239cILLziU//HHH+rVq5dKlCghd3d31apVS8uWLcuyjf/7v/9Tp06d5OPjIy8vL7Vr104HDx50Sry7du1S9+7dVbp0adntdgUEBKh79+7avXt3lvVTU1M1fPhwBQQEyN3dXfXq1dPq1atvOo6EhAR17drV6p+wsDCNHDkyU709e/aoVatW8vT0VLFixdSjRw/997//ven147IhQ4YoPj5en376aX6HAicomN8BALi+RYsWObxeuHChVq9enak8IiLinwzrH7N7927FxMSoWbNmnEkEcFPOnTunmJgYSVKzZs3yN5g71ObNmxUTE6Po6Gj5+Pj8Y+t97bXXVK5cOd17771WWXJysu655x798ccfGjx4sEqVKqUPP/xQnTp10uLFi9W1a1erbkpKiu69914lJSXphRdeUKFChTR9+nQ1bdpUcXFx8vX1zbNYV6xYoS5duqhYsWLq06ePypUrp8TERM2fP1/Lly/XBx98oHbt2jksEx0dreXLl2vIkCEKCwtTbGys7r//fq1bt0733HPPDcURFxenZs2aqXTp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HvWW8QiwnBg6dKg8PDz0+OOPZ9rmv/76S0888YS8vLwcxnPo2LGj0tLSHNaRmpqqBQsWqF69etf9QTIr7dq1k91u14IFCxwe6fX2229LujxWRYaHHnpIn332mcMtPmvXrtWvv/6aqW9++OEHbdmyxSr773//m+1VKllp3LixvvnmG23ZssVKumvUqKEiRYpo0qRJ1qP28kLLli1VqFAhzZo1y+EzefXfJynn3ysytiE1NVUzZszQPffcY/0407hxYy1atEhHjx7N8n7upKQkJSQkqGHDhnmyfbiF/EMDtgHIQ1ePXp6WlmbuvfdeY7PZTL9+/czrr79u2rVrZ5SLR4a5ubk5jASalUuXLplmzZpZj8R5/fXXzSuvvGL+9a9/OTzK5fHHHzeSzL///W8zffp0M3v2bDN48GATEBBgli1bZtUrW7ZsliMmXz2i8bFjx0yBAgVM/fr1TWxsrHn//ffNH3/8cc02Mh7t4e3tbUaNGmWmT59uatSokelRSbVq1TL333+/GT9+vHn77bfNs88+a+x2u2nbtu01+yJjJOErt+fKeW5ubiYoKMiMGTPGvPXWW2bMmDGmSZMmpk2bNla9bdu2GVdXV+uxShMmTDABAQGmRo0a5urD88SJE40k07BhQ/PKK6+YOXPmmGHDhpmwsDCHEbibNm2a5WjsV48GnZaWZu6//35js9nMI488YmbNmmVmzJhhnnjiCVOsWDGH0Z8lmf79+2dqc+3atUaSady4sZkzZ46JiYkxJUqUsB4Nc6WMRwh169bNvP7669d9ZFjp0qXN+PHjzeTJk01ISEi2jwzLapTqxYsXW4/0evnll83cuXPNyJEjTY0aNazt2L59uylWrJh54oknzMyZM80bb7xh7rvvPiPJLF++PFObV/ryyy8dHhn24osvZvvIsJzuC1m58pFhjz76qHn99detR4a98MILVr2M0cKzGol9165dpmjRosbX19c8//zz5q233jLjxo0z999/v6lWrZpVr0SJEqZTp05m8uTJZt68eebxxx83NpvNYeT03bt3GxcXF1OzZk0ze/ZsM3r0aFOiRAlTtWrV6z4y7KWXXjLFihUzvr6+5ujRo7luM6d9OX36dBMWFmaGDRtm5s6da6ZOnWoqVqxovLy8zMGDB622KlWqZEqVKmVef/118/7771uPS8x4ZFh4eLiZMmWKeeml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uKdZkkJCQhQaGip3d/dctefq6qpHH31UCxYs0IULF7RkyRL17t3bmr906VINHTpUffr00ddff624uDj16tXrmiN+h4WF6eDBg7p48aJV5uPjo9DQUJUuXTpX8e3evVs//PCDhg0bpoIFC6pgwYKqX7++zp07p6VLlzrULVKkiNq2bavx48crPj5ejRs31ssvv+xQp3Tp0urRo4dmz56tXbt26fz583rzzTezXPeIESOUlJRkTUeOHMlV7AAAAACA3Mn3pNvX11f33XefZs+erbNnz16zbkREhI4cOeKQLO7evVunT59WpUqVrLLHHntMa9as0RtvvKFLly7pwQcftOZt2rRJDRs21FNPPaWaNWsqNDRUCQkJ11xvly5dlJKSojfeeOMGt/J/5s+fryZNmig+Pl5xcXHW9MwzzzhcYn41m82m8PDwa/ZR0aJF5e/vn20du90uLy8vhwkAAAAA4DwFr1/F+d544w01atRIkZGRGjt2rKpVqyYXFxdt3bpVe/fuVe3atSVJLVu2VNWqVdWtWzfNmDFDly5d0lNPPaWmTZs6jFYeERGh+vXra/jw4erdu7fD2fKwsDAtXLhQq1atUrly5bRo0SJt3bpV5cqVyza+Bg0a6Nlnn9Wzzz6rQ4cO6cEHH1RgYKCOHTum+fPny2azycXlf79fpKWlKS4uzqENu92u0NBQLVq0SC+99JKqVKniMP+xxx7Tq6++ql27dunixYsaM2aMevTooUqVKsnV1VXffvut3nnnHev+9rlz5youLk4dOnRQ+fLldf78eS1cuFC7du3SrFmzbvi9AAAAAADknVsi6S5fvry2b9+uCRMmaMSIEfr9999lt9tVqVIlDR061Bo13Gaz6ZNPPtHAgQPVpEkTh0eGXa1Pnz7avHmzw6XlkvT4449r+/bt6ty5s2w2m7p06aKnnnpKX3755TVjnDp1qurWras5c+bonXfe0blz51SyZEk1adJE33//vcNZ45SUFNWsWTPTNk6ePFknT55Uhw4dMrUfERGhiIgIzZ8/Xy+88IKCg4MVExOjxMRE2Ww26/XTTz8tSapbt642btyoJ554QkePHpWnp6cqV66slStXqmnTpjnreAAAAACAU90Sz+l2hnHjxmnZsmX65Zdf8juUWxbP6QYAALhz8Jxu4J912zynO6+lpKRo586dmj17tgYOHJjf4QAAAAAA7mJ3XNI9YMAA1a5dW82aNct0aTkAAAAAAP+kW+Ke7rwUGxur2NjY/A4DAAAAAIA770w3AAAAAAC3CpJuAAAAAACchKQbAAAAAAAnuePu6Ubu7YyJuuYQ9wAAAACAG8OZbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEpJuAAAAAACchNHLoSpjVsnF7pHfYQAAAOS7xEmt8zsEAHcYznQDAAAAAOAkJN0AAAAAADgJSTcAAAAAAE5C0g0AAAAAgJOQdAMAAAAA4CQk3QAAAAAAOAlJ901o1qyZhgwZYr0ODg7WjBkz8i0eAAAAAMCt5a5Nutu2batWrVplOW/Dhg2y2Wz65Zdf/uGoAAAAAAB3krs26e7Tp49Wr16t33//PdO8BQsWKDIyUtWqVcuHyAAAAAAAd4q7Nulu06aN/Pz8FBsb61CekpKiZcuWqX379urSpYtKly4tDw8PVa1aVe+//36u1nH69Gk99thj8vPzk5eXl5o3b674+HiHOv/5z39Up04dubm5qXjx4urQoYM1b9GiRYqMjFSRIkVUqlQpde3aVSdOnLDmnzp1St26dZOfn5/c3d0VFhamBQsW5L4zAAAAAABOcdcm3QULFtSjjz6q2NhYGWOs8mXLliktLU3du3dX7dq19fnnn2vnzp3q16+fevTooS1btuR4HQ8//LBOnDihL7/8Uj/99JNq1aqlFi1a6K+//pIkff755+rQoYPuv/9+bd++XWvXrlXdunWt5S9evKhx48YpPj5eK1euVGJioqKjo635o0aN0u7du/Xll19qz549mjNnjooXL37znQMAAAAAyBM2c2XGeZfZu3evIiIitG7dOjVr1kyS1KRJE5UtW1aLFi3KVL9NmzYKDw/X1KlTJV0eSK1GjRrW4GnBwcEaMmSIhgwZoo0bN6p169Y6ceKE7Ha71UZoaKiGDRumfv36qWHDhgoJCdF7772Xo3i3bdumOnXq6MyZM/L09NQDDzyg4sWL65133snR8qmpqUpNTbVeJycnKzAwUIFDPpSL3SNHbQAAANzJEie1zu8QANwmkpOT5e3traSkJHl5eWVb76490y1J4eHhatiwoZW0HjhwQBs2bFCfPn2UlpamcePGqWrVqipWrJg8PT21atUqHT58OEdtx8fHKyUlRb6+vvL09LSm3377TQkJCZKkuLg4tWjRIts2fvrpJ7Vt21ZBQUEqUqSImjZtKklWDE8++aSWLl2qGjVqaNiwYdq8efM1Y5o4caK8vb2tKTAwMEfbAgAAAAC4MXd10i1dHlDto48+0pkzZ7RgwQKVL19eTZs21ZQpU/Taa69p+PDhWrduneLi4hQVFaULFy7kqN2UlBT5+/srLi7OYdq3b5+ee+45SZK7u3u2y589e1ZRUVHy8vLS4sWLtXXrVn388ceSZMXw73//W4cOHdLTTz+to0ePqkWLFho6dGi2bY4YMUJJSUnWdOTIkZx2EwAAAADgBtz1SXenTp3k4uKiJUuWaOHCherdu7dsNps2bdqkdu3aqXv37qpevbpCQkL066+/5rjdWrVq6fjx4ypYsKBCQ0Mdpoz7rqtVq6a1a9dmufzevXt18uRJTZo0SY0bN1Z4eLjDIGoZ/Pz81LNnT7333nuaMWOG3nrrrWxjstvt8vLycpgAAAAAAM5z1yfdnp6e6ty5s0aMGKFjx45ZA5WFhYVp9erV2rx5s/bs2aPHH39cf/zxR47bbdmypRo0aKD27dvr66+/VmJiojZv3qyRI0dq27ZtkqQxY8bo/fff15gxY7Rnzx7t2LFDkydPliQFBQXJ1dVVs2bN0sGDB/Xpp59q3LhxDusYPXq0PvnkEx04cEC7du3SZ599poiIiLzpGAAAAADATbvrk27p8iXmp06dUlRUlAICAiRJL774omrVqqWoqCg1a9ZMpUqVUvv27XPcps1m0xdffKEmTZqoV69eqlChgh555BEdOnRIJUuWlHR5ILZly5bp008/VY0aNdS8eXNrdPSMx5ktW7ZMlSpV0qRJk6wB3DK4urpqxIgRqlatmpo0aaICBQpo6dKledMpAAAAAICbdlePXn63yxhtj9HLAQAALmP0cgA5xejlAAAAAADkM5JuAAAAAACchKQbAAAAAAAnIekGAAAAAMBJSLoBAAAAAHASkm4AAAAAAJykYH4HgPy3MybqmkPcAwAAAABuDGe6AQAAAABwEpJuAAAAAACchKQbAAAAAAAnIekGAAAAAMBJSLoBAAAAAHASRi+HqoxZJRe7R36HAQAA4BSJk1rndwgA7mKc6QYAAAAAwElIugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEpLu28T69etls9l0+vTp/A4FAAAAAJBDd2XSffz4cQ0ePFihoaFyc3NTyZIl1ahRI82ZM0fnzp3L7/AAAAAAAHeIgvkdwD/t4MGDatSokXx8fDRhwgRVrVpVdrtdO3bs0FtvvaXSpUvrgQceyLTcxYsXVahQoXyIGAAAAABwu7rrznQ/9dRTKliwoLZt26ZOnTopIiJCISEhateunT7//HO1bdtWkmSz2TRnzhw98MADKly4sMaPH6+0tDT16dNH5cqVk7u7uypWrKjXXnvNof3o6Gi1b99eU6dOlb+/v3x9fdW/f39dvHjRqrNo0SJFRkaqSJEiKlWqlLp27aoTJ044tPPFF1+oQoUKcnd317333qvExESH+SdPnlSXLl1UunRpeXh4qGrVqnr//fed02kAAAAAgBtyVyXdJ0+e1Ndff63+/furcOHCWdax2WzW/8eOHasOHTpox44d6t27t9LT01WmTBktW7ZMu3fv1ujRo/XCCy/oww8/dGhj3bp1SkhI0Lp16/Tuu+8qNjZWsbGx1vyLFy9q3Lhxio+P18qVK5WYmKjo6Ghr/pEjR/Tggw+qbdu2iouL02OPPabnn3/eYR3nz59X7dq19fnnn2vnzp3q16+fevTooS1btmS7/ampqUpOTnaYAAAAAADOYzPGmPwO4p/y448/qn79+lqxYoU6dOhglRcvXlznz5+XJPXv31+TJ0+WzWbTkCFDNH369Gu2OWDAAB0/flzLly+XdPlM9/r165WQkKACBQpIkjp16iQXFxctXbo0yza2bdumOnXq6MyZM/L09NQLL7ygTz75RLt27bLqPP/885o8ebJOnTolHx+fLNtp06aNwsPDNXXq1Cznjx07VjExMZnKA4d8KBe7xzW3EwAA4HaVOKl1focA4A6UnJwsb29vJSUlycvLK9t6d9WZ7uxs2bJFcXFxqly5slJTU63yyMjITHVff/111a5dW35+fvL09NRbb72lw4cPO9SpXLmylXBLkr+/v8Pl4z/99JPatm2roKAgFSlSRE2bNpUkq509e/aoXr16Dm02aNDA4XVaWprGjRunqlWrqlixYvL09NSqVasyxXKlESNGKCkpyZqOHDlyva4BAAAAANyEu2ogtdDQUNlsNu3bt8+hPCQkRJLk7u7uUH71JehLly7V0KFDNW3aNDVo0EBFihTRlClT9OOPPzrUu3rANZvNpvT0dEnS2bNnFRUVpaioKC1evFh+fn46fPiwoqKidOHChRxvy5QpU/Taa69pxowZqlq1qgoXLqwhQ4Zcsw273S673Z7jdQAAAAAAbs5dlXT7+vrqvvvu0+zZszVw4MBs7+vOzqZNm9SwYUM99dRTVllCQkKu2ti7d69OnjypSZMmKTAwUNLly8uvFBERoU8//dSh7IcffsgUS7t27dS9e3dJUnp6un799VdVqlQpV/EAAAAAAJznrru8/I033tClS5cUGRmpDz74QHv27NG+ffv03nvvae/evQ6XhV8tLCxM27Zt06pVq/Trr79q1KhR2rp1a67WHxQUJFdXV82aNUsHDx7Up59+qnHjxjnUeeKJJ7R//34999xz2rdvn5YsWeIwEFtGLKtXr9bmzZu1Z88ePf744/rjjz9yFQsAAAAAwLnuuqS7fPny2r59u1q2bKkRI0aoevXqioyM1KxZszR06NBMCfCVHn/8cT344IPq3Lmz6tWrp5MnTzqc9c4JPz8/xcbGatmyZapUqZImTZqUaeCzoKAgffTRR1q5cqWqV6+uN998UxMmTHCo8+KLL6pWrVqKiopSs2bNVKpUKbVv3z5XsQAAAAAAnOuuGr0cjjJG22P0cgAAcCdj9HIAzsDo5QAAAAAA5DOSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEpJuAAAAAACcpGB+B4D8tzMm6ppD3AMAAAAAbgxnugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEkYvh6qMWSUXu0d+hwEAAJAjiZNa53cIAJBjnOkGAAAAAMBJSLoBAAAAAHASkm4AAAAAAJyEpBsAAAAAACch6QYAAAAAwElIugEAAAAAcBKS7ttIcHCwZsyYkd9hAAAAAABy6LZIuqOjo2Wz2fTEE09kmte/f3/ZbDZFR0dLkmw22zWnsWPHZrmOZs2aWXXc3NxUqVIlvfHGG07cKgAAAADAne62SLolKTAwUEuXLtXff/9tlZ0/f15LlixRUFCQVXbs2DFrmjFjhry8vBzKhg4dmu06+vbtq2PHjmn37t3q1KmT+vfvr/fff9+p2wUAAAAAuHPdNkl3rVq1FBgYqBUrVlhlK1asUFBQkGrWrGmVlSpVypq8vb1ls9kcyjw9PbNdh4eHh0qVKqWQkBCNHTtWYWFh+vTTTyVJhw8fVrt27eTp6SkvLy916tRJf/zxh7VscHBwlmfWJWn9+vWy2Ww6ffq0VT8uLk42m02JiYlW2caNG9W4cWO5u7srMDBQgwYN0tmzZ7ON93oxAQAAAADy122TdEtS7969tWDBAuv1O++8o169ejltfe7u7rpw4YLS09PVrl07/fXXX/r222+1evVqHTx4UJ07d7bqbt261Tqb/vvvv6t+/fpq3LhxjteVkJCgVq1a6aGHHtIvv/yiDz74QBs3btSAAQOyrJ+TmK6Wmpqq5ORkhwkAAAAA4DwF8zuA3OjevbtGjBihQ4cOSZI2bdqkpUuXav369Xm6nrS0NL3//vv65Zdf1K9fP61du1Y7duzQb7/9psDAQEnSwoULVblyZW3dulV16tSRn5+ftfzgwYN17Ngxbd26NcfrnDhxorp166YhQ4ZIksLCwjRz5kw1bdpUc+bMkZubm0P9nMSU1TpiYmJy2x0AAAAAgBt0W53p9vPzU+vWrRUbG6sFCxaodevWKl68eJ61/8Ybb8jT01Pu7u7q27evnn76aT355JPas2ePAgMDreRWkipVqiQfHx/t2bPHoY233npL8+fP16effuqQiF9PfHy8YmNj5enpaU1RUVFKT0/Xb7/9lql+bmLKMGLECCUlJVnTkSNHchwfAAAAACD3bqsz3dLlS8wzLrl+/fXX87Ttbt26aeTIkXJ3d5e/v79cXHL3m8S6des0cOBAvf/++6pWrZpVntGOMcYqu3jxosOyKSkpevzxxzVo0KBM7V45UNzNsNvtstvtedIWAAAAAOD6bruku1WrVrpw4YJsNpuioqLytG1vb2+FhoZmKo+IiNCRI0d05MgR68zy7t27dfr0aVWqVEmSdODAAXXs2FEvvPCCHnzwQYflM854Hzt2TEWLFpV0eSC1K9WqVUu7d+/Ocv1ZyUlMAAAAAID8dVtdXi5JBQoU0J49e7R7924VKFDgH1lny5YtVbVqVXXr1k0///yztmzZokcffVRNmzZVZGSk/v77b7Vt21Y1a9ZUv379dPz4cWuSpNDQUAUGBmrs2LHav3+/Pv/8c02bNs1hHcOHD9fmzZs1YMAAxcXFaf/+/frkk0+yHUjtejEBAAAAAPLfbZd0S5KXl5e8vLz+sfXZbDZ98sknKlq0qJo0aaKWLVsqJCREH3zwgSTpjz/+0N69e7V27VoFBATI39/fmiSpUKFCev/997V3715Vq1ZNkydP1ssvv+ywjmrVqunbb7/Vr7/+qsaNG6tmzZoaPXq0AgICbigmAAAAAED+s5krbzTGXSU5OVne3t4KHPKhXOwe+R0OAABAjiROap3fIQCAlU8lJSVd86TwbXmmGwAAAACA2wFJNwAAAAAATkLSDQAAAACAk5B0AwAAAADgJCTdAAAAAAA4CUk3AAAAAABOUjC/A0D+2xkT9Y8+9xwAAAAA7hac6QYAAAAAwElIugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASRi9HKoyZpVc7B75HQYAALjDJU5qnd8hAMA/jjPdAAAAAAA4CUk3AAAAAABOQtINAAAAAICTkHQDAAAAAOAkJN0AAAAAADgJSTcAAAAAAE5C0u1kiYmJstlsiouLy+9QAAAAAAD/MJLuLERHR8tms+mJJ57INK9///6y2WyKjo7+5wMDAAAAANxWSLqzERgYqKVLl+rvv/+2ys6fP68lS5YoKCgoHyMDAAAAANwuSLqzUatWLQUGBmrFihVW2YoVKxQUFKSaNWtaZV999ZXuuece+fj4yNfXV23atFFCQkK27aalpalPnz4qV66c3N3dVbFiRb322msOdS5duqRBgwZZbQ4fPlw9e/ZU+/btb3i9AAAAAIB/Hkn3NfTu3VsLFiywXr/zzjvq1auXQ52zZ8/qmWee0bZt27R27Vq5uLioQ4cOSk9Pz7LN9PR0lSlTRsuWLdPu3bs1evRovfDCC/rwww+tOpMnT9bixYu1YMECbdq0ScnJyVq5cuVNrVeSUlNTlZyc7DABAAAAAJzHZowx+R3ErSY6OlqnT5/WvHnzFBgYqH379kmSwsPDdeTIET322GPy8fFRbGxspmX//PNP+fn5aceOHapSpYoSExNVrlw5bd++XTVq1MhyfQMGDNDx48e1fPlySVKpUqU0dOhQDR06VNLls+MhISGqWbNmpuQ7u/VmZezYsYqJiclUHjjkQ7nYPa7TKwAAADcncVLr/A4BAPJMcnKyvL29lZSUJC8vr2zrcab7Gvz8/NS6dWvFxsZqwYIFat26tYoXL+5QZ//+/erSpYtCQkLk5eWl4OBgSdLhw4ezbff1119X7dq15efnJ09PT7311ltW/aSkJP3xxx+qW7euVb9AgQKqXbv2Ta93xIgRSkpKsqYjR47kpjsAAAAAALlUML8DuNX17t1bAwYMkHQ5Wb5a27ZtVbZsWc2bN08BAQFKT09XlSpVdOHChSzbW7p0qYYOHapp06apQYMGKlKkiKZMmaIff/wxV3Hldr2SZLfbZbfbc7UeAAAAAMCNI+m+jlatWunChQuy2WyKiopymHfy5Ent27dP8+bNU+PGjSVJGzduvGZ7mzZtUsOGDfXUU09ZZVcOgObt7a2SJUtq69atatKkiaTLl5f//PPP1uXpN7JeAAAAAMA/j6T7OgoUKKA9e/ZY/79S0aJF5evrq7feekv+/v46fPiwnn/++Wu2FxYWpoULF2rVqlUqV66cFi1apK1bt6pcuXJWnYEDB2rixIkKDQ1VeHi4Zs2apVOnTslms93wegEAAAAA/zzu6c4BLy+vLG+Md3Fx0dKlS/XTTz+pSpUqevrppzVlypRrtvX444/rwQcfVOfOnVWvXj2dPHnS4ay3JA0fPlxdunTRo48+qgYNGsjT01NRUVFyc3O74fUCAAAAAP55jF5+G0hPT1dERIQ6deqkcePG5Vm7GaPtMXo5AAD4JzB6OYA7SU5HL+fy8lvQoUOH9PXXX6tp06ZKTU3V7Nmz9dtvv6lr1675HRoAAAAAIBe4vPwW5OLiotjYWNWpU0eNGjXSjh07tGbNGkVEROR3aAAAAACAXOBM9y0oMDBQmzZtyu8wAAAAAAA3iTPdAAAAAAA4CUk3AAAAAABOQtINAAAAAICTcE83tDMm6ppD3AMAAAAAbgxnugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEkYvh6qMWSUXu0d+hwEAAO5giZNa53cIAJAvONMNAAAAAICTkHQDAAAAAOAkJN0AAAAAADgJSTcAAAAAAE5C0g0AAAAAgJOQdAMAAAAA4CQk3bk0duxY1ahRw3odHR2t9u3bW6+bNWumIUOG5Li99evXy2az6fTp05Kk2NhY+fj45EmsAAAAAID8RdJ9hbZt26pVq1ZZztuwYYNsNpsefPBBrV279h+ODAAAAABwOyLpvkKfPn20evVq/f7775nmLViwQJGRkapWrZp8fX3zIToAAAAAwO2GpPsKbdq0kZ+fn2JjYx3KU1JStGzZMvXp0yfT5eXXs2jRIkVGRqpIkSIqVaqUunbtqhMnTlx3uZUrVyosLExubm6KiorSkSNHrHkJCQlq166dSpYsKU9PT9WpU0dr1qzJcUwAAAAAgH8GSfcVChYsqEcffVSxsbEyxljly5YtU1pamrp06ZLrNi9evKhx48YpPj5eK1euVGJioqKjo6+5zLlz5zR+/HgtXLhQmzZt0unTp/XII49Y81NSUnT//fdr7dq12r59u1q1aqW2bdvq8OHD12w3NTVVycnJDhMAAAAAwHlIuq/Su3dvJSQk6Ntvv7XKFixYoIceekje3t431N6///1vhYSEqH79+po5c6a+/PJLpaSkZLvMxYsXNXv2bDVo0EC1a9fWu+++q82bN2vLli2SpOrVq+vxxx9XlSpVFBYWpnHjxql8+fL69NNPrxnLxIkT5e3tbU2BgYG53h4AAAAAQM6RdF8lPDxcDRs21DvvvCNJOnDggDZs2KA+ffrcUHs//fST2rZtq6CgIBUpUkRNmzaVpGuelS5YsKDq1KnjEJOPj4/27Nkj6fKZ7qFDhyoiIkI+Pj7y9PTUnj17rnume8SIEUpKSrKmKy9ZBwAAAADkPZLuLPTp00cfffSRzpw5owULFqh8+fJWspwbZ8+eVVRUlLy8vLR48WJt3bpVH3/8sSTpwoULNxzf0KFD9fHHH2vChAnasGGD4uLiVLVq1eu2abfb5eXl5TABAAAAAJyHpDsLnTp1kouLi5YsWaKFCxeqd+/estlsuW5n7969OnnypCZNmqTGjRsrPDw8R4OoXbp0Sdu2bbNe79u3T6dPn1ZERIQkadOmTYqOjlaHDh1UtWpVlSpVSomJibmODwAAAADgXCTdWfD09FTnzp01YsQIHTt27LoDn2UnKChIrq6umjVrlg4ePKhPP/1U48aNu+5yhQoV0sCBA/Xjjz/qp59+UnR0tOrXr6+6detKksLCwrRixQrFxcUpPj5eXbt2VXp6+g3FCAAAAABwHpLubPTp00enTp1SVFSUAgICbqiNjMePLVu2TJUqVdKkSZM0derU6y7n4eGh4cOHq2vXrmrUqJE8PT31wQcfWPNfffVVFS1aVA0bNlTbtm0VFRWlWrVq3VCMAAAAAADnsZkrn42Fu0pycvLlUcyHfCgXu0d+hwMAAO5giZNa53cIAJCnMvKppKSka46XxZluAAAAAACchKQbAAAAAAAnIekGAAAAAMBJSLoBAAAAAHASkm4AAAAAAJyEpBsAAAAAACcpmN8BIP/tjIm65hD3AAAAAIAbw5luAAAAAACchKQbAAAAAAAnIekGAAAAAMBJSLoBAAAAAHASkm4AAAAAAJyE0cuhKmNWycXukd9hAACAf1jipNb5HQIA3PE40w0AAAAAgJOQdAMAAAAA4CQk3QAAAAAAOAlJNwAAAAAATkLSDQAAAACAk5B0AwAAAADgJCTdt7Dg4GDNmDHDem2z2bRy5cp8iwcAAAAAkDu3ZNIdHR0tm82mJ554ItO8/v37y2azKTo6WtLlRPRa09ixY7Ndz4EDB9SrVy+VKVNGdrtd5cqVU5cuXbRt2zYnbRkAAAAA4G5ySybdkhQYGKilS5fq77//tsrOnz+vJUuWKCgoyCo7duyYNc2YMUNeXl4OZUOHDs2y/W3btql27dr69ddfNXfuXO3evVsff/yxwsPD9eyzz95w3BcuXLjhZQEAAAAAd5ZbNumuVauWAgMDtWLFCqtsxYoVCgoKUs2aNa2yUqVKWZO3t7dsNptDmaenZ6a2jTGKjo5WWFiYNmzYoNatW6t8+fKqUaOGxowZo08++cSqu2PHDjVv3lzu7u7y9fVVv379lJKSYs2Pjo5W+/btNX78eAUEBKhixYpKTEyUzWbTihUrdO+998rDw0PVq1fX999/7xDHxo0b1bhxY7m7uyswMFCDBg3S2bNnc9xHw4cPV4UKFeTh4aGQkBCNGjVKFy9ezPHyAAAAAADnumWTbknq3bu3FixYYL1+55131KtXr5tuNy4uTrt27dKzzz4rF5fMXeDj4yNJOnv2rKKiolS0aFFt3bpVy5Yt05o1azRgwACH+mvXrtW+ffu0evVqffbZZ1b5yJEjNXToUMXFxalChQrq0qWLLl26JElKSEhQq1at9NBDD+mXX37RBx98oI0bN2Zq+1qKFCmi2NhY7d69W6+99prmzZun6dOnZ1s/NTVVycnJDhMAAAAAwHlu6aS7e/fu2rhxow4dOqRDhw5p06ZN6t69+023u3//fklSeHj4NestWbJE58+f18KFC1WlShU1b95cs2fP1qJFi/THH39Y9QoXLqy3335blStXVuXKla3yoUOHqnXr1qpQoYJiYmJ06NAhHThwQJI0ceJEdevWTUOGDFFYWJgaNmyomTNnauHChTp//nyOtuPFF19Uw4YNFRwcrLZt22ro0KH68MMPs60/ceJEeXt7W1NgYGCO1gMAAAAAuDEF8zuAa/Hz81Pr1q0VGxsrY4xat26t4sWL33S7xpgc1duzZ4+qV6+uwoULW2WNGjVSenq69u3bp5IlS0qSqlatKldX10zLV6tWzfq/v7+/JOnEiRMKDw9XfHy8fvnlFy1evNghrvT0dP3222+KiIi4bnwffPCBZs6cqYSEBKWkpOjSpUvy8vLKtv6IESP0zDPPWK+Tk5NJvAEAAADAiW7ppFu6fIl5xiXXr7/+ep60WaFCBUnS3r17He4Pv1FXJuVXKlSokPV/m80mSUpPT5ckpaSk6PHHH9egQYMyLXflQHHZ+f7779WtWzfFxMQoKipK3t7eWrp0qaZNm5btMna7XXa7/bptAwAAAADyxi2fdLdq1UoXLlyQzWZTVFRUnrRZo0YNVapUSdOmTVPnzp0z3dd9+vRp+fj4KCIiQrGxsTp79qyVWG/atEkuLi6qWLHiTcVQq1Yt7d69W6GhoTe0/ObNm1W2bFmNHDnSKjt06NBNxQQAAAAAyFu39D3dklSgQAHt2bNHu3fvVoECBfKkTZvNpgULFujXX39V48aN9cUXX+jgwYP65ZdfNH78eLVr106S1K1bN7m5ualnz57auXOn1q1bp4EDB6pHjx7WpeU3avjw4dq8ebMGDBiguLg47d+/X5988kmOB1ILCwvT4cOHtXTpUiUkJGjmzJn6+OOPbyomAAAAAEDeuuWTbkny8vK65r3KN6Ju3bratm2bQkND1bdvX0VEROiBBx7Qrl27NGPGDEmSh4eHVq1apb/++kt16tRRx44d1aJFC82ePfum11+tWjV9++23VuJfs2ZNjR49WgEBATla/oEHHtDTTz+tAQMGqEaNGtq8ebNGjRp103EBAAAAAPKOzeR0VDHccZKTky+PYj7kQ7nYPfI7HAAA8A9LnNQ6v0MAgNtWRj6VlJR0zZPEt8WZbgAAAAAAbkck3QAAAAAAOAlJNwAAAAAATkLSDQAAAACAk5B0AwAAAADgJCTdAAAAAAA4ScH8DgD5b2dMVJ4/Bx0AAAAAwJluAAAAAACchqQbAAAAAAAnIekGAAAAAMBJSLoBAAAAAHASkm4AAAAAAJyE0cuhKmNWycXukd9hAABwR0uc1Dq/QwAA5APOdAMAAAAA4CQk3QAAAAAAOAlJNwAAAAAATkLSDQAAAACAk5B0AwAAAADgJCTdAAAAAAA4CUn3FdavXy+bzabTp0/ndygAAAAAgDvAXZl0f//99ypQoIBat+Z5mQAAAAAA57krk+758+dr4MCB+u6773T06NF/bL3GGF26dOkfWx8AAAAAIH/ddUl3SkqKPvjgAz355JNq3bq1YmNjr1l/06ZNatasmTw8PFS0aFFFRUXp1KlTkqTU1FQNGjRIJUqUkJubm+655x5t3brVWjbjcvUvv/xStWvXlt1u18aNG5Wenq5XXnlFoaGhstvtCgoK0vjx463lduzYoebNm8vd3V2+vr7q16+fUlJSrPnR0dFq3769pk6dKn9/f/n6+qp///66ePFi3nYWAAAAAOCm3HVJ94cffqjw8HBVrFhR3bt31zvvvCNjTJZ14+Li1KJFC1WqVEnff/+9Nm7cqLZt2yotLU2SNGzYMH300Ud699139fPPPys0NFRRUVH666+/HNp5/vnnNWnSJO3Zs0fVqlXTiBEjNGnSJI0aNUq7d+/WkiVLVLJkSUnS2bNnFRUVpaJFi2rr1q1atmyZ1qxZowEDBji0uW7dOiUkJGjdunV69913FRsbe90fEFJTU5WcnOwwAQAAAACcx2ayyzjvUI0aNVKnTp00ePBgXbp0Sf7+/lq2bJmaNWum9evX695779WpU6fk4+Ojrl276vDhw9q4cWOmds6ePauiRYsqNjZWXbt2lSRdvHhRwcHBGjJkiJ577jmrvZUrV6pdu3aSpDNnzsjPz0+zZ8/WY489lqndefPmafjw4Tpy5IgKFy4sSfriiy/Utm1bHT16VCVLllR0dLTWr1+vhIQEFShQQJLUqVMnubi4aOnSpdlu+9ixYxUTE5OpPHDIh3Kxe+S+MwEAQI4lTmIsGQC4kyQnJ8vb21tJSUny8vLKtt5ddaZ737592rJli7p06SJJKliwoDp37qz58+dnWT/jTHdWEhISdPHiRTVq1MgqK1SokOrWras9e/Y41I2MjLT+v2fPHqWmpmbb7p49e1S9enUr4ZYu/1CQnp6uffv2WWWVK1e2Em5J8vf314kTJ7LbdEnSiBEjlJSUZE1Hjhy5Zn0AAAAAwM0pmN8B/JPmz5+vS5cuKSAgwCozxshut2v27NmZ6ru7u+fJeq9MoPOqzUKFCjm8ttlsSk9Pv+Yydrtddrs9T9YPAAAAALi+u+ZM96VLl7Rw4UJNmzZNcXFx1hQfH6+AgAC9//77mZapVq2a1q5dm2V75cuXl6urqzZt2mSVXbx4UVu3blWlSpWyjSMsLEzu7u7ZthsREaH4+HidPXvWKtu0aZNcXFxUsWLFnG4uAAAAAOAWcNck3Z999plOnTqlPn36qEqVKg7TQw89lOUl5iNGjNDWrVv11FNP6ZdfftHevXs1Z84c/fnnnypcuLCefPJJPffcc/rqq6+0e/du9e3bV+fOnVOfPn2yjcPNzU3Dhw/XsGHDtHDhQiUkJOiHH36w1t+tWze5ubmpZ8+e2rlzp9atW6eBAweqR48e1mBrAAAAAIDbw11zefn8+fPVsmVLeXt7Z5r30EMP6ZVXXtEvv/ziUF6hQgV9/fXXeuGFF1S3bl25u7urXr161j3hkyZNUnp6unr06KEzZ84oMjJSq1atUtGiRa8Zy6hRo1SwYEGNHj1aR48elb+/v5544glJkoeHh1atWqXBgwerTp068vDw0EMPPaRXX301j3oCAAAAAPBPuetGL8f/ZIy2x+jlAAA4H6OXA8CdhdHLAQAAAADIZyTdAAAAAAA4CUk3AAAAAABOQtINAAAAAICTkHQDAAAAAOAkJN0AAAAAADjJXfOcbmRvZ0zUNYe4BwAAAADcGM50AwAAAADgJCTdAAAAAAA4CUk3AAAAAABOQtINAAAAAICTkHQDAAAAAOAkjF4OVRmzSi52j/wOAwCAO0ripNb5HQIA4BbAmW4AAAAAAJyEpBsAAAAAACch6QYAAAAAwElIugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpvoOMHTtWNWrUyO8wAAAAAAD/H0n3dURHR6t9+/Z52mZwcLBsNptsNps8PDxUtWpVvf3223m6DgAAAABA/iPpzicvvfSSjh07pp07d6p79+7q27evvvzyy/wOCwAAAACQh0i6b9Krr76qqlWrqnDhwgoMDNRTTz2llJSU6y5XpEgRlSpVSiEhIRo+fLiKFSum1atXW/NPnz6txx57TH5+fvLy8lLz5s0VHx/v0MakSZNUsmRJFSlSRH369NH58+fzfPsAAAAAADeOpPsmubi4aObMmdq1a5feffddffPNNxo2bFiOl09PT9dHH32kU6dOydXV1Sp/+OGHdeLECX355Zf66aefVKtWLbVo0UJ//fWXJOnDDz/U2LFjNWHCBG3btk3+/v564403rrmu1NRUJScnO0wAAAAAAOexGWNMfgdxK4uOjtbp06e1cuXKHNVfvny5nnjiCf3555/Z1gkODtaxY8dUqFAhpaam6tKlSypWrJh+/PFHhYaGauPGjWrdurVOnDghu91uLRcaGqphw4apX79+atiwoWrWrKnXX3/dml+/fn2dP39ecXFxWa537NixiomJyVQeOORDudg9crR9AAAgZxIntc7vEAAATpScnCxvb28lJSXJy8sr23qc6b5Ja9asUYsWLVS6dGkVKVJEPXr00MmTJ3Xu3LlrLvfcc88pLi5O33zzjerVq6fp06crNDRUkhQfH6+UlBT5+vrK09PTmn777TclJCRIkvbs2aN69eo5tNmgQYNrrnPEiBFKSkqypiNHjtzElgMAAAAArqdgfgdwO0tMTFSbNm305JNPavz48SpWrJg2btyoPn366MKFC/LwyP7scfHixRUaGqrQ0FAtW7ZMVatWVWRkpCpVqqSUlBT5+/tr/fr1mZbz8fG54XjtdrvDmXMAAAAAgHNxpvsm/PTTT0pPT9e0adNUv359VahQQUePHs11O4GBgercubNGjBghSapVq5aOHz+uggULWol5xlS8eHFJUkREhH788UeHdn744Yeb3ygAAAAAQJ7hTHcOJCUlZbpP2tfXV6Ghobp48aJmzZqltm3batOmTXrzzTdvaB2DBw9WlSpVtG3bNrVs2VINGjRQ+/bt9corr1jJ/Oeff64OHTooMjJSgwcPVnR0tCIjI9WoUSMtXrxYu3btUkhISB5sMQAAAAAgL3CmOwfWr1+vmjVrOkwxMTGqXr26Xn31VU2ePFlVqlTR4sWLNXHixBtaR6VKlfSvf/1Lo0ePls1m0xdffKEmTZqoV69eqlChgh555BEdOnRIJUuWlCR17txZo0aN0rBhw1S7dm0dOnRITz75ZF5uNgAAAADgJjF6+V0sY7Q9Ri8HACDvMXo5ANzZGL0cAAAAAIB8RtINAAAAAICTkHQDAAAAAOAkJN0AAAAAADgJSTcAAAAAAE5C0g0AAAAAgJMUzO8AkP92xkRdc4h7AAAAAMCN4Uw3AAAAAABOQtINAAAAAICTkHQDAAAAAOAkJN0AAAAAADgJSTcAAAAAAE7C6OVQlTGr5GL3yO8wAAD4RyROap3fIQAA7iKc6QYAAAAAwElIugEAAAAAcBKSbgAAAAAAnISkGwAAAAAAJyHpBgAAAADASUi6AQAAAABwEpLuHFq/fr1sNptOnz6dL+uPjo5W+/bt82XdAAAAAIAbQ9J9le+//14FChRQ69a31jM8X3vtNcXGxuZ3GAAAAACAXCDpvsr8+fM1cOBAfffddzp69Gh+h6O0tDSlp6fL29tbPj4++R0OAAAAACAXSLqvkJKSog8++EBPPvmkWrdufc0zy7GxsfLx8dFnn32mihUrysPDQx07dtS5c+f07rvvKjg4WEWLFtWgQYOUlpZmLZeamqqhQ4eqdOnSKly4sOrVq6f169dnavfTTz9VpUqVZLfbdfjw4UyXl3/11Ve655575OPjI19fX7Vp00YJCQlO6BUAAAAAwI0i6b7Chx9+qPDwcFWsWFHdu3fXO++8I2NMtvXPnTunmTNnaunSpfrqq6+0fv16dejQQV988YW++OILLVq0SHPnztXy5cutZQYMGKDvv/9eS5cu1S+//KKHH35YrVq10v79+x3anTx5st5++23t2rVLJUqUyLTus2fP6plnntG2bdu0du1aubi4qEOHDkpPT8823tTUVCUnJztMAAAAAADnKZjfAdxK5s+fr+7du0uSWrVqpaSkJH377bdq1qxZlvUvXryoOXPmqHz58pKkjh07atGiRfrjjz/k6empSpUq6d5779W6devUuXNnHT58WAsWLNDhw4cVEPD/2rv38JjOtX/g38lhJieTkYNIiMQpEiIRx0aolhBqZ6OusjVvhdq8SB1Kuze7fR26i9rKVqpRqoJ6sVu1VVshQoI4RSIHEpFEJHkRIUEkDjndvz/srJ+Rk5YRh+/nuua6Mut51lr3Wuueydyz1nrGCQDwwQcfIDw8HOvXr8fChQuV5X711Vfw9vauNdbhw4frPf/2229hb2+PlJQUeHp61jjPokWLMH/+/N+0T4iIiIiIiOj345nu/0hLS8OJEycwatQoAICJiQlGjhyJdevW1TqPhYWFUnADgIODA1xdXWFlZaU3LT8/HwCQnJyMiooKuLm5wcrKSnlER0frXRquVqvh5eVVZ7zp6ekYNWoUWrVqBa1WC1dXVwBATk5OrfPMnj0bN2/eVB65ubl1roOIiIiIiIgeD890/8e6detQXl6unIEGABGBRqPBl19+WeM8pqames9VKlWN06ou+S4uLoaxsTHi4uJgbGys1+/BQt3c3BwqlarOeAMDA+Hi4oK1a9fCyckJlZWV8PT0RGlpaa3zaDQaaDSaOpdLRERERERETw6LbgDl5eXYuHEjli5digEDBui1DR06FFu2bIG7u/tjr8fHxwcVFRXIz89H7969f/dyCgoKkJaWhrVr1yrLOXz48GPHR0RERERERE8Wi24AP//8M65fv45x48bB2tpar2348OFYt24dlixZ8tjrcXNzQ1BQEEaPHo2lS5fCx8cHV69eRWRkJLy8vB75t8EbN24MW1tbrFmzBo6OjsjJycGsWbMeOz4iIiIiIiJ6snhPN+5fWu7v71+t4AbuF90nT55EUlLSE1nX+vXrMXr0aMycORPt2rXD0KFDERsbixYtWjzyMoyMjLB161bExcXB09MT77///hP5UoCIiIiIiIieLJXU9ZtY9EIrKiqCtbU1nKf/C0Yai4YOh4iI6Km48NmjXVlGRERUl6p66ubNm9BqtbX245luIiIiIiIiIgNh0U1ERERERERkICy6iYiIiIiIiAyERTcRERERERGRgbDoJiIiIiIiIjIQFt1EREREREREBmLS0AFQwzs9P6DOIe6JiIiIiIjo9+GZbiIiIiIiIiIDYdFNREREREREZCAsuomIiIiIiIgMhEU3ERERERERkYGw6CYiIiIiIiIyEI5eTvCcuwdGGouGDoOIiOipuPDZ4IYOgYiIXiI8001ERERERERkICy6iYiIiIiIiAyERTcRERERERGRgbDoJiIiIiIiIjIQFt1EREREREREBsKim4iIiIiIiMhAWHQ/Ja+99hqmT5+uPHd1dcXy5csbLB4iIiIiIiIyvBem6M7Ly8OUKVPQqlUraDQaODs7IzAwEJGRkQ0dmkEUFhZiypQpaNeuHczNzdGiRQtMnToVN2/ebOjQiIiIiIiI6D9MGjqAJ+HChQvw8/ODTqfDkiVL0LFjR5SVlWHPnj0ICQnB2bNnf9dyS0tLoVarn3C0T8alS5dw6dIlfP7552jfvj2ys7MxceJEXLp0CT/88ENDh0dERERERER4Qc50T548GSqVCidOnMDw4cPh5uaGDh06YMaMGTh27JjSLycnB0OGDIGVlRW0Wi1GjBiBK1euKO3z5s1Dp06d8M0336Bly5YwMzMDAKhUKnzzzTcYNmwYLCws0LZtW/z00096MZw+fRqDBg2ClZUVHBwc8M477+DatWuPvA3Lli1Dx44dYWlpCWdnZ0yePBnFxcW1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "top_regen = regen.head(15).iloc[::-1]\n", + "fig, ax = plt.subplots(figsize=(10, 6))\n", + "y = range(len(top_regen))\n", + "ax.barh(y, top_regen.q0_regenerados_aqui)\n", + "ax.set_yticks(list(y)); ax.set_yticklabels(top_regen.center_name)\n", + "ax.set_xlabel('# Q0 (de call_center) regenerados en este centro')\n", + "ax.set_title('Top centros regeneradores de presupuesto call_center (90d Q0, 60d window)')\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b0f6c55c", + "metadata": {}, + "source": [ + "## Q4 — ¿Regenerar perjudica la conversión propia del Q0?\n", + "\n", + "Conversión del Q0 = el invoice se genera contra el MISMO order_id del Q0 (no contra el order_id regenerado en centro). Si regeneran, ese flujo cae." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "423b68cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bucketq0_totalq0_facturado_propioconv_q0_propio
0no_regenerado35507223900.6306
1regenerado1848871580.3872
\n", + "
" + ], + "text/plain": [ + " bucket q0_total q0_facturado_propio conv_q0_propio\n", + "0 no_regenerado 35507 22390 0.6306\n", + "1 regenerado 18488 7158 0.3872" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load('04_regen_vs_conversion')" + ] + }, + { + "cell_type": "markdown", + "id": "4956e2d1", + "metadata": {}, + "source": [ + "**Lectura:**\n", + "- 35.5K Q0 sin regeneración convierten al **63.1%** (sobre el order_id original).\n", + "- 18.5K Q0 con regeneración convierten al **38.7%** sobre el order_id original.\n", + "- Los 'regenerados' no se 'pierden' necesariamente — el cliente puede haberse facturado vía un order_id distinto (el del centro). Esa parte está capturada en el KPI **B** del cuadro anterior.\n", + "- Aprox **34.2% de los Q0 call_center** entran en patrón de regeneración (18488 / 53995)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/01_exploracion.ipynb b/notebooks/01_exploracion.ipynb new file mode 100644 index 0000000..de9e67c --- /dev/null +++ b/notebooks/01_exploracion.ipynb @@ -0,0 +1,214 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "07306d98", + "metadata": {}, + "source": [ + "# 01 — Exploración: quotes ↔ call_center ↔ factura\n", + "\n", + "Mapa de tablas y joins en `psql_dcpublic` (BigQuery `autingo-159109`).\n", + "\n", + "## Cadena de joins\n", + "\n", + "```\n", + "tpv_authorization_tpvuser_centers (dccenter_id ∈ {159 CALL_CENTER_AURGI, 162 CALL_CENTER})\n", + " │ tpvuser_id\n", + " ▼\n", + "tpv_orders_quote.created_by_id ──► quote por agente call_center\n", + " │ order_id\n", + " ▼\n", + "tpv_orders_order ─► terminal_id ─► tpv_terminals.center_id ─► centers (centro real de facturación)\n", + " │ │ customer_id │ vehicle_id\n", + " ▼ ▼ ▼\n", + "tpv_orders_invoice (status convertido) tpv_customers (tlf) tpv_vehicles_vehicle (matrícula)\n", + "```\n", + "\n", + "Identidad cliente = `(customer_id, vehicle_id)` o (tlf, matrícula) según necesite normalización." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2b6d545", + "metadata": {}, + "outputs": [], + "source": [ + "import os, sys\n", + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "3238b92e", + "metadata": {}, + "source": [ + "## 1. Usuarios call_center" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34d656ad", + "metadata": {}, + "outputs": [], + "source": [ + "cc_users = q(f\"\"\"\n", + "SELECT u.id, u.name, u.email, u.is_active, u.role_id,\n", + " STRING_AGG(CAST(uc.dccenter_id AS STRING)) AS centers\n", + "FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser` u\n", + "JOIN `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` uc\n", + " ON u.id = uc.tpvuser_id\n", + "WHERE uc.dccenter_id IN (159, 162)\n", + "GROUP BY 1,2,3,4,5\n", + "ORDER BY u.is_active DESC, u.id\n", + "\"\"\")\n", + "print(f\"Total usuarios call_center: {len(cc_users)} (activos: {cc_users.is_active.sum()})\")\n", + "cc_users.head(20)" + ] + }, + { + "cell_type": "markdown", + "id": "9ec102fb", + "metadata": {}, + "source": [ + "## 2. Schema quote — campos clave" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5f94b52", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT column_name, data_type\n", + "FROM `{PROJECT}.{DATASET}.INFORMATION_SCHEMA.COLUMNS`\n", + "WHERE table_name='tpv_orders_quote'\n", + "ORDER BY ordinal_position\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "32ffc1d2", + "metadata": {}, + "source": [ + "## 3. Distribución `status` y `accepted` (últimos 90d)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "609022a9", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT status, accepted, COUNT(*) n\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote`\n", + "WHERE created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND deleted_at IS NULL\n", + "GROUP BY status, accepted\n", + "ORDER BY n DESC\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "73c85198", + "metadata": {}, + "source": [ + "## 4. Conversion quote → invoice (mismo order_id)\n", + "\n", + "Una quote convierte cuando existe `tpv_orders_invoice` con el mismo `order_id`. Ese invoice fija la facturación real (NAV-sync via `nav_id`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46378f84", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "SELECT\n", + " COUNT(*) AS quotes,\n", + " COUNT(DISTINCT q.order_id) AS distinct_orders,\n", + " SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) AS quotes_con_invoice,\n", + " SAFE_DIVIDE(SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END), COUNT(*)) AS conversion_rate\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + "LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i\n", + " ON q.order_id = i.order_id\n", + "WHERE q.created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND q.deleted_at IS NULL\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "df8b402c", + "metadata": {}, + "source": [ + "## 5. Sanity: quote por call_center vs otro\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "506744d3", + "metadata": {}, + "outputs": [], + "source": [ + "q(f\"\"\"\n", + "WITH cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + ")\n", + "SELECT\n", + " CASE WHEN cc.user_id IS NOT NULL THEN 'call_center' ELSE 'otro' END AS origen_user,\n", + " COUNT(*) AS quotes,\n", + " SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) AS convertidos,\n", + " ROUND(SAFE_DIVIDE(SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END), COUNT(*)), 3) AS conv_rate\n", + "FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + "LEFT JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + "LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON q.order_id = i.order_id\n", + "WHERE q.created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)\n", + " AND q.deleted_at IS NULL\n", + "GROUP BY 1\n", + "\"\"\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/02_metricas_3kpi.ipynb b/notebooks/02_metricas_3kpi.ipynb new file mode 100644 index 0000000..a7a5707 --- /dev/null +++ b/notebooks/02_metricas_3kpi.ipynb @@ -0,0 +1,244 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36ae91c9", + "metadata": {}, + "source": [ + "# 02 — 3 KPI principales\n", + "\n", + "Por **centro real de facturación** (`tpv_terminals.center_id` del invoice) y ventana temporal:\n", + "\n", + "1. **A — Valor facturado de quotes call_center que CONVIRTIERON** \n", + " Quote creado por usuario call_center + existe `tpv_orders_invoice` con el mismo `order_id`. Sumamos `tpv_orders_order.total_cost` o líneas. Centro = centro del invoice.\n", + "\n", + "2. **B — Valor facturado total a esos mismos clientes en centros** \n", + " Misma identidad cliente (`customer_id` y/o `vehicle_id` y/o `tlf`+`matricula` normalizados). Todas las facturas del cliente en ese centro en la misma ventana. Debe ser ≥ A.\n", + "\n", + "3. **C — Facturación total del centro** \n", + " Suma de invoices del centro en la ventana, todos los clientes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7938921f", + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "WINDOW_DAYS = 90\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "c7cfa785", + "metadata": {}, + "source": [ + "## Setup: CTEs base reutilizables\n", + "\n", + "Construimos una query maestra con CTEs para A, B, C juntos por centro." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e06df33", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_KPI = f\"\"\"\n", + "DECLARE window_days INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL window_days DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "-- Quotes creados por call_center que TIENEN invoice (convertidos)\n", + "cc_converted AS (\n", + " SELECT\n", + " q.id AS quote_id,\n", + " q.order_id,\n", + " q.created_at AS quote_ts,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id,\n", + " o.total_cost,\n", + " i.id AS invoice_id,\n", + " i.created_at AS invoice_ts\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.created_at >= t_start\n", + " AND q.deleted_at IS NULL\n", + "),\n", + "-- Clientes \"tocados\" por call_center (customer_id + vehicle_id)\n", + "cc_clients AS (\n", + " SELECT DISTINCT center_id, customer_id, vehicle_id\n", + " FROM cc_converted\n", + " WHERE customer_id IS NOT NULL\n", + "),\n", + "-- Todas las facturas en la ventana, con centro real\n", + "all_invoices AS (\n", + " SELECT\n", + " i.id AS invoice_id,\n", + " i.order_id,\n", + " i.created_at AS invoice_ts,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id,\n", + " o.total_cost\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_invoice` i\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON i.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE i.created_at >= t_start\n", + "),\n", + "-- B: facturas de los mismos clientes en cualquier centro NO call_center\n", + "client_invoices_in_centers AS (\n", + " SELECT ai.*\n", + " FROM all_invoices ai\n", + " JOIN cc_clients cc ON ai.customer_id = cc.customer_id\n", + " WHERE ai.center_id NOT IN (159, 162) -- excluye los propios centros call_center\n", + "),\n", + "kpi_a AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT quote_id) AS quotes_cc_convertidos,\n", + " COUNT(DISTINCT invoice_id) AS invoices_a,\n", + " SUM(total_cost) AS valor_a\n", + " FROM cc_converted\n", + " WHERE center_id IS NOT NULL\n", + " GROUP BY center_id\n", + "),\n", + "kpi_b AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT invoice_id) AS invoices_b,\n", + " SUM(total_cost) AS valor_b\n", + " FROM client_invoices_in_centers\n", + " GROUP BY center_id\n", + "),\n", + "kpi_c AS (\n", + " SELECT center_id,\n", + " COUNT(DISTINCT invoice_id) AS invoices_c,\n", + " SUM(total_cost) AS valor_c\n", + " FROM all_invoices\n", + " WHERE center_id IS NOT NULL\n", + " GROUP BY center_id\n", + ")\n", + "SELECT\n", + " c.id AS center_id,\n", + " c.name AS center_name,\n", + " COALESCE(a.quotes_cc_convertidos, 0) AS quotes_cc_convertidos,\n", + " ROUND(COALESCE(a.valor_a, 0), 2) AS A_valor_quote_cc_convertido,\n", + " ROUND(COALESCE(b.valor_b, 0), 2) AS B_valor_mismo_cliente_centro,\n", + " ROUND(COALESCE(c2.valor_c, 0), 2) AS C_valor_total_centro,\n", + " ROUND(SAFE_DIVIDE(COALESCE(a.valor_a, 0), c2.valor_c), 4) AS A_sobre_C,\n", + " ROUND(SAFE_DIVIDE(COALESCE(b.valor_b, 0), c2.valor_c), 4) AS B_sobre_C\n", + "FROM `{PROJECT}.{DATASET}.centers` c\n", + "LEFT JOIN kpi_a a ON c.id = a.center_id\n", + "LEFT JOIN kpi_b b ON c.id = b.center_id\n", + "LEFT JOIN kpi_c c2 ON c.id = c2.center_id\n", + "WHERE c.id NOT IN (159, 162)\n", + " AND COALESCE(c2.valor_c, 0) > 0\n", + "ORDER BY C_valor_total_centro DESC\n", + "\"\"\"\n", + "\n", + "df = q(SQL_KPI)\n", + "print(f\"Centros con actividad ({WINDOW_DAYS}d): {len(df)}\")\n", + "df.head(30)" + ] + }, + { + "cell_type": "markdown", + "id": "724baf5c", + "metadata": {}, + "source": [ + "## Totales globales" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75c3297e", + "metadata": {}, + "outputs": [], + "source": [ + "totals = df[[\"A_valor_quote_cc_convertido\", \"B_valor_mismo_cliente_centro\", \"C_valor_total_centro\"]].sum()\n", + "print(totals.to_string())\n", + "print()\n", + "print(f\"A/C global: {totals.A_valor_quote_cc_convertido / totals.C_valor_total_centro:.4f}\")\n", + "print(f\"B/C global: {totals.B_valor_mismo_cliente_centro / totals.C_valor_total_centro:.4f}\")\n", + "print(f\"Lift B vs A: {totals.B_valor_mismo_cliente_centro / totals.A_valor_quote_cc_convertido:.2f}x\")" + ] + }, + { + "cell_type": "markdown", + "id": "0fba60db", + "metadata": {}, + "source": [ + "## Top 15 centros por A (valor traído por call_center)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f90abe7e", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "top = df.sort_values(\"A_valor_quote_cc_convertido\", ascending=False).head(15)\n", + "fig, ax = plt.subplots(figsize=(10, 6))\n", + "x = range(len(top))\n", + "ax.barh(x, top.A_valor_quote_cc_convertido, label=\"A (cc → factura)\")\n", + "ax.barh(x, top.B_valor_mismo_cliente_centro - top.A_valor_quote_cc_convertido,\n", + " left=top.A_valor_quote_cc_convertido, label=\"B−A (mismo cliente extra)\")\n", + "ax.set_yticks(x)\n", + "ax.set_yticklabels(top.center_name)\n", + "ax.invert_yaxis()\n", + "ax.set_xlabel(\"€ facturados\")\n", + "ax.legend()\n", + "ax.set_title(f\"Top 15 centros — quotes call_center ({WINDOW_DAYS}d)\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/03_regeneracion.ipynb b/notebooks/03_regeneracion.ipynb new file mode 100644 index 0000000..11d8edd --- /dev/null +++ b/notebooks/03_regeneracion.ipynb @@ -0,0 +1,367 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b090f346", + "metadata": {}, + "source": [ + "# 03 — Regeneración de presupuestos\n", + "\n", + "**Hipótesis:** un mismo cliente (`customer_id` + `vehicle_id`) recibe N quotes antes de convertir. El centro \"regenera\" el presupuesto cuando descarta el de call_center y abre uno nuevo en TPV local.\n", + "\n", + "Definición operativa de regeneración:\n", + "- Existe quote call_center previa (Q0) para el par cliente+vehículo.\n", + "- Existe quote posterior (Q1...Qn) en un terminal de centro NO call_center, dentro de ventana D días.\n", + "- Q1 puede tener distinto `order_id` que Q0 (regenera de cero) o mismo (reescribe — menos común).\n", + "\n", + "Métricas pedidas:\n", + "1. Centros que MÁS regeneran (cuentan regeneraciones absolutas y % sobre quotes call_center recibidos).\n", + "2. Quotes call_center con regeneración vs sin regeneración." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5626c2cd", + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import bigquery\n", + "import pandas as pd\n", + "\n", + "PROJECT = \"autingo-159109\"\n", + "DATASET = \"psql_dcpublic\"\n", + "bq = bigquery.Client(project=PROJECT)\n", + "\n", + "WINDOW_DAYS = 90 # ventana de análisis sobre quote call_center\n", + "REGEN_WINDOW_DAYS = 60 # ventana para detectar regeneración posterior\n", + "\n", + "def q(sql):\n", + " return bq.query(sql).to_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17cff6ce", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_REGEN = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "-- Q0: quotes generados por call_center\n", + "q0 AS (\n", + " SELECT\n", + " q.id AS q0_id,\n", + " q.order_id AS q0_order,\n", + " q.created_at AS q0_ts,\n", + " o.customer_id,\n", + " o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start\n", + " AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL\n", + " AND o.vehicle_id IS NOT NULL\n", + "),\n", + "-- Q1..Qn: quotes posteriores para mismo cliente+vehículo, en centro NO call_center\n", + "qN AS (\n", + " SELECT\n", + " q.id AS qn_id,\n", + " q.order_id AS qn_order,\n", + " q.created_at AS qn_ts,\n", + " q.created_by_id,\n", + " o.customer_id,\n", + " o.vehicle_id,\n", + " o.terminal_id,\n", + " t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL\n", + " AND t.center_id NOT IN (159, 162)\n", + "),\n", + "-- Empareja Q0 con Q1+ dentro de regen_win días\n", + "regen AS (\n", + " SELECT\n", + " q0.q0_id,\n", + " q0.q0_order,\n", + " q0.customer_id,\n", + " q0.vehicle_id,\n", + " qN.qn_id,\n", + " qN.qn_order,\n", + " qN.center_id AS regen_center,\n", + " TIMESTAMP_DIFF(qN.qn_ts, q0.q0_ts, HOUR) / 24 AS dias_entre\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "),\n", + "-- Para cada Q0, ¿hay al menos UNA regeneración?\n", + "q0_has_regen AS (\n", + " SELECT q0_id, COUNT(*) AS regen_count,\n", + " MIN(dias_entre) AS dias_a_regen,\n", + " APPROX_TOP_COUNT(regen_center, 1)[OFFSET(0)].value AS first_regen_center\n", + " FROM regen\n", + " GROUP BY q0_id\n", + ")\n", + "\n", + "-- Vista por centro: cuántos Q0 regenera cada centro\n", + "SELECT\n", + " c.id AS center_id,\n", + " c.name AS center_name,\n", + " COUNT(DISTINCT r.q0_id) AS q0_regenerados_aqui,\n", + " COUNT(*) AS regen_events,\n", + " ROUND(AVG(r.dias_entre), 1) AS dias_avg_regen\n", + "FROM regen r\n", + "JOIN `{PROJECT}.{DATASET}.centers` c ON r.regen_center = c.id\n", + "GROUP BY c.id, c.name\n", + "ORDER BY q0_regenerados_aqui DESC\n", + "LIMIT 30\n", + "\"\"\"\n", + "\n", + "df_centros = q(SQL_REGEN)\n", + "print(f\"Centros con eventos de regeneración: {len(df_centros)}\")\n", + "df_centros.head(30)" + ] + }, + { + "cell_type": "markdown", + "id": "43add847", + "metadata": {}, + "source": [ + "## Totales: Q0 con regeneración vs sin regeneración" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "736158ba", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_TOT = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + "),\n", + "regen AS (\n", + " SELECT DISTINCT q0.q0_id\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + ")\n", + "SELECT\n", + " COUNT(*) AS q0_total,\n", + " COUNT(DISTINCT r.q0_id) AS q0_regenerados,\n", + " COUNT(*) - COUNT(DISTINCT r.q0_id) AS q0_no_regenerados,\n", + " ROUND(SAFE_DIVIDE(COUNT(DISTINCT r.q0_id), COUNT(*)), 4) AS pct_regenerados\n", + "FROM q0\n", + "LEFT JOIN regen r USING (q0_id)\n", + "\"\"\"\n", + "q(SQL_TOT)" + ] + }, + { + "cell_type": "markdown", + "id": "c183a653", + "metadata": {}, + "source": [ + "## Distribución días hasta regeneración" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aab452ca", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_DIAS = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + ")\n", + "SELECT\n", + " TIMESTAMP_DIFF(qN.qn_ts, q0.q0_ts, HOUR)/24 AS dias_entre\n", + "FROM q0\n", + "JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "\"\"\"\n", + "dias = q(SQL_DIAS)\n", + "print(dias.describe())\n", + "import matplotlib.pyplot as plt\n", + "dias[\"dias_entre\"].clip(upper=60).hist(bins=30)\n", + "plt.xlabel(\"Días entre Q0 (call_center) y Q1 (centro)\")\n", + "plt.ylabel(\"# eventos\")\n", + "plt.title(\"Distribución de regeneración temporal\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0feaa9c1", + "metadata": {}, + "source": [ + "## Cruzar regeneración con conversión a factura\n", + "\n", + "¿Los Q0 regenerados convierten MENOS que los Q0 no regenerados? (Hipótesis: el cliente prefiere lo que negocia el centro)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "376502d8", + "metadata": {}, + "outputs": [], + "source": [ + "SQL_CONV = f\"\"\"\n", + "DECLARE win INT64 DEFAULT {WINDOW_DAYS};\n", + "DECLARE regen_win INT64 DEFAULT {REGEN_WINDOW_DAYS};\n", + "DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL win DAY);\n", + "\n", + "WITH\n", + "cc_users AS (\n", + " SELECT DISTINCT tpvuser_id AS user_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers`\n", + " WHERE dccenter_id IN (159, 162)\n", + "),\n", + "q0 AS (\n", + " SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts,\n", + " o.customer_id, o.vehicle_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN cc_users cc ON q.created_by_id = cc.user_id\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " WHERE q.created_at >= t_start AND q.deleted_at IS NULL\n", + " AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL\n", + "),\n", + "qN AS (\n", + " SELECT q.order_id AS qn_order, q.created_at AS qn_ts,\n", + " o.customer_id, o.vehicle_id, t.center_id\n", + " FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q\n", + " JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id\n", + " WHERE q.deleted_at IS NULL\n", + " AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162)\n", + "),\n", + "regen AS (\n", + " SELECT DISTINCT q0.q0_id\n", + " FROM q0\n", + " JOIN qN\n", + " ON q0.customer_id = qN.customer_id\n", + " AND q0.vehicle_id = qN.vehicle_id\n", + " AND qN.qn_ts > q0.q0_ts\n", + " AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL regen_win DAY)\n", + " AND qN.qn_order != q0.q0_order\n", + "),\n", + "q0_inv AS (\n", + " SELECT q0.q0_id,\n", + " CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END AS q0_factura\n", + " FROM q0\n", + " LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = q0.q0_order\n", + ")\n", + "SELECT\n", + " CASE WHEN r.q0_id IS NOT NULL THEN 'regenerado' ELSE 'no_regenerado' END AS bucket,\n", + " COUNT(*) AS q0_total,\n", + " SUM(qi.q0_factura) AS q0_convertido_propio,\n", + " ROUND(SAFE_DIVIDE(SUM(qi.q0_factura), COUNT(*)), 4) AS conv_q0_propio\n", + "FROM q0_inv qi\n", + "LEFT JOIN regen r USING (q0_id)\n", + "GROUP BY bucket\n", + "\"\"\"\n", + "q(SQL_CONV)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..110388a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "presupuestos-callcenter" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "google-cloud-bigquery>=3.41.0", + "jupyter>=1.1.1", + "jupyter-collaboration>=4.4.0", + "jupyter-mcp-server>=1.0.2", + "jupyterlab>=4.5.7", + "matplotlib>=3.10.9", + "numpy>=2.4.6", + "pandas>=3.0.3", + "seaborn>=0.13.2", +] diff --git a/rewire_filters_by_name.py b/rewire_filters_by_name.py new file mode 100644 index 0000000..f3c1108 --- /dev/null +++ b/rewire_filters_by_name.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python3 +"""Re-wire dashboard 1019 filters to use NAME columns (searchable + multi-select dropdown). + +Reason: ID PK fields tienen has_field_values=none -> no dropdown. +Name columns: has_field_values=list (companies) o search (centers/tpvuser/products). +Multi-select via string/= con isMultiSelect=True. +""" +import json +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +DB_ID = 6 +DASHBOARD_ID = 1019 + +# Field IDs (name/description columns) +F_QUOTE_CREATED_AT = 16588 +F_CENTER_NAME = 17330 # centers.name +F_TPVUSER_NAME = 17958 # tpv_authorization_tpvuser.name +F_COMPANY_NAME = 17158 # companies.name +F_PRODUCT_DESC = 16795 # products.description + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=180) + + +def field_filter_tag(name, field_id, widget, display_name): + return { + "id": name + "-tag", + "name": name, + "display-name": display_name, + "type": "dimension", + "dimension": ["field", field_id, None], + "widget-type": widget, + "default": None, + } + + +TAGS_AB = { + "date": field_filter_tag("date", F_QUOTE_CREATED_AT, "date/range", "Fecha presupuesto"), + "centro": field_filter_tag("centro", F_CENTER_NAME, "string/=", "Centro"), + "agente": field_filter_tag("agente", F_TPVUSER_NAME, "string/=", "Agente CC"), + "compania": field_filter_tag("compania", F_COMPANY_NAME, "string/=", "Compañía"), + "producto": field_filter_tag("producto", F_PRODUCT_DESC, "string/contains", "Producto"), +} +TAGS_C = {k: v for k, v in TAGS_AB.items() if k != "agente"} + + +# SQL must reference products table now (join via orderitem.product_id) +SQL_A = """ +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.products` ON `psql_dcpublic.tpv_orders_orderitem`.product_id = `psql_dcpublic.products`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + AND COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{agente}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +SQL_B = """ +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `psql_dcpublic.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +quotes_q1 AS (SELECT id, order_id, created_at, deleted_at FROM `psql_dcpublic.tpv_orders_quote`), +orders_q1 AS (SELECT id, customer_id, vehicle_id, terminal_id FROM `psql_dcpublic.tpv_orders_order`), +terminals_q1 AS (SELECT id, center_id FROM `psql_dcpublic.tpv_terminals`), +cc_anchored AS ( + SELECT + `psql_dcpublic.tpv_orders_quote`.id AS q0_id, + `psql_dcpublic.tpv_orders_quote`.order_id AS q0_order, + `psql_dcpublic.tpv_orders_quote`.created_at AS q0_ts, + `psql_dcpublic.tpv_orders_quote`.created_by_id AS cc_agent_id, + `psql_dcpublic.tpv_orders_order`.customer_id AS cust_id, + `psql_dcpublic.tpv_orders_order`.vehicle_id AS veh_id + FROM `psql_dcpublic.tpv_orders_quote` + JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + [[AND {{date}}]] + [[AND {{agente}}]] +), +b_orders AS ( + -- Solo Q1 regenerados (sin Q-CC directos) + SELECT q1.order_id AS order_id + FROM cc_anchored a + JOIN quotes_q1 q1 + ON q1.deleted_at IS NULL + AND q1.created_at > a.q0_ts + AND q1.created_at <= TIMESTAMP_ADD(a.q0_ts, INTERVAL 60 DAY) + AND q1.order_id != a.q0_order + JOIN orders_q1 o1 ON q1.order_id = o1.id + LEFT JOIN terminals_q1 t1 ON o1.terminal_id = t1.id + WHERE o1.customer_id = a.cust_id + AND o1.vehicle_id = a.veh_id + AND t1.center_id IS NOT NULL + AND t1.center_id NOT IN (159, 162) + GROUP BY q1.order_id +), +filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM b_orders + JOIN `psql_dcpublic.tpv_orders_order` ON b_orders.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.products` ON `psql_dcpublic.tpv_orders_orderitem`.product_id = `psql_dcpublic.products`.id + WHERE COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +SQL_C = """ +WITH filtered AS ( + SELECT DISTINCT + `psql_dcpublic.tpv_orders_invoice`.id AS invoice_id, + `psql_dcpublic.tpv_orders_order`.total_cost AS total_cost + FROM `psql_dcpublic.tpv_orders_quote` + JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id + JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id + LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id + LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id + LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id + LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id + LEFT JOIN `psql_dcpublic.products` ON `psql_dcpublic.tpv_orders_orderitem`.product_id = `psql_dcpublic.products`.id + WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL + AND COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162) + [[AND {{date}}]] + [[AND {{centro}}]] + [[AND {{compania}}]] + [[AND {{producto}}]] +) +SELECT __AGG__ AS valor FROM filtered +""" + +AGG = { + "total": "ROUND(SUM(total_cost), 2)", + "count": "COUNT(*)", + "ticket": "ROUND(SAFE_DIVIDE(SUM(total_cost), NULLIF(COUNT(*), 0)), 2)", +} + + +# Card ids actuales del dashboard v2 +CARDS = { + "a_total": (10248, SQL_A, "total"), + "a_count": (10249, SQL_A, "count"), + "a_ticket": (10250, SQL_A, "ticket"), + "b_total": (10251, SQL_B, "total"), + "b_count": (10252, SQL_B, "count"), + "b_ticket": (10253, SQL_B, "ticket"), + "c_total": (10254, SQL_C, "total"), + "c_count": (10255, SQL_C, "count"), + "c_ticket": (10256, SQL_C, "ticket"), +} + + +def get_card(cid): + return client.get(f"/api/card/{cid}").json() + + +def put_card_sql(cid, sql, tags, viz): + body = { + "dataset_query": { + "type": "native", "database": DB_ID, + "native": {"query": sql, "template-tags": tags}, + }, + "visualization_settings": viz, + } + r = client.put(f"/api/card/{cid}", json=body) + if r.status_code >= 400: + print(r.status_code, r.text[:500]) + r.raise_for_status() + + +print("rewiring cards...") +for sid, (cid, skel, agg) in CARDS.items(): + tags = TAGS_AB if sid[0] in "ab" else TAGS_C + sql = skel.replace("__AGG__", AGG[agg]) + # preserve current viz settings + cur = get_card(cid) + viz = cur.get("visualization_settings", {}) + put_card_sql(cid, sql, tags, viz) + print(f" {sid} card={cid} updated") + + +print("\nupdating dashboard parameters to multi-select string filters...") +new_params = [ + {"id": "p_date", "name": "Fecha presupuesto", "slug": "fecha", "sectionId": "date", "type": "date/range"}, + {"id": "p_centro", "name": "Centro", "slug": "centro", "sectionId": "string", "type": "string/=", + "isMultiSelect": True}, + {"id": "p_agente", "name": "Agente CC", "slug": "agente", "sectionId": "string", "type": "string/=", + "isMultiSelect": True}, + {"id": "p_compania", "name": "Compañía", "slug": "compania", "sectionId": "string", "type": "string/=", + "isMultiSelect": True}, + {"id": "p_producto", "name": "Producto", "slug": "producto", "sectionId": "string", "type": "string/contains", + "isMultiSelect": True}, +] + +# Para que el dropdown se llene con los valores del field-filter dimension, +# Metabase usa has_field_values del field destino automaticamente. No requiere config extra. + +# Re-fetch dashcards para mantener layout + remap parameter_mappings (tags actuales) +dash = client.get(f"/api/dashboard/{DASHBOARD_ID}").json() + +# Map current dashcards: card_id -> tag_keys (depende si A/B o C) +def tag_keys_for_card(card_id): + name = next((c["name"] for c in [client.get(f"/api/card/{cid}").json() for cid in [card_id]]), "") + return list(TAGS_C.keys()) if name.startswith("C ·") else list(TAGS_AB.keys()) + +new_dashcards = [] +for dc in dash["dashcards"]: + cname = dc["card"]["name"] + tag_keys = list(TAGS_C.keys()) if cname.startswith("C ·") else list(TAGS_AB.keys()) + new_dashcards.append({ + "id": dc["id"], + "card_id": dc["card_id"], + "row": dc["row"], "col": dc["col"], + "size_x": dc["size_x"], "size_y": dc["size_y"], + "visualization_settings": dc.get("visualization_settings", {}), + "parameter_mappings": [ + {"parameter_id": f"p_{k}", "card_id": dc["card_id"], + "target": ["dimension", ["template-tag", k]]} + for k in tag_keys + ], + }) + +r = client.put(f"/api/dashboard/{DASHBOARD_ID}", json={ + "parameters": new_params, + "dashcards": new_dashcards, +}) +if r.status_code >= 400: + print(r.status_code, r.text[:800]) + r.raise_for_status() + +print("done") +print(f"URL: {BASE}/dashboard/{DASHBOARD_ID}") +client.close() diff --git a/run-jupyter-lab.sh b/run-jupyter-lab.sh new file mode 100755 index 0000000..0739b68 --- /dev/null +++ b/run-jupyter-lab.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Jupyter Lab — modo colaborativo con autodeteccion de puerto +# Generado por write_jupyter_launcher (fn_registry) + +find_free_port() { + for port in 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899; do + if ! ss -tln 2>/dev/null | grep -q ":${port} " && \ + ! lsof -i:"$port" >/dev/null 2>&1; then + echo $port + return + fi + done + echo 8888 +} + +PORT=${1:-$(find_free_port)} +cd "$(dirname "$0")" + +echo $PORT > .jupyter-port + +source .venv/bin/activate 2>/dev/null || true + +# IPython startup: cargar .ipython/ local (FN_REGISTRY_ROOT, helpers, sys.path) +if [ -d "$(pwd)/.ipython" ]; then + export IPYTHONDIR="$(pwd)/.ipython" +fi + +if ! python -c "import jupyter_collaboration" 2>/dev/null; then + echo "ERROR: jupyter-collaboration no esta instalado" + echo "Instala con: uv add jupyter-collaboration" + exit 1 +fi + +echo "════════════════════════════════════════════════" +echo " Jupyter Lab + Colaboracion en puerto $PORT" +echo "════════════════════════════════════════════════" +echo "" +echo " Abre: http://localhost:$PORT" +echo " Ctrl+C para detener" +echo "" + +jupyter lab \ + --port=$PORT \ + --no-browser \ + --ServerApp.token='' \ + --ServerApp.password='' \ + --ServerApp.disable_check_xsrf=True \ + --ServerApp.allow_origin='*' \ + --ServerApp.root_dir="$(pwd)" \ + --collaborative diff --git a/run_via_metabase.py b/run_via_metabase.py new file mode 100644 index 0000000..9753f48 --- /dev/null +++ b/run_via_metabase.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +"""Execute the analysis queries against BigQuery via Metabase (db=6). + +Saves results as CSV + JSON in data/results/ and prints summary numbers. +ADC-free: uses Metabase service account credentials. +""" +import os +import sys +import json +import csv +from pathlib import Path + +sys.path.insert(0, os.path.join(os.environ.get("FN_REGISTRY_ROOT", "/home/egutierrez/fn_registry"), "python", "functions")) + +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +DB_ID = 6 +HERE = Path(__file__).parent +OUT = HERE / "data" / "results" +OUT.mkdir(parents=True, exist_ok=True) + +PROJECT = "autingo-159109" +DATASET = "psql_dcpublic" +WINDOW_DAYS = 90 +REGEN_WINDOW_DAYS = 60 + +client = httpx.Client( + base_url=BASE, + headers={"x-api-key": API_KEY, "Content-Type": "application/json"}, + timeout=300.0, +) + + +def run_sql(sql: str) -> tuple[list[str], list[list]]: + payload = { + "type": "native", + "database": DB_ID, + "native": {"query": sql}, + } + r = client.post("/api/dataset", json=payload) + r.raise_for_status() + data = r.json()["data"] + cols = [c["display_name"] for c in data["cols"]] + rows = data["rows"] + return cols, rows + + +def save(name: str, cols: list[str], rows: list[list]) -> None: + csv_path = OUT / f"{name}.csv" + with csv_path.open("w", newline="") as f: + w = csv.writer(f) + w.writerow(cols) + w.writerows(rows) + json_path = OUT / f"{name}.json" + with json_path.open("w") as f: + json.dump({"cols": cols, "rows": rows}, f, indent=2, default=str) + print(f" -> {csv_path.name} ({len(rows)} rows)") + + +# ===================================================================== +# QUERY 0 — Sanity: usuarios call_center +# ===================================================================== +print("\n[Q0] usuarios call_center") +cols, rows = run_sql(f""" +SELECT + COUNT(DISTINCT u.id) AS users_totales, + SUM(CASE WHEN u.is_active THEN 1 ELSE 0 END) AS users_activos +FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser` u +JOIN `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` uc + ON u.id = uc.tpvuser_id +WHERE uc.dccenter_id IN (159, 162) +""") +save("00_users_callcenter", cols, rows) +print(f" {dict(zip(cols, rows[0]))}") + +# ===================================================================== +# QUERY 1 — Conversion rate global por origen +# ===================================================================== +print(f"\n[Q1] conversion global ({WINDOW_DAYS}d)") +cols, rows = run_sql(f""" +WITH cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +) +SELECT + CASE WHEN cc.user_id IS NOT NULL THEN 'call_center' ELSE 'otro' END AS origen, + COUNT(*) AS quotes, + SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) AS convertidos, + ROUND(SAFE_DIVIDE(SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END), COUNT(*)), 4) AS conv_rate +FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q +LEFT JOIN cc_users cc ON q.created_by_id = cc.user_id +LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON q.order_id = i.order_id +WHERE q.created_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL {WINDOW_DAYS} DAY) + AND q.deleted_at IS NULL +GROUP BY 1 +ORDER BY 1 +""") +save("01_conversion_origen", cols, rows) +for r in rows: + print(f" {dict(zip(cols, r))}") + +# ===================================================================== +# QUERY 2 — 3 KPI por centro (A, B, C) +# ===================================================================== +print(f"\n[Q2] KPI A/B/C por centro ({WINDOW_DAYS}d)") +cols, rows = run_sql(f""" +DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL {WINDOW_DAYS} DAY); + +WITH +cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +cc_converted AS ( + SELECT + q.id AS quote_id, q.order_id, o.customer_id, o.vehicle_id, + o.terminal_id, t.center_id, o.total_cost + FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q + JOIN cc_users cc ON q.created_by_id = cc.user_id + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id + JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = o.id + LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id + WHERE q.created_at >= t_start AND q.deleted_at IS NULL +), +cc_clients AS ( + SELECT DISTINCT customer_id, vehicle_id + FROM cc_converted + WHERE customer_id IS NOT NULL +), +all_invoices AS ( + SELECT + i.id AS invoice_id, i.order_id, + o.customer_id, o.vehicle_id, o.terminal_id, + t.center_id, o.total_cost + FROM `{PROJECT}.{DATASET}.tpv_orders_invoice` i + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON i.order_id = o.id + LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id + WHERE i.created_at >= t_start +), +client_invoices AS ( + SELECT ai.* + FROM all_invoices ai + JOIN cc_clients cc + ON ai.customer_id = cc.customer_id + AND ai.vehicle_id = cc.vehicle_id + WHERE ai.center_id NOT IN (159, 162) +), +kpi_a AS ( + SELECT center_id, + COUNT(DISTINCT quote_id) AS quotes_cc_facturados, + ROUND(SUM(total_cost), 2) AS A_eur + FROM cc_converted + WHERE center_id IS NOT NULL AND center_id NOT IN (159,162) + GROUP BY center_id +), +kpi_b AS ( + SELECT center_id, + COUNT(DISTINCT invoice_id) AS invoices_b, + ROUND(SUM(total_cost), 2) AS B_eur + FROM client_invoices + GROUP BY center_id +), +kpi_c AS ( + SELECT center_id, + COUNT(DISTINCT invoice_id) AS invoices_c, + ROUND(SUM(total_cost), 2) AS C_eur + FROM all_invoices + WHERE center_id IS NOT NULL AND center_id NOT IN (159,162) + GROUP BY center_id +) +SELECT + c.id AS center_id, + c.name AS center_name, + COALESCE(a.quotes_cc_facturados, 0) AS quotes_cc_facturados, + COALESCE(a.A_eur, 0) AS A_quote_cc_eur, + COALESCE(b.B_eur, 0) AS B_mismo_cliente_eur, + COALESCE(c2.C_eur, 0) AS C_total_centro_eur, + ROUND(SAFE_DIVIDE(COALESCE(a.A_eur, 0), c2.C_eur), 4) AS A_sobre_C, + ROUND(SAFE_DIVIDE(COALESCE(b.B_eur, 0), c2.C_eur), 4) AS B_sobre_C, + ROUND(SAFE_DIVIDE(COALESCE(b.B_eur, 0), NULLIF(a.A_eur, 0)), 2) AS lift_B_vs_A +FROM `{PROJECT}.{DATASET}.centers` c +LEFT JOIN kpi_a a ON c.id = a.center_id +LEFT JOIN kpi_b b ON c.id = b.center_id +LEFT JOIN kpi_c c2 ON c.id = c2.center_id +WHERE COALESCE(c2.C_eur, 0) > 0 +ORDER BY C_total_centro_eur DESC +""") +save("02_kpi_3_por_centro", cols, rows) +print(f" centros activos: {len(rows)}") +print(f" top5:") +for r in rows[:5]: + print(f" {r[1]:30} A={r[3]:>12,.0f} B={r[4]:>12,.0f} C={r[5]:>12,.0f}") + +# Totales globales +A_total = sum(r[3] for r in rows) +B_total = sum(r[4] for r in rows) +C_total = sum(r[5] for r in rows) +print(f"\n TOTALES ({WINDOW_DAYS}d, centros sin call_center 159/162):") +print(f" A (€ quote cc facturados): {A_total:>15,.2f}") +print(f" B (€ mismo cliente centro): {B_total:>15,.2f}") +print(f" C (€ total centros): {C_total:>15,.2f}") +print(f" A/C = {A_total/C_total:.4f} B/C = {B_total/C_total:.4f} lift B/A = {B_total/A_total:.2f}x") +with (OUT / "totales_globales.json").open("w") as f: + json.dump({ + "window_days": WINDOW_DAYS, + "A_quote_cc_eur": round(A_total, 2), + "B_mismo_cliente_eur": round(B_total, 2), + "C_total_centros_eur": round(C_total, 2), + "A_sobre_C": round(A_total / C_total, 4), + "B_sobre_C": round(B_total / C_total, 4), + "lift_B_vs_A": round(B_total / A_total, 2), + "centros_activos": len(rows), + }, f, indent=2) + +# ===================================================================== +# QUERY 3 — Regeneración por centro +# ===================================================================== +print(f"\n[Q3] regeneración por centro ({WINDOW_DAYS}d Q0, {REGEN_WINDOW_DAYS}d window)") +cols, rows = run_sql(f""" +DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL {WINDOW_DAYS} DAY); + +WITH +cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +q0 AS ( + SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts, + o.customer_id, o.vehicle_id + FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q + JOIN cc_users cc ON q.created_by_id = cc.user_id + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id + WHERE q.created_at >= t_start AND q.deleted_at IS NULL + AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL +), +qN AS ( + SELECT q.id AS qn_id, q.order_id AS qn_order, q.created_at AS qn_ts, + o.customer_id, o.vehicle_id, t.center_id + FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id + LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id + WHERE q.deleted_at IS NULL + AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162) +), +regen AS ( + SELECT q0.q0_id, q0.q0_order, q0.customer_id, q0.vehicle_id, + qN.qn_id, qN.qn_order, qN.center_id AS regen_center, + TIMESTAMP_DIFF(qN.qn_ts, q0.q0_ts, HOUR) / 24 AS dias_entre + FROM q0 + JOIN qN + ON q0.customer_id = qN.customer_id + AND q0.vehicle_id = qN.vehicle_id + AND qN.qn_ts > q0.q0_ts + AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL {REGEN_WINDOW_DAYS} DAY) + AND qN.qn_order != q0.q0_order +) +SELECT + c.id AS center_id, + c.name AS center_name, + COUNT(DISTINCT r.q0_id) AS q0_regenerados_aqui, + COUNT(*) AS regen_events, + ROUND(AVG(r.dias_entre), 1) AS dias_avg_regen +FROM regen r +JOIN `{PROJECT}.{DATASET}.centers` c ON r.regen_center = c.id +GROUP BY c.id, c.name +ORDER BY q0_regenerados_aqui DESC +LIMIT 30 +""") +save("03_regen_por_centro", cols, rows) +print(f" centros con regeneración: {len(rows)}") +print(f" top5:") +for r in rows[:5]: + print(f" {r[1]:30} q0={r[2]:>5} events={r[3]:>5} dias_avg={r[4]}") + +# ===================================================================== +# QUERY 4 — Totales Q0 con / sin regeneración +# ===================================================================== +print(f"\n[Q4] Q0 con/sin regeneración") +cols, rows = run_sql(f""" +DECLARE t_start TIMESTAMP DEFAULT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL {WINDOW_DAYS} DAY); + +WITH +cc_users AS ( + SELECT DISTINCT tpvuser_id AS user_id + FROM `{PROJECT}.{DATASET}.tpv_authorization_tpvuser_centers` + WHERE dccenter_id IN (159, 162) +), +q0 AS ( + SELECT q.id AS q0_id, q.order_id AS q0_order, q.created_at AS q0_ts, + o.customer_id, o.vehicle_id + FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q + JOIN cc_users cc ON q.created_by_id = cc.user_id + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id + WHERE q.created_at >= t_start AND q.deleted_at IS NULL + AND o.customer_id IS NOT NULL AND o.vehicle_id IS NOT NULL +), +qN AS ( + SELECT q.order_id AS qn_order, q.created_at AS qn_ts, + o.customer_id, o.vehicle_id, t.center_id + FROM `{PROJECT}.{DATASET}.tpv_orders_quote` q + JOIN `{PROJECT}.{DATASET}.tpv_orders_order` o ON q.order_id = o.id + LEFT JOIN `{PROJECT}.{DATASET}.tpv_terminals` t ON o.terminal_id = t.id + WHERE q.deleted_at IS NULL + AND t.center_id IS NOT NULL AND t.center_id NOT IN (159,162) +), +regen AS ( + SELECT DISTINCT q0.q0_id + FROM q0 + JOIN qN + ON q0.customer_id = qN.customer_id + AND q0.vehicle_id = qN.vehicle_id + AND qN.qn_ts > q0.q0_ts + AND qN.qn_ts <= TIMESTAMP_ADD(q0.q0_ts, INTERVAL {REGEN_WINDOW_DAYS} DAY) + AND qN.qn_order != q0.q0_order +), +q0_inv AS ( + SELECT q0.q0_id, + CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END AS q0_factura + FROM q0 + LEFT JOIN `{PROJECT}.{DATASET}.tpv_orders_invoice` i ON i.order_id = q0.q0_order +) +SELECT + CASE WHEN r.q0_id IS NOT NULL THEN 'regenerado' ELSE 'no_regenerado' END AS bucket, + COUNT(*) AS q0_total, + SUM(qi.q0_factura) AS q0_facturado_propio, + ROUND(SAFE_DIVIDE(SUM(qi.q0_factura), COUNT(*)), 4) AS conv_q0_propio +FROM q0_inv qi +LEFT JOIN regen r USING (q0_id) +GROUP BY bucket +ORDER BY bucket +""") +save("04_regen_vs_conversion", cols, rows) +for r in rows: + print(f" {dict(zip(cols, r))}") + +print("\nDONE — resultados en data/results/") +client.close() diff --git a/setup_dropdowns.py b/setup_dropdowns.py new file mode 100644 index 0000000..9b7f70f --- /dev/null +++ b/setup_dropdowns.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +"""Configure dashboard 1019 filters as multi-select dropdowns. + +PKs no tienen has_field_values=list, asi que Metabase no auto-lista. +Solucion: crear 3 cards "lookup" (id, name) y usarlas como values_source de cada parametro. + +Producto (2.7M rows) -> dropdown search (no card-source, busqueda en vivo). +""" +import json +import subprocess +import httpx + +API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0] +BASE = "https://reports.autingo.es" +COLLECTION_ID = 559 +DASHBOARD_ID = 1019 + +client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=180) + + +# Lookup cards: id, name (orden alfabetico) +LOOKUPS = { + "centers": """ + SELECT + `psql_dcpublic.centers`.id AS id, + `psql_dcpublic.centers`.name AS name + FROM `psql_dcpublic.centers` + WHERE `psql_dcpublic.centers`.id NOT IN (159, 162) + ORDER BY name + """, + "cc_users": """ + SELECT DISTINCT + `psql_dcpublic.tpv_authorization_tpvuser`.id AS id, + `psql_dcpublic.tpv_authorization_tpvuser`.name AS name + FROM `psql_dcpublic.tpv_authorization_tpvuser` + JOIN `psql_dcpublic.tpv_authorization_tpvuser_centers` + ON `psql_dcpublic.tpv_authorization_tpvuser`.id = `psql_dcpublic.tpv_authorization_tpvuser_centers`.tpvuser_id + WHERE `psql_dcpublic.tpv_authorization_tpvuser_centers`.dccenter_id IN (159, 162) + AND `psql_dcpublic.tpv_authorization_tpvuser`.is_active + ORDER BY name + """, + "companies": """ + SELECT + `psql_dcpublic.companies`.id AS id, + `psql_dcpublic.companies`.name AS name + FROM `psql_dcpublic.companies` + ORDER BY name + """, +} + +def make_lookup_card(slug: str, sql: str) -> int: + name = f"_lookup_{slug}" + body = { + "name": name, + "description": f"Lookup table for dashboard filter dropdown ({slug})", + "type": "question", + "display": "table", + "visualization_settings": {}, + "dataset_query": { + "type": "native", "database": 6, + "native": {"query": sql.strip(), "template-tags": {}}, + }, + "collection_id": COLLECTION_ID, + "result_metadata": None, + } + r = client.post("/api/card", json=body) + r.raise_for_status() + cid = r.json()["id"] + print(f" lookup card {slug:12} -> {cid}") + # Run query to populate result_metadata + client.post(f"/api/card/{cid}/query") + return cid + + +print("creating lookup cards...") +lookup_ids = {slug: make_lookup_card(slug, sql) for slug, sql in LOOKUPS.items()} + +# Re-read each card to pick up result_metadata field-ids (needed for value_field/label_field by name) +def field_ref(card_id, col_name): + """Reference column inside a native source card. Metabase accepts: + ['field', '', {'base-type': '...'}] + """ + c = client.get(f"/api/card/{card_id}").json() + for f in c.get("result_metadata", []) or []: + if f["name"] == col_name: + base = f.get("base_type", "type/Integer" if col_name == "id" else "type/Text") + return ["field", col_name, {"base-type": base}] + # fallback + return ["field", col_name, {"base-type": "type/Integer" if col_name == "id" else "type/Text"}] + + +print("\nupdating dashboard parameters...") +new_params = [ + {"id": "p_date", "name": "Fecha presupuesto", "slug": "fecha", + "sectionId": "date", "type": "date/range"}, + {"id": "p_centro", "name": "Centro", "slug": "centro", + "sectionId": "id", "type": "id", + "values_query_type": "list", + "values_source_type": "card", + "values_source_config": { + "card_id": lookup_ids["centers"], + "value_field": field_ref(lookup_ids["centers"], "id"), + "label_field": field_ref(lookup_ids["centers"], "name"), + }, + "isMultiSelect": True}, + {"id": "p_agente", "name": "Agente CC", "slug": "agente", + "sectionId": "id", "type": "id", + "values_query_type": "list", + "values_source_type": "card", + "values_source_config": { + "card_id": lookup_ids["cc_users"], + "value_field": field_ref(lookup_ids["cc_users"], "id"), + "label_field": field_ref(lookup_ids["cc_users"], "name"), + }, + "isMultiSelect": True}, + {"id": "p_compania", "name": "Compañía", "slug": "compania", + "sectionId": "id", "type": "id", + "values_query_type": "list", + "values_source_type": "card", + "values_source_config": { + "card_id": lookup_ids["companies"], + "value_field": field_ref(lookup_ids["companies"], "id"), + "label_field": field_ref(lookup_ids["companies"], "name"), + }, + "isMultiSelect": True}, + {"id": "p_producto", "name": "Producto", "slug": "producto", + "sectionId": "id", "type": "id", + "values_query_type": "search", + "values_source_type": None, + "values_source_config": {}, + "isMultiSelect": True}, +] + +r = client.put(f"/api/dashboard/{DASHBOARD_ID}", json={"parameters": new_params}) +r.raise_for_status() +print("dashboard updated") +print(f" URL: {BASE}/dashboard/{DASHBOARD_ID}") +client.close() diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..7557a1f --- /dev/null +++ b/uv.lock @@ -0,0 +1,3242 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +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/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]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +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/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]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +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/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 = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +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/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 = "click" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "cryptography" +version = "48.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, + { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" }, + { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastapi" +version = "0.136.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/45/c130091c2dfa061bbfe3150f2a5091ef1adf149f2a8d2ae769ecaf6e99a2/fastapi-0.136.1.tar.gz", hash = "sha256:7af665ad7acfa0a3baf8983d393b6b471b9da10ede59c60045f49fbc89a0fa7f", size = 397448, upload-time = "2026-04-23T16:49:44.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/ff/2e4eca3ade2c22fe1dea7043b8ee9dabe47753349eb1b56a202de8af6349/fastapi-0.136.1-py3-none-any.whl", hash = "sha256:a6e9d7eeada96c93a4d69cb03836b44fa34e2854accb7244a1ece36cd4781c3f", size = 117683, upload-time = "2026-04-23T16:49:42.437Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, + { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "google-api-core" +version = "2.30.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/ce/502a57fb0ec752026d24df1280b162294b22a0afb98a326084f9a979138b/google_api_core-2.30.3.tar.gz", hash = "sha256:e601a37f148585319b26db36e219df68c5d07b6382cff2d580e83404e44d641b", size = 177001, upload-time = "2026-04-10T00:41:28.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/15/e56f351cf6ef1cfea58e6ac226a7318ed1deb2218c4b3cc9bd9e4b786c5a/google_api_core-2.30.3-py3-none-any.whl", hash = "sha256:a85761ba72c444dad5d611c2220633480b2b6be2521eca69cca2dbb3ffd6bfe8", size = 173274, upload-time = "2026-04-09T22:57:16.198Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, + { name = "grpcio-status" }, +] + +[[package]] +name = "google-auth" +version = "2.53.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/ad/ff781329bbbdc0974a098d996e89c9e1f7024262f9e3eec442fbb9ad1ac6/google_auth-2.53.0.tar.gz", hash = "sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c", size = 335844, upload-time = "2026-05-15T20:53:07.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/c9/db44165ba7c581268c6d46017ef63339110378305062830104fc7fa144cb/google_auth-2.53.0-py3-none-any.whl", hash = "sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68", size = 246071, upload-time = "2026-05-15T20:53:05.609Z" }, +] + +[[package]] +name = "google-cloud-bigquery" +version = "3.41.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", extra = ["grpc"] }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-resumable-media" }, + { name = "packaging" }, + { name = "python-dateutil" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/13/6515c7aab55a4a0cf708ffd309fb9af5bab54c13e32dc22c5acd6497193c/google_cloud_bigquery-3.41.0.tar.gz", hash = "sha256:2217e488b47ed576360c9b2cc07d59d883a54b83167c0ef37f915c26b01a06fe", size = 513434, upload-time = "2026-03-30T22:50:55.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/33/1d3902efadef9194566d499d61507e1f038454e0b55499d2d7f8ab2a4fee/google_cloud_bigquery-3.41.0-py3-none-any.whl", hash = "sha256:2a5b5a737b401cbd824a6e5eac7554100b878668d908e6548836b5d8aaa4dcaa", size = 262343, upload-time = "2026-03-30T22:48:45.444Z" }, +] + +[[package]] +name = "google-cloud-core" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/dd/1eef226e470369b26824a505c34482c0b493bc35fe8e0c6b003b5feca21a/google_cloud_core-2.6.0.tar.gz", hash = "sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83", size = 36001, upload-time = "2026-05-07T08:04:04.124Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/4a/98da8930ab109c73d9a5d13782a9ebb81ea8c111f6d534a567b71d23e52b/google_cloud_core-2.6.0-py3-none-any.whl", hash = "sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e", size = 29390, upload-time = "2026-05-07T08:02:34.672Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, +] + +[[package]] +name = "google-resumable-media" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/4b/0b235beccc310d0a48adbc7246b719d173cca6c88c572dfa4b090e39143c/google_resumable_media-2.9.0.tar.gz", hash = "sha256:f7cfb224846a9dd444d125115dfbe8ef02a2b893e78f087762fe716a255a734b", size = 2164534, upload-time = "2026-05-07T08:04:44.236Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/73/3518e63deb1667c5409a4579e28daf5e84479a87a72c547e0487f7883dcd/google_resumable_media-2.9.0-py3-none-any.whl", hash = "sha256:c8901e88e389af8bed64d9696c74d8bad961865eb2236e13e0bfca9bb0a65ca3", size = 81507, upload-time = "2026-05-07T08:03:23.809Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.75.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, +] + +[[package]] +name = "grpcio" +version = "1.80.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size = 6017243, upload-time = "2026-03-30T08:47:40.075Z" }, + { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" }, + { url = "https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size = 7277830, upload-time = "2026-03-30T08:47:49.643Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" }, + { url = "https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size = 8391602, upload-time = "2026-03-30T08:47:58.303Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl", hash = "sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size = 4142310, upload-time = "2026-03-30T08:48:04.594Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size = 4882833, upload-time = "2026-03-30T08:48:07.363Z" }, + { url = "https://files.pythonhosted.org/packages/c5/6d/e65307ce20f5a09244ba9e9d8476e99fb039de7154f37fb85f26978b59c3/grpcio-1.80.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e", size = 6017376, upload-time = "2026-03-30T08:48:10.005Z" }, + { url = "https://files.pythonhosted.org/packages/69/10/9cef5d9650c72625a699c549940f0abb3c4bfdb5ed45a5ce431f92f31806/grpcio-1.80.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f", size = 12018133, upload-time = "2026-03-30T08:48:12.927Z" }, + { url = "https://files.pythonhosted.org/packages/04/82/983aabaad82ba26113caceeb9091706a0696b25da004fe3defb5b346e15b/grpcio-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9", size = 6574748, upload-time = "2026-03-30T08:48:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/07/d7/031666ef155aa0bf399ed7e19439656c38bbd143779ae0861b038ce82abd/grpcio-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14", size = 7277711, upload-time = "2026-03-30T08:48:19.627Z" }, + { url = "https://files.pythonhosted.org/packages/e8/43/f437a78f7f4f1d311804189e8f11fb311a01049b2e08557c1068d470cb2e/grpcio-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05", size = 6785372, upload-time = "2026-03-30T08:48:22.373Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/f6558e9c6296cb4227faa5c43c54a34c68d32654b829f53288313d16a86e/grpcio-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1", size = 7395268, upload-time = "2026-03-30T08:48:25.638Z" }, + { url = "https://files.pythonhosted.org/packages/06/21/0fdd77e84720b08843c371a2efa6f2e19dbebf56adc72df73d891f5506f0/grpcio-1.80.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f", size = 8392000, upload-time = "2026-03-30T08:48:28.974Z" }, + { url = "https://files.pythonhosted.org/packages/f5/68/67f4947ed55d2e69f2cc199ab9fd85e0a0034d813bbeef84df6d2ba4d4b7/grpcio-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e", size = 7828477, upload-time = "2026-03-30T08:48:32.054Z" }, + { url = "https://files.pythonhosted.org/packages/44/b6/8d4096691b2e385e8271911a0de4f35f0a6c7d05aff7098e296c3de86939/grpcio-1.80.0-cp314-cp314-win32.whl", hash = "sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae", size = 4218563, upload-time = "2026-03-30T08:48:34.538Z" }, + { url = "https://files.pythonhosted.org/packages/e5/8c/bbe6baf2557262834f2070cf668515fa308b2d38a4bbf771f8f7872a7036/grpcio-1.80.0-cp314-cp314-win_amd64.whl", hash = "sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f", size = 5019457, upload-time = "2026-03-30T08:48:37.308Z" }, +] + +[[package]] +name = "grpcio-status" +version = "1.80.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/ed/105f619bdd00cb47a49aa2feea6232ea2bbb04199d52a22cc6a7d603b5cb/grpcio_status-1.80.0.tar.gz", hash = "sha256:df73802a4c89a3ea88aa2aff971e886fccce162bc2e6511408b3d67a144381cd", size = 13901, upload-time = "2026-03-30T08:54:34.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/80/58cd2dfc19a07d022abe44bde7c365627f6c7cb6f692ada6c65ca437d09a/grpcio_status-1.80.0-py3-none-any.whl", hash = "sha256:4b56990363af50dbf2c2ebb80f1967185c07d87aa25aa2bea45ddb75fc181dbe", size = 14638, upload-time = "2026-03-30T08:54:01.569Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, +] + +[[package]] +name = "idna" +version = "3.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, +] + +[[package]] +name = "ipython" +version = "9.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "json5" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-collaboration" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-collaboration-ui" }, + { name = "jupyter-docprovider" }, + { name = "jupyter-server-ydoc" }, + { name = "jupyterlab" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/4a/1f8ba60881f3ed86112e7d77a4098ee859dea729e854140a862f2b52df95/jupyter_collaboration-4.4.0.tar.gz", hash = "sha256:d492a2f69bd91d6f472991051b2df83dc2cdfaeecbfa2d75dabee5fc3178814d", size = 3727, upload-time = "2026-05-11T11:05:17.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/70/9d44957eef95c0e8ce80fbf90cacaa3dabd579fd811278dc517148e7b777/jupyter_collaboration-4.4.0-py3-none-any.whl", hash = "sha256:c10828d3e83e73448051dfceadb89bf61bcdd97c3000eaac878b39be5aa8358f", size = 4751, upload-time = "2026-05-11T11:05:15.924Z" }, +] + +[[package]] +name = "jupyter-collaboration-ui" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/bf/f6494fbba8d192d34dce04994fe43a7c1069d11e9d443c6988013c099afa/jupyter_collaboration_ui-2.4.0.tar.gz", hash = "sha256:9a1942ed90f8d98c83a1b6fbc0108bf5d1a4b1484668b634364868806caf5d7c", size = 79142, upload-time = "2026-05-11T11:04:52.467Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/97/585c550ed6349c9a9bfa8b217ebbac606eeeda45af812602803b8aef05e1/jupyter_collaboration_ui-2.4.0-py3-none-any.whl", hash = "sha256:543fd8d63106e00f50c9e3d0fd70e32d8242de8d7f887b503dcbcec6cb586e5c", size = 46696, upload-time = "2026-05-11T11:04:50.525Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-docprovider" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/1e48717f4f499b649cc9c0d3ff95b64efaf4c69142ecc7dee3caf011a681/jupyter_docprovider-2.4.0.tar.gz", hash = "sha256:7b901fb9d800599e2ab68557fd6391102a6888845286c4f7cbb6eb2bba3094e0", size = 51324, upload-time = "2026-05-11T11:05:04.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/cc/74b80ecbb804266f55cc82fb9242b49437572dcc4203bff5cfc7c449cbeb/jupyter_docprovider-2.4.0-py3-none-any.whl", hash = "sha256:cf0582cededc46bc5a055e31b4f4b9352f8d48bbb55fbea389e953b166dacf1b", size = 35927, upload-time = "2026-05-11T11:05:02.394Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, +] + +[[package]] +name = "jupyter-kernel-client" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-mimetypes" }, + { name = "requests" }, + { name = "traitlets" }, + { name = "typing-extensions" }, + { name = "websocket-client" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/68/287315ba355aa93bda2e344de5febc45e6de1b47d8f4a5b69400b24cfdfd/jupyter_kernel_client-0.9.0-py3-none-any.whl", hash = "sha256:77acb8f2f738d97625d6bd01ee8cf21c4d59790b7ba464108712db3870416f20", size = 40097, upload-time = "2026-02-11T06:42:05.133Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, +] + +[[package]] +name = "jupyter-mcp-server" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "fastapi" }, + { name = "jupyter-kernel-client" }, + { name = "jupyter-mcp-tools" }, + { name = "jupyter-nbmodel-client" }, + { name = "jupyter-server" }, + { name = "jupyter-server-client" }, + { name = "jupyter-server-nbmodel" }, + { name = "mcp", extra = ["cli"] }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "pydantic" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/ae/7843fe02bb57c5a2928fa830b01779a3c2395ca382e91e690aac987fa054/jupyter_mcp_server-1.0.2.tar.gz", hash = "sha256:a1e1b4816d4cbc53944a6f76385e0c3b6b4d8aa5c9f855cbce153fad1b18c3fe", size = 80102, upload-time = "2026-04-27T06:08:37.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/5e/f306a728502f2d26988c76a882121dd1bb1a87c59e6db8b096a9a7b35903/jupyter_mcp_server-1.0.2-py3-none-any.whl", hash = "sha256:6be3c923fc6469094856e329dd593e4cbd4938cedb068b65697b3b1bc8543538", size = 111133, upload-time = "2026-04-27T06:08:36.01Z" }, +] + +[[package]] +name = "jupyter-mcp-tools" +version = "0.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "jupyter-server" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/f4/28e9cbdd05d3146d5adedc474f64a2d669c21b0e672d09b0885a1cc7c85a/jupyter_mcp_tools-0.1.6-py3-none-any.whl", hash = "sha256:45cb18658d5853a62faccd5e8ea17becc3a1850482a43c49a9e4bb2c854effd7", size = 45664, upload-time = "2026-01-08T15:32:10.559Z" }, +] + +[[package]] +name = "jupyter-mimetypes" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyarrow" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/45/cb4671e13fed39f721066ad1a00714d4b607982b8d3e97a25f836198d1df/jupyter_mimetypes-0.2.0-py3-none-any.whl", hash = "sha256:e6dcd989258e3fc944365b656d9173191517e0e393bd878e97ce500e5b388527", size = 16724, upload-time = "2025-08-10T18:18:27.309Z" }, +] + +[[package]] +name = "jupyter-nbmodel-client" +version = "0.14.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-ydoc" }, + { name = "nbformat" }, + { name = "pycrdt" }, + { name = "requests" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/f9/bf5a0ba321a227ba4c94bafa3d3950f9e773658773a81e379381b8687e25/jupyter_nbmodel_client-0.14.7.tar.gz", hash = "sha256:c9ff959ea26f5b2876271dfe37882c4674551e0e2aafc7633a4ebc57c0260563", size = 25909, upload-time = "2026-04-25T10:40:46.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/61/5d6ada9177f164f3ca0394af899d09a7bb82b6ba9bb5f1d559a9d9f53758/jupyter_nbmodel_client-0.14.7-py3-none-any.whl", hash = "sha256:ff9371378608dd46f5cb58e394493aa6bde4efcbabbcb988fc331f55b5b7cef3", size = 23025, upload-time = "2026-04-25T10:40:44.046Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/15/1eacb0fcb79ef86e8a0a79a708e6ad7435f6f223097dd29a4ce861fabc44/jupyter_server-2.18.2.tar.gz", hash = "sha256:06b4f40d8a7a00bb39d5216859c81374a0e7cfefe6d8a5a7facc5a5c37c679a7", size = 753177, upload-time = "2026-05-06T07:04:36.274Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl", hash = "sha256:fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8", size = 391907, upload-time = "2026-05-06T07:04:34.014Z" }, +] + +[[package]] +name = "jupyter-server-client" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "requests" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/2e/d22899abfdbc6fdd33860152f2108e6f377b11083e951bb67e6472e0247b/jupyter_server_client-0.1.1-py3-none-any.whl", hash = "sha256:5fc28099b95ea4b02e0bc85760507701c4c4315801897129e4b6c606582cf025", size = 19683, upload-time = "2025-10-22T11:19:29.907Z" }, +] + +[[package]] +name = "jupyter-server-fileid" +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-events" }, + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/eb/7c2c09454bbf66b3727ba8c431d16159d642c0eb1aa179412a4f7af721cf/jupyter_server_fileid-0.9.3.tar.gz", hash = "sha256:521608bb87f606a8637fcbdce2f3d24a8b3cc89d2eef61751cb40e468d4e54be", size = 54959, upload-time = "2024-09-06T07:18:40.412Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d6/5e5bca083664b1dd368e261107cbe2d350e3bdc62bdba8720fdbb9b9db39/jupyter_server_fileid-0.9.3-py3-none-any.whl", hash = "sha256:f73c01c19f90005d3fff93607b91b4955ba4e1dccdde9bfe8026646f94053791", size = 16922, upload-time = "2024-09-06T07:18:38.445Z" }, +] + +[[package]] +name = "jupyter-server-nbmodel" +version = "0.1.1a4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/2a/1d13aa10cd573f6b823acc833f6f4cf6d1c2bd3b201f066496b78f964ed6/jupyter_server_nbmodel-0.1.1a4.tar.gz", hash = "sha256:ee072daa1e6b09db53f20e8f2d180d4f5e68dbff40003ad14dddfea8addf5cc3", size = 207265, upload-time = "2025-10-30T15:12:02.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/70/23edf6756dd2ae7c81ce5c2add66d986674d58072192152b80d417efbc4d/jupyter_server_nbmodel-0.1.1a4-py3-none-any.whl", hash = "sha256:f1c40906aaf98d6b66c3c9d5ebd6cad1b278d00c09d0a9227b0c15d972ec399a", size = 35316, upload-time = "2025-10-30T15:11:59.987Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, +] + +[[package]] +name = "jupyter-server-ydoc" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jupyter-events" }, + { name = "jupyter-server" }, + { name = "jupyter-server-fileid" }, + { name = "jupyter-ydoc" }, + { name = "pycrdt" }, + { name = "pycrdt-websocket" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/fb/88a92c659864429342ab0d6c3b4829cdc6b008df10484820224e3871cf7b/jupyter_server_ydoc-2.4.0.tar.gz", hash = "sha256:74631f47a55d9dadf7dc918d78a083feaecc6c36af4d2fcdf26c0ee36bf70372", size = 33271, upload-time = "2026-05-11T11:04:41.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/6e/ec1dfa20b8efdf782a9fb162abc5e6a394bd122c21a0c9ff55e0e60f5a35/jupyter_server_ydoc-2.4.0-py3-none-any.whl", hash = "sha256:0442bf1e2ef8da16d7f0fb541db5080b249b43f098616cf8cd7dd173e4ae6cef", size = 34151, upload-time = "2026-05-11T11:04:39.135Z" }, +] + +[[package]] +name = "jupyter-ydoc" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f7/400e8ee54adb2396f7a70a85a8951bc696303a9bd413c5e35cc6c0c5c214/jupyter_ydoc-3.4.1.tar.gz", hash = "sha256:fb31f0e7033b8a5bf8920334e2b3dd9bdaba3052de3164de28e14525fd0bc4d8", size = 973504, upload-time = "2026-04-14T12:14:19.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/ff/15eca734d96277895573026dff14edd63d9d1709c02363f5902ea9767d71/jupyter_ydoc-3.4.1-py3-none-any.whl", hash = "sha256:848e5a9f37403846b7554b87d71495a38b6249579af64b1bde8de650b2e49d65", size = 14534, upload-time = "2026-04-14T12:14:18.439Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz", hash = "sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size = 23992763, upload-time = "2026-04-29T16:43:51.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl", hash = "sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size = 12450123, upload-time = "2026-04-29T16:43:46.639Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" }, + { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" }, + { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" }, + { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" }, + { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, + { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mcp" +version = "1.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/83/d1efe7c2980d8a3afa476f4e3d42d53dd54c0ab94c27bee5d755b45c8b73/mcp-1.27.1.tar.gz", hash = "sha256:0f47e1820f8f8f941466b39749eb1d1839a04caddca2bc60e9d46e8a99914924", size = 608458, upload-time = "2026-05-08T16:50:12.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/73/42d9596facebdb533b7f0b86c1b0364ef350d1f8ba78b1052e8a58b48b65/mcp-1.27.1-py3-none-any.whl", hash = "sha256:1af3c4203b329430fde7a87b4fcb6392a041f5cb851fd68fc674016ab4e7c06f", size = 216260, upload-time = "2026-05-08T16:50:10.547Z" }, +] + +[package.optional-dependencies] +cli = [ + { name = "python-dotenv" }, + { name = "typer" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistune" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { 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 = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "notebook" +version = "7.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz", hash = "sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size = 14170814, upload-time = "2026-04-30T11:46:26.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl", hash = "sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size = 14581730, upload-time = "2026-04-30T11:46:22.342Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/ca/25288069c399be6769159d9fb7b1190b603537d82aad2fa2746a0cc2c8c6/opentelemetry_api-1.42.0.tar.gz", hash = "sha256:ea84c893ad177791d138e0349d6ceebd8d3bf006440900400ce220008dafc372", size = 72300, upload-time = "2026-05-19T09:46:29.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/0b/be5daf659b82b525338fde371dfcfab09b606a19bb5620c37076964710ec/opentelemetry_api-1.42.0-py3-none-any.whl", hash = "sha256:558d88f88192a973579910ef6f2c13db47a268d5ec2e53e83e50e74a39a02922", size = 61310, upload-time = "2026-05-19T09:46:06.561Z" }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/c9/dabaaf1c754a57b82b5a36aeca3806d92c1877ccfb12a697b65f88bf027c/opentelemetry_sdk-1.42.0.tar.gz", hash = "sha256:2479e462cc69357825c2c847ce4a601bc1b17e1279aa7f80d3490f0ae614d0e5", size = 239072, upload-time = "2026-05-19T09:46:42.992Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/7d/16bf9a9d42ebbd1679e0cda018d57a0712f3b6f6f1e7ae5ef3c7ee5927c0/opentelemetry_sdk-1.42.0-py3-none-any.whl", hash = "sha256:ec4a4f69e15220b3d7bccd93217aac745682bb6435b9381f7bb44cb7e07b4f2b", size = 170879, upload-time = "2026-05-19T09:46:25.871Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.63b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/f8/be4625838aae098c2f9fbdc062a1b3128ebb9e799b891b654ee8cad94897/opentelemetry_semantic_conventions-0.63b0.tar.gz", hash = "sha256:cfea295264654fa324fcef24aa56fb1836fdc0da27db128645dc6aa76115cc6c", size = 148333, upload-time = "2026-05-19T09:46:44.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/6f/8d0ce225b8fdbb72c97cf4130107d861eafcb3d8e5c3f5891e8556177316/opentelemetry_semantic_conventions-0.63b0-py3-none-any.whl", hash = "sha256:1f3962732b04f43e4fef28173c9a3615b8847b4b2d6386fdc085361b29875ab9", size = 203712, upload-time = "2026-05-19T09:46:27.569Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +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/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.3" +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/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +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/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]] +name = "presupuestos-callcenter" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "google-cloud-bigquery" }, + { name = "jupyter" }, + { name = "jupyter-collaboration" }, + { name = "jupyter-mcp-server" }, + { name = "jupyterlab" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "seaborn" }, +] + +[package.metadata] +requires-dist = [ + { name = "google-cloud-bigquery", specifier = ">=3.41.0" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "jupyter-collaboration", specifier = ">=4.4.0" }, + { name = "jupyter-mcp-server", specifier = ">=1.0.2" }, + { name = "jupyterlab", specifier = ">=4.5.7" }, + { name = "matplotlib", specifier = ">=3.10.9" }, + { name = "numpy", specifier = ">=2.4.6" }, + { name = "pandas", specifier = ">=3.0.3" }, + { name = "seaborn", specifier = ">=0.13.2" }, +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/56/e647b0c675392d2da368da7b6f158f7368b18542fd6f7d7400a2f39de000/proto_plus-1.28.0.tar.gz", hash = "sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9", size = 57221, upload-time = "2026-05-07T08:04:50.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/20/b122d4626976acb81132036d2ad1bb35a1a8775fceb837ec30964622516a/proto_plus-1.28.0-py3-none-any.whl", hash = "sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8", size = 50410, upload-time = "2026-05-07T08:03:31.962Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, + { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, + { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +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/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]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pycrdt" +version = "0.12.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/bd/6e049694ad7fed0baf45a62629ff2c7aa1c26e0581a4d4987e0fd39fe951/pycrdt-0.12.50.tar.gz", hash = "sha256:506d4bc00d7d566de4018dca52998ab7cf97c787363bc59440d3a3bb3336d1a0", size = 84528, upload-time = "2026-03-16T09:39:15.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/ea/cdc543c51971c513f3b23c34d17ae672dd2fab40977b8d94344c6e8099be/pycrdt-0.12.50-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f75c95335cacc459dbb3c4e55afbd231f8befd333c617ffad1bbe348018021de", size = 1721432, upload-time = "2026-03-16T09:38:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/b6/30/cde0c58cdfb0f2e4d523443637b11b9bb5963024f5f3cd9e889b8195eab4/pycrdt-0.12.50-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3842dff93946c1b46ea8c508f7d79f07f0a8c54fe8f8e83e6cbb1f9f35a62899", size = 944575, upload-time = "2026-03-16T09:38:18.574Z" }, + { url = "https://files.pythonhosted.org/packages/df/a8/b36e98bca96b9c9b3d554ce6984128dff076a47cb350462efb122a09613e/pycrdt-0.12.50-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba48534acb7ba22a975c38ff531178d25a01c29d5d4ec2ecfe1c45754cde181", size = 962165, upload-time = "2026-03-16T09:38:20.112Z" }, + { url = "https://files.pythonhosted.org/packages/69/c2/38e0055416466feb9b33cfc96a95c3bd3985cdb547fdc0e556d8903e074f/pycrdt-0.12.50-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5ca809926c3e08965b201b277c26d319c47078ba4b22178976f0455b351155b", size = 1135011, upload-time = "2026-03-16T09:38:21.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5f/9597d1b2fcd8f1bff78308352dc8568012e1e2c2ef44a0e5ca11cd04aa81/pycrdt-0.12.50-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bffe6a7e6a59ea1c74a53a0ffa2fee27ff54e454cff333ef952922535c7c8ffa", size = 987535, upload-time = "2026-03-16T09:38:23.459Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f8/882da205925f147610ca790304a025232c164256421655e19cd9eabfca06/pycrdt-0.12.50-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688d8cb017a729719be8f9ecf488daba24781c05a1635f725ca257aa9a90acfd", size = 956238, upload-time = "2026-03-16T09:38:25.473Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/6cf0db29eebdafe8d3a27ec0a9ece583acab0959d0de22968fcc43f51d75/pycrdt-0.12.50-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:71f9dfc24636dc9789246dae4c8db39f5b9b419c1a1f6f53b782ae22e8febbef", size = 1046621, upload-time = "2026-03-16T09:38:27.349Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/f1e79a74c12439a595f1986a403e08a35abedce5929c4f464be5f2ec8109/pycrdt-0.12.50-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a33635da609afe467e4ae644766416454535161ec7e1427294a59ed8a5e80015", size = 1121675, upload-time = "2026-03-16T09:38:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/03/7f/b966b7c489e306070eef305b3f591e7ce7a34ee445cb55d1b8fd4fa6e338/pycrdt-0.12.50-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f48c78ef3710c033d07d5de326362826eda8fa941859f06c146007d6122b3bb4", size = 1235939, upload-time = "2026-03-16T09:38:30.721Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7a/0a4a74c68349ee72c3e92baad0cb9fbc6a94f2c122a228489357b8ad3507/pycrdt-0.12.50-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c714c1582b804bd296f9b8530353bfab54386a145164e9693443e38b23392d69", size = 1222964, upload-time = "2026-03-16T09:38:32.323Z" }, + { url = "https://files.pythonhosted.org/packages/be/54/c96b470ebc5eaf355beeb8ffaf0235976e3e1fb9d4bc8a1169138c7e5063/pycrdt-0.12.50-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d88a146090d9d6fc64687574c6014b26be1673b8b54b450fca23f115068c2852", size = 1165811, upload-time = "2026-03-16T09:38:34.05Z" }, + { url = "https://files.pythonhosted.org/packages/78/e4/070a16212142bda9cb585571066e1aa48ffcdc2ffb3540759d96dcebd141/pycrdt-0.12.50-cp313-cp313-win32.whl", hash = "sha256:a149f0f080f19b1c9a5614885e134ebbe159ee8add9fce96b81fcb3ea261df94", size = 695256, upload-time = "2026-03-16T09:38:35.705Z" }, + { url = "https://files.pythonhosted.org/packages/03/63/e0beaeabc4bb32901cff77ac9bc0edfa1b2e81a739cc5cd3990896759f94/pycrdt-0.12.50-cp313-cp313-win_amd64.whl", hash = "sha256:96db3bff011f0f85e2c95ad3337abf9553dc08d2cafb2bba6ee4b30b53a585d0", size = 748447, upload-time = "2026-03-16T09:38:37.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/5d/ae92c859ec5ee4f63d2df3702ce7a782cb054d1cef9a72d17b15a0f787f9/pycrdt-0.12.50-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:382cf259b848db979f2cc8f37c8b1c20c46de8df10142383e8502c8eb40589ba", size = 1720667, upload-time = "2026-03-16T09:38:39.222Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d7/03d5a6d806eec5cc880d17d88a2f8868bd3ddf20aea988ce9238d433cfb4/pycrdt-0.12.50-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022450e769b8ec37027504602f3dcfc4171d0d27ebe0f04c28d9eb5a3641fdff", size = 946541, upload-time = "2026-03-16T09:38:40.918Z" }, + { url = "https://files.pythonhosted.org/packages/9a/af/4700d71886afeb406b5b6d16d36dbd15fd0d3caa37af60894aca75dc8f3e/pycrdt-0.12.50-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41c5470f1fe5426e81986664e786508935d00050f061a5eb341af596c67c0bc7", size = 960844, upload-time = "2026-03-16T09:38:42.605Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/b3640697e6e7dd6675e8fb41c95fba89d84cf435249ed0b8c310ae7eaa10/pycrdt-0.12.50-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bccb80466c7bcaafa1591cdd44b4f4302993324dd09b16a1c4b05f6153a0a458", size = 1136447, upload-time = "2026-03-16T09:38:44.254Z" }, + { url = "https://files.pythonhosted.org/packages/f8/50/fec4bf7fdd8b82e295be28c890a856a2d80e94d4d49098e660bb2c4520bd/pycrdt-0.12.50-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7b2061ad56d4305fce05ddfa269a662e1137997494f74f3f0633052f8beccd4", size = 986746, upload-time = "2026-03-16T09:38:45.88Z" }, + { url = "https://files.pythonhosted.org/packages/70/40/3f82b3bc35adc4ad194a2a397d0518892516e2c40663035401eca05d9bec/pycrdt-0.12.50-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b1d6a3aa808e3996cec15c2ec7d1613c39d872627eb1953877d21720e91b002", size = 957198, upload-time = "2026-03-16T09:38:47.609Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/dfd19e979812e455add5942857a08ce2c28547fb68824dda44d4eb83c08b/pycrdt-0.12.50-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ba83048dc394e8c0d0edf5fdee073eba5d566f372bd3cc24dc8f0f4c24a36d4", size = 1048567, upload-time = "2026-03-16T09:38:49.882Z" }, + { url = "https://files.pythonhosted.org/packages/ac/02/153f511fb0f0dd32d889aede169ea0eda52d62935728b685b6815425ce9d/pycrdt-0.12.50-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8fbf1f7b6c8200193b602ed3307b526a9cf3db7acb63191632f77d071fb595ec", size = 1122383, upload-time = "2026-03-16T09:38:51.581Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fa/3fcdb4502ced4b7795516acbb12997ec7aaf726187e360494182f533a1a1/pycrdt-0.12.50-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6776ad64c8a6b270683cdecd1327289587160228401af454f570a9d971eec9a3", size = 1235274, upload-time = "2026-03-16T09:38:53.598Z" }, + { url = "https://files.pythonhosted.org/packages/69/e9/1a50a55b2b2424646e61b648a1bee42f73c1830479cb8095df428bb56b2a/pycrdt-0.12.50-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f4218a1e568f9b33fd676adc1d3a92fdf4c1c5b6ec3c885f227db7b7fb680b3b", size = 1224841, upload-time = "2026-03-16T09:38:55.528Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/bd919a4cf7265b4b01c2365820a5423dbe9744880a83a680339a1bf34875/pycrdt-0.12.50-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cde948e70e3e246638e5cd8b0156c714961fba41cd44374e7c5066e797e8ec3f", size = 1168590, upload-time = "2026-03-16T09:38:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b3/d0b97dbaf7c60c6e3f6d5c9ae2cd8cca3655d8fa397c41c24c44d92dc8d2/pycrdt-0.12.50-cp314-cp314-win32.whl", hash = "sha256:1d42d7f29c1e8459cd80aefd37595e8c7062817f48c59c5e5568401527718d19", size = 694709, upload-time = "2026-03-16T09:38:59.68Z" }, + { url = "https://files.pythonhosted.org/packages/72/fc/acdb8c238f9f4a6c2757b7c2cfdb39aa3c779ac465e0b6c6862c564e6350/pycrdt-0.12.50-cp314-cp314-win_amd64.whl", hash = "sha256:a4d294295120e33fef32d51e1a7a92eab444d20c07d5bde55a5a75afe58a5d41", size = 747251, upload-time = "2026-03-16T09:39:01.435Z" }, +] + +[[package]] +name = "pycrdt-store" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, + { name = "sqlite-anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/61/dfecafdc0c23f56d5bacc67de620b77a68f86085df21a8007628d6045248/pycrdt_store-0.1.3.tar.gz", hash = "sha256:12a0e263b2c07eb18bbe7203c828b88ba953cb93094ad37d22aeb6c619df2ef0", size = 14847, upload-time = "2025-12-11T13:29:11.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/2d/85a1b3d6e65048c0553e0d06e21b235610ff4db0ea94cbae1bd34de385d7/pycrdt_store-0.1.3-py3-none-any.whl", hash = "sha256:2e74afc856c162706d178d23d57fd3706accbe79d849e73dd413646a7025afba", size = 11948, upload-time = "2025-12-11T13:29:10.522Z" }, +] + +[[package]] +name = "pycrdt-websocket" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, + { name = "pycrdt-store" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/91/a412af8792af22e7e67a7424e7b6c64baada4897777fed885a2cb825155d/pycrdt_websocket-0.16.0.tar.gz", hash = "sha256:89d4d830f41028c55cc9877635f73f94f49131ca73ffac7353d0be421150d0fd", size = 23152, upload-time = "2025-06-11T07:15:54.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/b7/a1dd4d149fa6279f321bd7dacab66ac31e728fbae175a7d75cf8211b1f30/pycrdt_websocket-0.16.0-py3-none-any.whl", hash = "sha256:4b9ffe47c40867b7e637922680e93471fd801b6e8d6c9f6aa688fd2a17351141", size = 14568, upload-time = "2025-06-11T07:15:52.364Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +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/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.12.1" +source = { registry = "https://pypi.org/simple" } +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/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] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +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/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-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.29" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/fe/70bd71a6738b09a0bdf6480ca6436b167469ca4578b2a0efbe390b4b0e70/python_multipart-0.0.29.tar.gz", hash = "sha256:643e93849196645e2dbdd81a0f8829a23123ad7f797a84a364c6fb3563f18904", size = 45678, upload-time = "2026-05-17T17:29:47.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/cb/769cfc37177252872a45a71f3fbdde9d51b471a3f3c14bfe95dde3407386/python_multipart-0.0.29-py3-none-any.whl", hash = "sha256:2ddcc971cef266225f54f552d8fa10bcfbb1f14446caec199060daac59ff2d69", size = 29640, upload-time = "2026-05-17T17:29:45.69Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pywinpty" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/54/37c7370ba91f579235049dc26cd2c5e657d2a943e01820844ffc81f32176/pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412", size = 31309, upload-time = "2026-02-04T21:51:09.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab", size = 2112686, upload-time = "2026-02-04T21:52:03.035Z" }, + { url = "https://files.pythonhosted.org/packages/fd/50/724ed5c38c504d4e58a88a072776a1e880d970789deaeb2b9f7bd9a5141a/pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523", size = 234591, upload-time = "2026-02-04T21:52:29.821Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ad/90a110538696b12b39fd8758a06d70ded899308198ad2305ac68e361126e/pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a", size = 2112360, upload-time = "2026-02-04T21:55:33.397Z" }, + { url = "https://files.pythonhosted.org/packages/44/0f/7ffa221757a220402bc79fda44044c3f2cc57338d878ab7d622add6f4581/pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759", size = 233107, upload-time = "2026-02-04T21:51:45.455Z" }, + { url = "https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9", size = 2113282, upload-time = "2026-02-04T21:52:08.188Z" }, + { url = "https://files.pythonhosted.org/packages/63/32/40a775343ace542cc43ece3f1d1fce454021521ecac41c4c4573081c2336/pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019", size = 234207, upload-time = "2026-02-04T21:51:58.687Z" }, + { url = "https://files.pythonhosted.org/packages/8d/54/5d5e52f4cb75028104ca6faf36c10f9692389b1986d34471663b4ebebd6d/pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1", size = 2112910, upload-time = "2026-02-04T21:52:30.976Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/dcd184824e21d4620b06c7db9fbb15c3ad0a0f1fa2e6de79969fb82647ec/pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5", size = 233425, upload-time = "2026-02-04T21:51:56.754Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { 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 = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +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/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 = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +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/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]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, +] + +[[package]] +name = "sqlite-anyio" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/a3/7830c95b37f1268dbb47e559d1f1ae027f3a4c36b1f7fc1b2dc5de1c5073/sqlite_anyio-0.2.8.tar.gz", hash = "sha256:d68b51a18c01a7dfa9cedbc319871ce77ab3ed0822518fb32810bb465b52d761", size = 3271, upload-time = "2026-03-02T10:37:43.466Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/aa/182981b92659df83c3eb7d6f8fb0874984d72ad688fa4054cb96bc044bb0/sqlite_anyio-0.2.8-py3-none-any.whl", hash = "sha256:bbdfefb144aed2633d2618ee1508edd3abe67a00389379360949da4671640d86", size = 4041, upload-time = "2026-03-02T10:37:42.246Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "starlette" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +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/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]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" }, +] + +[[package]] +name = "typer" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, +] +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/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 = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +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/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 = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/b1/8e7077a8641086aea449e1b5752a570f1b5906c64e0a33cd6d93b63a066b/uvicorn-0.47.0.tar.gz", hash = "sha256:7c9a0ea1a9414106bbab7324609c162d8fa0cdcdcb703060987269d77c7bb533", size = 90582, upload-time = "2026-05-14T18:16:54.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/41/ac2dfdbc1f60c7af4f994c7a335cfa7040c01642b605d65f611cecc2a1e4/uvicorn-0.47.0-py3-none-any.whl", hash = "sha256:2c5715bc12d1892d84752049f400cd1c3cb018514967fdfeb97640443a6a9432", size = 71301, upload-time = "2026-05-14T18:16:51.762Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + +[[package]] +name = "yarl" +version = "1.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978, upload-time = "2026-05-19T21:29:23.83Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/8e63299bb71ed61a834121d9d3fe6c9fcf2a6a5d09754ff4f20f2d20baf5/yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607", size = 91733, upload-time = "2026-05-19T21:29:25.375Z" }, + { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113, upload-time = "2026-05-19T21:29:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899, upload-time = "2026-05-19T21:29:28.842Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862, upload-time = "2026-05-19T21:29:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060, upload-time = "2026-05-19T21:29:32.657Z" }, + { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613, upload-time = "2026-05-19T21:29:34.379Z" }, + { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012, upload-time = "2026-05-19T21:29:36.216Z" }, + { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887, upload-time = "2026-05-19T21:29:38.746Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620, upload-time = "2026-05-19T21:29:40.368Z" }, + { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599, upload-time = "2026-05-19T21:29:42.66Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604, upload-time = "2026-05-19T21:29:44.632Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161, upload-time = "2026-05-19T21:29:46.755Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619, upload-time = "2026-05-19T21:29:48.972Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362, upload-time = "2026-05-19T21:29:51Z" }, + { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667, upload-time = "2026-05-19T21:29:52.743Z" }, + { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069, upload-time = "2026-05-19T21:29:54.442Z" }, + { url = "https://files.pythonhosted.org/packages/40/0e/e08087695fc12789263821c5dc0f8dc52b5b17efd0887cacf419f8a43ba3/yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2", size = 129670, upload-time = "2026-05-19T21:29:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/3a/98/ab4b5ed1b1b5cd973c8a3eb994c3a6aefb6ce6d399e21bb5f0316c33815c/yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630", size = 91916, upload-time = "2026-05-19T21:29:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8", size = 91625, upload-time = "2026-05-19T21:30:00.412Z" }, + { url = "https://files.pythonhosted.org/packages/02/a7/45baabfff76829264e623b185cff0c340d7e11bf3e1cd9ea37e7d17934bd/yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14", size = 104574, upload-time = "2026-05-19T21:30:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/3a5ab144d3d650ca37d4f4b57e56169be8af3ca34c448793e064b30baaed/yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535", size = 97534, upload-time = "2026-05-19T21:30:04.319Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b5/5658fef3681fb5776b4513b052bec750009f47b3a592251c705d75375798/yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14", size = 111481, upload-time = "2026-05-19T21:30:05.988Z" }, + { url = "https://files.pythonhosted.org/packages/4c/06/fdcd7dde037f00866dce123ed4ba23dba94beb56fc4cf561668d27be37f2/yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3", size = 111529, upload-time = "2026-05-19T21:30:07.738Z" }, + { url = "https://files.pythonhosted.org/packages/c2/53/d81269aaafccea0d33396c03035de997b743f11e648e6e27a0df99c72980/yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208", size = 107338, upload-time = "2026-05-19T21:30:09.713Z" }, + { url = "https://files.pythonhosted.org/packages/ae/04/23049463f729bd899df203a7960505a75333edd499cda8aa1d5a82b64df5/yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50", size = 106147, upload-time = "2026-05-19T21:30:11.365Z" }, + { url = "https://files.pythonhosted.org/packages/14/18/04a4b5830b43ed5e4c5015b40e9f6241ad91487d71611061b4e111d6ac80/yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd", size = 104272, upload-time = "2026-05-19T21:30:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/8cffdf319aee7a7c1dbd07b61d91c3e3fda460c7a93b5f93e445f3806c4c/yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67", size = 99962, upload-time = "2026-05-19T21:30:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/b3cce3b7dbef64ac700ad4cea156a207d01bede0f507587616c364b5468e/yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1", size = 111063, upload-time = "2026-05-19T21:30:16.683Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ea/100818505e7ebf165c7242ff17fdf7d9fee79e27234aeca871c1082920d7/yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1", size = 105438, upload-time = "2026-05-19T21:30:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d2/e075a0b32aa6625087de9e653087df0759fed5de4a435fef594181102a77/yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b", size = 111458, upload-time = "2026-05-19T21:30:21.024Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5c/ceea7ba98b65c8eb8d947fdc52f9bedfcd43c6a57c9e3c90c17be8f324a3/yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8", size = 107589, upload-time = "2026-05-19T21:30:23.412Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424, upload-time = "2026-05-19T21:30:25.425Z" }, + { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690, upload-time = "2026-05-19T21:30:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/13/d5b8e2c8667db955bcb3de233f18798fefe7edf1d7429c2c9d4f9c401114/yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b", size = 136248, upload-time = "2026-05-19T21:30:29.297Z" }, + { url = "https://files.pythonhosted.org/packages/de/46/a4a97c05c9c9b8fd266bb2a0df12992c7fbd02391eb9640583411b6dab32/yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761", size = 95084, upload-time = "2026-05-19T21:30:31.031Z" }, + { url = "https://files.pythonhosted.org/packages/95/b2/845cf2074a015e6fe0d0808cf1a2d9e868386c4220d657ebd8302b199043/yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8", size = 95272, upload-time = "2026-05-19T21:30:33.062Z" }, + { url = "https://files.pythonhosted.org/packages/fe/16/e69d4aa244aef45235ddfebc0e04036a6829842bc5a6a795aedc6c998d23/yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed", size = 101497, upload-time = "2026-05-19T21:30:34.842Z" }, + { url = "https://files.pythonhosted.org/packages/15/94/c07107715d621076863ee88b3ddf183fa5e9d4aba5769623c9979828410a/yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543", size = 94002, upload-time = "2026-05-19T21:30:37.724Z" }, + { url = "https://files.pythonhosted.org/packages/a9/35/fc1bbdd895b5e4010b8fdd037f7ed3aa289d3863e08231b30231ca9a0815/yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0", size = 106524, upload-time = "2026-05-19T21:30:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/32b66d0a4ba47c296cf86d03e2c67bff58399fe6d6d84d5205c04c66cc6d/yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024", size = 106165, upload-time = "2026-05-19T21:30:41.888Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/37cb5ff50c5e825d4d38e81bb04d1b7e96bf960f7ab89f9850b162f3f114/yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf", size = 103010, upload-time = "2026-05-19T21:30:43.985Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/4597912315096f7bb359e46e13bf8b60994fcbb2db29b804c0902ef4eff5/yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc", size = 101128, upload-time = "2026-05-19T21:30:46.291Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/c8e86e120521e646013d02a8e3b8884392e28494be8f392366e50d208efc/yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb", size = 101382, upload-time = "2026-05-19T21:30:48.085Z" }, + { url = "https://files.pythonhosted.org/packages/fa/98/70b229236118f89dbeb739b76f10225bbf53b5497725502594c9a01d699a/yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420", size = 95964, upload-time = "2026-05-19T21:30:49.785Z" }, + { url = "https://files.pythonhosted.org/packages/87/f8/56c386981e3c8648d279fdef2397ffec577e8320fd5649745e34d54faeb7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f", size = 106204, upload-time = "2026-05-19T21:30:51.862Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1e/765afe97811ca35933e2a7de70ac57b1997ea2e4ee895719ee7a231fb7e5/yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa", size = 101510, upload-time = "2026-05-19T21:30:53.62Z" }, + { url = "https://files.pythonhosted.org/packages/ee/78/393913f4b9039e1edd09ae8a9bbb9d539be909a8abf6d8a2084585bed4b7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe", size = 105584, upload-time = "2026-05-19T21:30:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/78/87/deb17b7049bbe74ea11a713b86f8f27800cc1c8648b0b797243ebb4830ba/yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd", size = 103410, upload-time = "2026-05-19T21:30:57.962Z" }, + { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980, upload-time = "2026-05-19T21:30:59.735Z" }, + { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219, upload-time = "2026-05-19T21:31:01.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, +]