From 5b8432caf4ff356dce217236f3ddf40cec2e456b Mon Sep 17 00:00:00 2001 From: Moritz Graf Date: Sat, 17 Oct 2026 07:21:49 +0200 Subject: [PATCH] feat(family): deploy Single-Writer DuckDB backend, Mila parent cockpit & feeding analytics, and Moritz macro tracker --- k8s/family/duckdb-backend.yaml | 151 ++ k8s/family/git-credentials.secret.yaml | Bin 0 -> 226 bytes k8s/family/ingress.yaml | 55 + k8s/family/mila.yaml | 64 + k8s/family/moritz.yaml | 64 + k8s/family/namespace.yaml | 6 + k8s/family/pvc.yaml | 15 + k8s/family/registry.secret.yaml | Bin 0 -> 385 bytes k8s/minio/hosting-ingress.yaml | 39 +- k8s/openclaw/cronjob-wiki-backup.secret.yaml | Bin 8406 -> 8412 bytes k8s/openclaw/crons.yaml | 21 +- knowledge-wiki | 2 +- projects/duckdb-backend/AGENTS.md | 13 + projects/duckdb-backend/Dockerfile | 26 + projects/duckdb-backend/README.md | 26 + projects/duckdb-backend/app/__init__.py | 1 + projects/duckdb-backend/app/config.py | 46 + projects/duckdb-backend/app/engine.py | 2287 +++++++++++++++++ projects/duckdb-backend/app/git_sync.py | 326 +++ projects/duckdb-backend/app/main.py | 67 + projects/duckdb-backend/app/models.py | 55 + .../duckdb-backend/app/routes/__init__.py | 1 + .../duckdb-backend/app/routes/dashboard.py | 68 + .../duckdb-backend/app/routes/entities.py | 51 + projects/duckdb-backend/app/routes/events.py | 65 + projects/duckdb-backend/app/routes/query.py | 35 + projects/duckdb-backend/app/routes/system.py | 77 + projects/duckdb-backend/app/who_growth.py | 128 + projects/duckdb-backend/pyproject.toml | 28 + projects/duckdb-backend/tests/conftest.py | 35 + .../duckdb-backend/tests/test_api_curated.py | 179 ++ .../duckdb-backend/tests/test_api_events.py | 129 + .../duckdb-backend/tests/test_api_query.py | 28 + projects/duckdb-backend/tests/test_engine.py | 36 + .../duckdb-backend/tests/test_git_sync.py | 68 + projects/duckdb-backend/uv.lock | 813 ++++++ projects/mila/AGENTS.md | 9 + projects/mila/Dockerfile | 13 + projects/mila/README.md | 13 + projects/mila/index.html | 37 + projects/mila/nginx.conf | 57 + projects/mila/package-lock.json | 2251 ++++++++++++++++ projects/mila/package.json | 25 + projects/mila/public/favicon.ico | Bin 0 -> 9007 bytes projects/mila/public/manifest.json | 48 + .../mila/public/mila-apple-touch-icon-v3.png | Bin 0 -> 23318 bytes .../mila/public/mila-apple-touch-icon.png | Bin 0 -> 23318 bytes projects/mila/public/mila-icon-16-v3.png | Bin 0 -> 593 bytes projects/mila/public/mila-icon-16.png | Bin 0 -> 593 bytes projects/mila/public/mila-icon-192-v3.png | Bin 0 -> 26162 bytes projects/mila/public/mila-icon-192.png | Bin 0 -> 26162 bytes projects/mila/public/mila-icon-32-v3.png | Bin 0 -> 1455 bytes projects/mila/public/mila-icon-32.png | Bin 0 -> 1455 bytes projects/mila/public/mila-icon-512-v3.png | Bin 0 -> 167715 bytes projects/mila/public/mila-icon-512.png | Bin 0 -> 167715 bytes projects/mila/public/mila-icon.svg | 3 + projects/mila/public/mila.html | 1185 +++++++++ projects/mila/public/mila.webmanifest | 48 + projects/mila/public/sw.js | 51 + projects/mila/src/App.vue | 1000 +++++++ projects/mila/src/api.ts | 84 + .../src/components/FeedingAnalyticsTool.vue | 183 ++ projects/mila/src/components/SleepChart.vue | 589 +++++ .../mila/src/components/TrackingModal.vue | 579 +++++ .../mila/src/components/WhoGrowthTool.vue | 378 +++ projects/mila/src/main.ts | 30 + projects/mila/src/style.css | 16 + projects/mila/src/types.ts | 159 ++ projects/mila/tsconfig.json | 20 + projects/mila/vite.config.ts | 20 + projects/moritz/AGENTS.md | 9 + projects/moritz/Dockerfile | 13 + projects/moritz/README.md | 13 + projects/moritz/index.html | 37 + projects/moritz/nginx.conf | 53 + projects/moritz/package-lock.json | 2251 ++++++++++++++++ projects/moritz/package.json | 25 + projects/moritz/public/favicon.ico | Bin 0 -> 6749 bytes projects/moritz/public/manifest.json | 48 + .../moritz/public/moritz-apple-touch-icon.png | Bin 0 -> 7904 bytes projects/moritz/public/moritz-icon-16.png | Bin 0 -> 619 bytes projects/moritz/public/moritz-icon-192.png | Bin 0 -> 8469 bytes projects/moritz/public/moritz-icon-32.png | Bin 0 -> 1263 bytes projects/moritz/public/moritz-icon-512.png | Bin 0 -> 24143 bytes projects/moritz/public/moritz-icon.svg | 10 + projects/moritz/public/moritz.webmanifest | 48 + projects/moritz/public/sw.js | 51 + projects/moritz/src/App.vue | 763 ++++++ projects/moritz/src/api.ts | 96 + .../src/components/EnergyBalanceChart.vue | 563 ++++ .../src/components/MealTrackingModal.vue | 429 ++++ projects/moritz/src/main.ts | 25 + projects/moritz/src/style.css | 12 + projects/moritz/src/types.ts | 149 ++ projects/moritz/tsconfig.json | 20 + projects/moritz/vite.config.ts | 20 + 96 files changed, 16409 insertions(+), 29 deletions(-) create mode 100644 k8s/family/duckdb-backend.yaml create mode 100644 k8s/family/git-credentials.secret.yaml create mode 100644 k8s/family/ingress.yaml create mode 100644 k8s/family/mila.yaml create mode 100644 k8s/family/moritz.yaml create mode 100644 k8s/family/namespace.yaml create mode 100644 k8s/family/pvc.yaml create mode 100644 k8s/family/registry.secret.yaml create mode 100644 projects/duckdb-backend/AGENTS.md create mode 100644 projects/duckdb-backend/Dockerfile create mode 100644 projects/duckdb-backend/README.md create mode 100644 projects/duckdb-backend/app/__init__.py create mode 100644 projects/duckdb-backend/app/config.py create mode 100644 projects/duckdb-backend/app/engine.py create mode 100644 projects/duckdb-backend/app/git_sync.py create mode 100644 projects/duckdb-backend/app/main.py create mode 100644 projects/duckdb-backend/app/models.py create mode 100644 projects/duckdb-backend/app/routes/__init__.py create mode 100644 projects/duckdb-backend/app/routes/dashboard.py create mode 100644 projects/duckdb-backend/app/routes/entities.py create mode 100644 projects/duckdb-backend/app/routes/events.py create mode 100644 projects/duckdb-backend/app/routes/query.py create mode 100644 projects/duckdb-backend/app/routes/system.py create mode 100644 projects/duckdb-backend/app/who_growth.py create mode 100644 projects/duckdb-backend/pyproject.toml create mode 100644 projects/duckdb-backend/tests/conftest.py create mode 100644 projects/duckdb-backend/tests/test_api_curated.py create mode 100644 projects/duckdb-backend/tests/test_api_events.py create mode 100644 projects/duckdb-backend/tests/test_api_query.py create mode 100644 projects/duckdb-backend/tests/test_engine.py create mode 100644 projects/duckdb-backend/tests/test_git_sync.py create mode 100644 projects/duckdb-backend/uv.lock create mode 100644 projects/mila/AGENTS.md create mode 100644 projects/mila/Dockerfile create mode 100644 projects/mila/README.md create mode 100644 projects/mila/index.html create mode 100644 projects/mila/nginx.conf create mode 100644 projects/mila/package-lock.json create mode 100644 projects/mila/package.json create mode 100644 projects/mila/public/favicon.ico create mode 100644 projects/mila/public/manifest.json create mode 100644 projects/mila/public/mila-apple-touch-icon-v3.png create mode 100644 projects/mila/public/mila-apple-touch-icon.png create mode 100644 projects/mila/public/mila-icon-16-v3.png create mode 100644 projects/mila/public/mila-icon-16.png create mode 100644 projects/mila/public/mila-icon-192-v3.png create mode 100644 projects/mila/public/mila-icon-192.png create mode 100644 projects/mila/public/mila-icon-32-v3.png create mode 100644 projects/mila/public/mila-icon-32.png create mode 100644 projects/mila/public/mila-icon-512-v3.png create mode 100644 projects/mila/public/mila-icon-512.png create mode 100644 projects/mila/public/mila-icon.svg create mode 100644 projects/mila/public/mila.html create mode 100644 projects/mila/public/mila.webmanifest create mode 100644 projects/mila/public/sw.js create mode 100644 projects/mila/src/App.vue create mode 100644 projects/mila/src/api.ts create mode 100644 projects/mila/src/components/FeedingAnalyticsTool.vue create mode 100644 projects/mila/src/components/SleepChart.vue create mode 100644 projects/mila/src/components/TrackingModal.vue create mode 100644 projects/mila/src/components/WhoGrowthTool.vue create mode 100644 projects/mila/src/main.ts create mode 100644 projects/mila/src/style.css create mode 100644 projects/mila/src/types.ts create mode 100644 projects/mila/tsconfig.json create mode 100644 projects/mila/vite.config.ts create mode 100644 projects/moritz/AGENTS.md create mode 100644 projects/moritz/Dockerfile create mode 100644 projects/moritz/README.md create mode 100644 projects/moritz/index.html create mode 100644 projects/moritz/nginx.conf create mode 100644 projects/moritz/package-lock.json create mode 100644 projects/moritz/package.json create mode 100644 projects/moritz/public/favicon.ico create mode 100644 projects/moritz/public/manifest.json create mode 100644 projects/moritz/public/moritz-apple-touch-icon.png create mode 100644 projects/moritz/public/moritz-icon-16.png create mode 100644 projects/moritz/public/moritz-icon-192.png create mode 100644 projects/moritz/public/moritz-icon-32.png create mode 100644 projects/moritz/public/moritz-icon-512.png create mode 100644 projects/moritz/public/moritz-icon.svg create mode 100644 projects/moritz/public/moritz.webmanifest create mode 100644 projects/moritz/public/sw.js create mode 100644 projects/moritz/src/App.vue create mode 100644 projects/moritz/src/api.ts create mode 100644 projects/moritz/src/components/EnergyBalanceChart.vue create mode 100644 projects/moritz/src/components/MealTrackingModal.vue create mode 100644 projects/moritz/src/main.ts create mode 100644 projects/moritz/src/style.css create mode 100644 projects/moritz/src/types.ts create mode 100644 projects/moritz/tsconfig.json create mode 100644 projects/moritz/vite.config.ts diff --git a/k8s/family/duckdb-backend.yaml b/k8s/family/duckdb-backend.yaml new file mode 100644 index 0000000..9a19cc3 --- /dev/null +++ b/k8s/family/duckdb-backend.yaml @@ -0,0 +1,151 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: duckdb-backend + namespace: family + labels: + app.kubernetes.io/name: duckdb-backend + app.kubernetes.io/part-of: family-portal +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: duckdb-backend + template: + metadata: + labels: + app.kubernetes.io/name: duckdb-backend + app.kubernetes.io/part-of: family-portal + spec: + imagePullSecrets: + - name: registry-haumdaucher-de + initContainers: + - name: git-init + image: alpine/git:latest + command: ["/bin/sh", "-c"] + args: + - | + set -e + export HOME=/tmp + cd /wiki + if [ ! -d ".git" ]; then + echo "Initializing wiki repository on dedicated PVC..." + REPO_URL="https://${GIT_SYNC_USERNAME}:${GIT_SYNC_PASSWORD}@git.moritzgraf.de/moritz/knowledge-wiki.git" + git config --global http.sslVerify false + git config --global --add safe.directory /wiki + git config --global --add safe.directory '*' + git init + git remote add origin "$REPO_URL" || git remote set-url origin "$REPO_URL" + git fetch origin main + git checkout -f -B main origin/main + echo "Clone completed successfully." + else + echo "Repository already initialized on PVC, updating..." + REPO_URL="https://${GIT_SYNC_USERNAME}:${GIT_SYNC_PASSWORD}@git.moritzgraf.de/moritz/knowledge-wiki.git" + git config --global http.sslVerify false + git config --global --add safe.directory /wiki + git config --global --add safe.directory '*' + git remote set-url origin "$REPO_URL" + if [ -f .git/shallow ]; then + echo "Unshallowing existing repository..." + git fetch --unshallow origin main || git fetch origin main + else + git fetch origin main + fi + git pull --rebase --autostash origin main || true + fi + env: + - name: GIT_SYNC_USERNAME + valueFrom: + secretKeyRef: + name: wiki-git-credentials + key: git-sync-username + - name: GIT_SYNC_PASSWORD + valueFrom: + secretKeyRef: + name: wiki-git-credentials + key: wiki-sync-token + volumeMounts: + - name: duckdb-wiki-data + mountPath: /wiki + containers: + - name: duckdb-backend + image: registry.haumdaucher.de/family/duckdb-backend:latest + imagePullPolicy: Always + env: + - name: DATA_DIR + value: "/wiki/data" + - name: DUCKDB_DATA_DIR + value: "/wiki/data" + - name: WIKI_DIR + value: "/wiki" + - name: GIT_REPO_DIR + value: "/wiki" + - name: GIT_REPO_URL + value: "https://git.moritzgraf.de/moritz/knowledge-wiki.git" + - name: GIT_REMOTE_URL + value: "https://git.moritzgraf.de/moritz/knowledge-wiki.git" + - name: GIT_SYNC_USERNAME + valueFrom: + secretKeyRef: + name: wiki-git-credentials + key: git-sync-username + - name: GIT_SYNC_PASSWORD + valueFrom: + secretKeyRef: + name: wiki-git-credentials + key: wiki-sync-token + - name: GIT_SYNC_INTERVAL_SECONDS + value: "60" + - name: PORT + value: "8000" + - name: HOST + value: "0.0.0.0" + ports: + - name: http + containerPort: 8000 + volumeMounts: + - name: duckdb-wiki-data + mountPath: /wiki + resources: + requests: + cpu: 50m + memory: 128Mi + limits: + cpu: 1000m + memory: 1Gi + readinessProbe: + httpGet: + path: /duckdb-api/v1/healthz + port: 8000 + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /duckdb-api/v1/healthz + port: 8000 + initialDelaySeconds: 15 + periodSeconds: 20 + volumes: + - name: duckdb-wiki-data + persistentVolumeClaim: + claimName: duckdb-wiki-data +--- +apiVersion: v1 +kind: Service +metadata: + name: duckdb-backend + namespace: family + labels: + app.kubernetes.io/name: duckdb-backend + app.kubernetes.io/part-of: family-portal +spec: + type: ClusterIP + ports: + - port: 8000 + targetPort: 8000 + name: http + selector: + app.kubernetes.io/name: duckdb-backend diff --git a/k8s/family/git-credentials.secret.yaml b/k8s/family/git-credentials.secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..18b6048ae544b46111b999c99264eba6032d513c GIT binary patch literal 226 zcmV<803H7TM@dveQdv+`09?l3|G<8_)%}@!TQyZmlAFkeKxegX@j@08=^Yo!)4mW^ zE9^YDRJI00*YxihnGQMgV2Az67%m;%i^PwfYS!d3lV5oDGjZkKJB3Fs?43s85Q0pt z9R;6g2Fh$X?@y9gO^>AEt&W3SC$7<+lBgNK5&v)Yi()Wxdr5|kSyjUYG9Exdnn%(P zn;+#q%*rrxUTf~OzGgY5CQ>6Cq>Sw>wZe5d8Bt6RpP{yQ&9KBe7)2c>(5I6G*uPKo ci1#UudSFZ*s_NqD^qx{P=+hZ^xHM;Z09XQTUjP6A literal 0 HcmV?d00001 diff --git a/k8s/family/ingress.yaml b/k8s/family/ingress.yaml new file mode 100644 index 0000000..62c4535 --- /dev/null +++ b/k8s/family/ingress.yaml @@ -0,0 +1,55 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: family-portal + namespace: family + annotations: + kubernetes.io/ingress.class: "traefik" + cert-manager.io/cluster-issuer: "letsencrypt-prod" + kubernetes.io/tls-acme: "true" + traefik.ingress.kubernetes.io/router.middlewares: auth-authentik-forwardauth@kubernetescrd +spec: + ingressClassName: traefik + tls: + - hosts: + - family.haumdaucher.de + secretName: family-haumdaucher-de-tls + rules: + - host: family.haumdaucher.de + http: + paths: + - path: /duckdb-api + pathType: Prefix + backend: + service: + name: duckdb-backend + port: + number: 8000 + - path: /tracking/mila + pathType: Prefix + backend: + service: + name: mila + port: + number: 80 + - path: /tracking/moritz + pathType: Prefix + backend: + service: + name: moritz + port: + number: 80 + - path: /outpost.goauthentik.io + pathType: Prefix + backend: + service: + name: duckdb-backend + port: + number: 8000 + - path: / + pathType: Prefix + backend: + service: + name: mila + port: + number: 80 diff --git a/k8s/family/mila.yaml b/k8s/family/mila.yaml new file mode 100644 index 0000000..3fd6707 --- /dev/null +++ b/k8s/family/mila.yaml @@ -0,0 +1,64 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mila + namespace: family + labels: + app.kubernetes.io/name: mila + app.kubernetes.io/part-of: family-portal +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: mila + template: + metadata: + labels: + app.kubernetes.io/name: mila + app.kubernetes.io/part-of: family-portal + spec: + imagePullSecrets: + - name: registry-haumdaucher-de + containers: + - name: mila + image: registry.haumdaucher.de/family/mila:latest + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + resources: + requests: + cpu: 25m + memory: 32Mi + limits: + cpu: 100m + memory: 128Mi + readinessProbe: + httpGet: + path: /tracking/mila/ + port: 80 + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /tracking/mila/ + port: 80 + initialDelaySeconds: 10 + periodSeconds: 15 +--- +apiVersion: v1 +kind: Service +metadata: + name: mila + namespace: family + labels: + app.kubernetes.io/name: mila + app.kubernetes.io/part-of: family-portal +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 80 + name: http + selector: + app.kubernetes.io/name: mila diff --git a/k8s/family/moritz.yaml b/k8s/family/moritz.yaml new file mode 100644 index 0000000..9d8d70c --- /dev/null +++ b/k8s/family/moritz.yaml @@ -0,0 +1,64 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: moritz + namespace: family + labels: + app.kubernetes.io/name: moritz + app.kubernetes.io/part-of: family-portal +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: moritz + template: + metadata: + labels: + app.kubernetes.io/name: moritz + app.kubernetes.io/part-of: family-portal + spec: + imagePullSecrets: + - name: registry-haumdaucher-de + containers: + - name: moritz + image: registry.haumdaucher.de/family/moritz:latest + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + resources: + requests: + cpu: 25m + memory: 32Mi + limits: + cpu: 100m + memory: 128Mi + readinessProbe: + httpGet: + path: /tracking/moritz/ + port: 80 + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /tracking/moritz/ + port: 80 + initialDelaySeconds: 10 + periodSeconds: 15 +--- +apiVersion: v1 +kind: Service +metadata: + name: moritz + namespace: family + labels: + app.kubernetes.io/name: moritz + app.kubernetes.io/part-of: family-portal +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 80 + name: http + selector: + app.kubernetes.io/name: moritz diff --git a/k8s/family/namespace.yaml b/k8s/family/namespace.yaml new file mode 100644 index 0000000..64f8947 --- /dev/null +++ b/k8s/family/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: family + labels: + name: family diff --git a/k8s/family/pvc.yaml b/k8s/family/pvc.yaml new file mode 100644 index 0000000..a7b146b --- /dev/null +++ b/k8s/family/pvc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: duckdb-wiki-data + namespace: family + labels: + app.kubernetes.io/name: duckdb-backend + app.kubernetes.io/part-of: family-portal +spec: + accessModes: + - ReadWriteOnce + storageClassName: openebs-hostpath + resources: + requests: + storage: 5Gi diff --git a/k8s/family/registry.secret.yaml b/k8s/family/registry.secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e7587d868dd5656ce86cb9a1e45b7b909351422e GIT binary patch literal 385 zcmV-{0e=1fM@dveQdv+`0D`a?Dv`4oaB*`rL5+1yw$Z85bAv_rf#xFF_{a9MPI%!m znb!v0+fvD+DY|={`%qNNi`;y|!kF#pW#8y&90|2E!{#{~1XaGuJLU!MI|0ssQ{j@1 zKT;oPQ{@mVy8W*dzy*gXYoFVs3j^k)Ry77d|>1z5IWq!W! zTm4ho2fz@`r`>TiX<-_bIURYk()>{3N>SlGu4=$Ve0Key5+mxq>D+UBQ5r8_$7-Hz z6d)C#Nk0B@v(u1=x0Gq)v)ImNlH7M#+Sy(al&1OZQjl2cb*13!5DF**2d|D0Zhhth fH2%CXghhp3D2){Zg-f*N;v4TtbB`A}CB;E39LB&8 literal 0 HcmV?d00001 diff --git a/k8s/minio/hosting-ingress.yaml b/k8s/minio/hosting-ingress.yaml index 5ff9fee..bffe658 100644 --- a/k8s/minio/hosting-ingress.yaml +++ b/k8s/minio/hosting-ingress.yaml @@ -10,15 +10,37 @@ spec: apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: - name: hosting-legacy-redirect + name: hosting-redirect-mila namespace: minio spec: redirectRegex: - regex: "^https?://([^/]+)/(mila|moritz|nutrition|sleep)\\.html(.*)" - replacement: "https://${1}/family/${2}.html${3}" - permanent: false + regex: "^https?://([^/]+)/(?:family/)?(mila|sleep)\\.html.*" + replacement: "https://family.haumdaucher.de/tracking/mila/" + permanent: true --- -# Public Ingress for hosting.haumdaucher.de (Recipes, Public Assets) +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: hosting-redirect-moritz + namespace: minio +spec: + redirectRegex: + regex: "^https?://([^/]+)/(?:family/)?(moritz|nutrition)\\.html.*" + replacement: "https://family.haumdaucher.de/tracking/moritz/" + permanent: true +--- +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: hosting-redirect-family-root + namespace: minio +spec: + redirectRegex: + regex: "^https?://([^/]+)/family/?$" + replacement: "https://family.haumdaucher.de/" + permanent: true +--- +# Public Ingress for hosting.haumdaucher.de (Recipes, Public Assets, Legacy Redirects) apiVersion: networking.k8s.io/v1 kind: Ingress metadata: @@ -29,7 +51,7 @@ metadata: cert-manager.io/cluster-issuer: "letsencrypt-prod" kubernetes.io/tls-acme: "true" traefik.ingress.kubernetes.io/router.priority: "10" - traefik.ingress.kubernetes.io/router.middlewares: minio-hosting-legacy-redirect@kubernetescrd,minio-hosting-add-prefix@kubernetescrd + traefik.ingress.kubernetes.io/router.middlewares: minio-hosting-redirect-mila@kubernetescrd,minio-hosting-redirect-moritz@kubernetescrd,minio-hosting-redirect-family-root@kubernetescrd,minio-hosting-add-prefix@kubernetescrd spec: ingressClassName: traefik rules: @@ -48,8 +70,7 @@ spec: - hosting.haumdaucher.de secretName: hosting-haumdaucher-de-tls --- -# Protected Ingress for /family (Family Dashboards, Nutrition & Sleep Analytics) -# Protected by Authentik ForwardAuth +# Protected Ingress for /family (Redirects and Authentik Outpost) apiVersion: networking.k8s.io/v1 kind: Ingress metadata: @@ -60,7 +81,7 @@ metadata: cert-manager.io/cluster-issuer: "letsencrypt-prod" kubernetes.io/tls-acme: "true" traefik.ingress.kubernetes.io/router.priority: "100" - traefik.ingress.kubernetes.io/router.middlewares: auth-authentik-forwardauth@kubernetescrd,minio-hosting-add-prefix@kubernetescrd + traefik.ingress.kubernetes.io/router.middlewares: minio-hosting-redirect-mila@kubernetescrd,minio-hosting-redirect-moritz@kubernetescrd,minio-hosting-redirect-family-root@kubernetescrd,auth-authentik-forwardauth@kubernetescrd,minio-hosting-add-prefix@kubernetescrd spec: ingressClassName: traefik rules: diff --git a/k8s/openclaw/cronjob-wiki-backup.secret.yaml b/k8s/openclaw/cronjob-wiki-backup.secret.yaml index 9f223f250f1ef2f34fc1f3b5f35bcfef57bd88a3..f516948d478d0d2c555c177a345bb3e660c8ec97 100644 GIT binary patch literal 8412 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 literal 8406 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 Path: + env_wiki = os.environ.get("WIKI_DIR") or os.environ.get("GIT_REPO_DIR") + if env_wiki: + return Path(env_wiki).resolve() + + candidates = [ + Path("/wiki"), + Path.cwd() / "knowledge-wiki", + Path.cwd().parent.parent / "knowledge-wiki", + Path("/Users/moritz/src/infrapuzzle/knowledge-wiki"), + Path.home() / "src" / "infrapuzzle" / "knowledge-wiki", + Path("/home/node/.openclaw/wiki/main"), + ] + for c in candidates: + if c.is_dir() and (c / "data").is_dir(): + return c.resolve() + + return (Path.cwd() / "knowledge-wiki").resolve() + + +WIKI_DIR = find_default_wiki_dir() +DATA_DIR = Path( + os.environ.get("DATA_DIR") + or os.environ.get("DUCKDB_DATA_DIR") + or (WIKI_DIR / "data") +).resolve() + +GIT_REPO_URL = os.environ.get( + "GIT_REPO_URL", + os.environ.get("GIT_REMOTE_URL", "https://git.moritzgraf.de/moritz/knowledge-wiki.git"), +) +GIT_USERNAME = os.environ.get("GIT_SYNC_USERNAME", "") +GIT_PASSWORD = os.environ.get("GIT_SYNC_PASSWORD", os.environ.get("WIKI_SYNC_TOKEN", "")) +GIT_BRANCH = os.environ.get("GIT_BRANCH", "main") +GIT_SYNC_INTERVAL_SECONDS = int(os.environ.get("GIT_SYNC_INTERVAL_SECONDS", "60")) +AUTO_GIT_SYNC = os.environ.get("AUTO_GIT_SYNC", "true").lower() in ("1", "true", "yes") +GIT_AUTHOR_NAME = os.environ.get("GIT_AUTHOR_NAME", "DuckDB Backend") +GIT_AUTHOR_EMAIL = os.environ.get("GIT_AUTHOR_EMAIL", "duckdb-backend@haumdaucher.de") + +PORT = int(os.environ.get("PORT", "8000")) +HOST = os.environ.get("HOST", "0.0.0.0") diff --git a/projects/duckdb-backend/app/engine.py b/projects/duckdb-backend/app/engine.py new file mode 100644 index 0000000..f6ac132 --- /dev/null +++ b/projects/duckdb-backend/app/engine.py @@ -0,0 +1,2287 @@ +from __future__ import annotations + +import datetime +import json +import logging +import math +import os +import re +import threading +import time +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union +from zoneinfo import ZoneInfo + +import duckdb +from ulid import ULID + +from app.config import DATA_DIR +from app.git_sync import GitSyncManager +from app.models import EventCreateRequest, EventStopRequest, EntityPutRequest, GarminSyncRequest +from app.who_growth import calculate_percentile + +logger = logging.getLogger("duckdb_backend.engine") +BERLIN_TZ = ZoneInfo("Europe/Berlin") +MILA_BIRTHDATE = datetime.date(2026, 3, 14) + +WEEKDAYS_DE = {0: "Mo", 1: "Di", 2: "Mi", 3: "Do", 4: "Fr", 5: "Sa", 6: "So"} +WEEKDAYS_LONG_DE = { + 0: "Montag", + 1: "Dienstag", + 2: "Mittwoch", + 3: "Donnerstag", + 4: "Freitag", + 5: "Samstag", + 6: "Sonntag", +} + +VALID_COLS_MAP = { + "nutrition": { + "id", "kind", "subject", "actor", "start", "end", "estimated", "meal", + "note", "payload", "source_ref", "created_at", "updated_at", "deleted_at" + }, + "mila": { + "id", "kind", "subject", "actor", "start", "end", "note", "payload", + "source_ref", "created_at", "updated_at", "deleted_at" + }, + "sleep": { + "id", "subject", "calendarDate", "sleepType", "location", "isOpen", + "startIso", "endIso", "sleepStartTimestampGMT", "sleepEndTimestampGMT", + "sleepStartTimestampLocal", "sleepEndTimestampLocal", "sleepTimeSeconds", + "napTimeSeconds", "deepSleepSeconds", "lightSleepSeconds", "remSleepSeconds", + "awakeSleepSeconds", "awakeCount", "avgSleepStress", "avgHeartRate", + "averageSpO2Value", "lowestSpO2Value", "highestSpO2Value", + "averageRespirationValue", "sleepScores", "avgOvernightHrv", "hrvStatus", + "bodyBatteryChange", "restingHeartRate", "restlessMomentsCount", + "note", "actor", "created_at", "updated_at", "deleted_at" + }, +} + + +def parse_duration(val: str) -> datetime.timedelta: + s = val.strip().lower() + if not s: + raise ValueError("Empty duration string") + + m_dec_h = re.fullmatch(r"^(\d+(?:\.\d+)?)\s*(?:h|stunden?)$", s) + if m_dec_h: + return datetime.timedelta(hours=float(m_dec_h.group(1))) + + m_dec_m = re.fullmatch(r"^(\d+(?:\.\d+)?)\s*(?:m|min|minuten?)$", s) + if m_dec_m: + return datetime.timedelta(minutes=float(m_dec_m.group(1))) + + m_comp = re.fullmatch( + r"^(?:(\d+)\s*(?:h|stunden?))?\s*(?:(\d+)\s*(?:m|min|minuten?))?\s*(?:(\d+)\s*(?:s|sek|sekunden?))?$", + s, + ) + if m_comp and any(m_comp.groups()): + h = int(m_comp.group(1) or 0) + m = int(m_comp.group(2) or 0) + sec = int(m_comp.group(3) or 0) + return datetime.timedelta(hours=h, minutes=m, seconds=sec) + + if s.isdigit(): + return datetime.timedelta(minutes=int(s)) + + raise ValueError(f"Unrecognized duration format: '{val}'. Expected '15m', '1h', etc.") + + +def calculate_age_str(as_of: datetime.date) -> str: + days = (as_of - MILA_BIRTHDATE).days + if days < 0: + return "Geboren am 14.03.2026" + months = days // 30.4375 + weeks = (days % 30.4375) // 7 + if months < 1: + return f"{days // 7} Wochen alt" + if weeks > 0: + return f"{int(months)} Monate, {int(weeks)} Wochen alt" + return f"{int(months)} Monate alt" + + +class DuckDBEngine: + def __init__(self, data_dir: Optional[Path] = None, git_sync_manager: Optional[GitSyncManager] = None): + self.data_dir = (data_dir or DATA_DIR).resolve() + self.git_sync_manager = git_sync_manager + self._lock = threading.RLock() + self.con = duckdb.connect(":memory:") + self._init_schemas() + self.reload_all() + + def _init_schemas(self): + with self._lock: + try: + self.con.execute("INSTALL icu; LOAD icu;") + self.con.execute("SET TimeZone = 'UTC';") + except Exception: + pass + + self.con.execute(""" + CREATE MACRO IF NOT EXISTS distance_m(lat1, lon1, lat2, lon2) AS + 6371000 * 2 * asin(sqrt( + sin(radians(lat2 - lat1) / 2) ^ 2 + + cos(radians(lat1)) * cos(radians(lat2)) * sin(radians(lon2 - lon1) / 2) ^ 2 + )); + """) + + schema_dir = self.data_dir / "_schema" + if not schema_dir.is_dir(): + candidates = [ + Path("/wiki/data/_schema"), + Path.cwd() / "knowledge-wiki" / "data" / "_schema", + Path.cwd().parent.parent / "knowledge-wiki" / "data" / "_schema", + ] + for c in candidates: + if c.is_dir(): + schema_dir = c + break + + if schema_dir.is_dir(): + for f in ["envelope.sql", "entities.sql", "views.sql"]: + sql_file = schema_dir / f + if sql_file.is_file(): + self.con.execute(sql_file.read_text(encoding="utf-8")) + else: + self._create_fallback_schema() + + self.con.execute(""" + CREATE OR REPLACE MACRO distance_m(lat1, lon1, lat2, lon2) AS ( + 6371000.0 * 2.0 * asin(sqrt( + sin(radians(lat2 - lat1) / 2.0) * sin(radians(lat2 - lat1) / 2.0) + + cos(radians(lat1)) * cos(radians(lat2)) * + sin(radians(lon2 - lon1) / 2.0) * sin(radians(lon2 - lon1) / 2.0) + )) + ); + """) + + def _create_fallback_schema(self): + self.con.execute(""" + CREATE TABLE IF NOT EXISTS sleep ( + id VARCHAR PRIMARY KEY, + subject VARCHAR NOT NULL, + calendarDate DATE NOT NULL, + sleepType VARCHAR NOT NULL, + location VARCHAR, + isOpen BOOLEAN DEFAULT false, + startIso TIMESTAMPTZ NOT NULL, + endIso TIMESTAMPTZ, + sleepStartTimestampGMT BIGINT, + sleepEndTimestampGMT BIGINT, + sleepStartTimestampLocal BIGINT, + sleepEndTimestampLocal BIGINT, + sleepTimeSeconds INTEGER, + napTimeSeconds INTEGER, + deepSleepSeconds INTEGER, + lightSleepSeconds INTEGER, + remSleepSeconds INTEGER, + awakeSleepSeconds INTEGER, + awakeCount INTEGER, + avgSleepStress DOUBLE, + avgHeartRate DOUBLE, + averageSpO2Value DOUBLE, + lowestSpO2Value INTEGER, + highestSpO2Value INTEGER, + averageRespirationValue DOUBLE, + sleepScores JSON, + avgOvernightHrv DOUBLE, + hrvStatus VARCHAR, + bodyBatteryChange INTEGER, + restingHeartRate INTEGER, + restlessMomentsCount INTEGER, + note VARCHAR, + actor VARCHAR NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ, + deleted_at TIMESTAMPTZ + ); + + CREATE TABLE IF NOT EXISTS nutrition ( + id VARCHAR PRIMARY KEY, + kind VARCHAR NOT NULL, + subject VARCHAR NOT NULL, + actor VARCHAR NOT NULL, + start TIMESTAMPTZ NOT NULL, + "end" TIMESTAMPTZ, + estimated BOOLEAN DEFAULT false, + meal VARCHAR, + note VARCHAR, + payload JSON NOT NULL, + source_ref VARCHAR, + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ, + deleted_at TIMESTAMPTZ + ); + + CREATE TABLE IF NOT EXISTS mila ( + id VARCHAR PRIMARY KEY, + kind VARCHAR NOT NULL, + subject VARCHAR NOT NULL DEFAULT 'mila', + actor VARCHAR NOT NULL, + start TIMESTAMPTZ NOT NULL, + "end" TIMESTAMPTZ, + note VARCHAR, + payload JSON NOT NULL, + source_ref VARCHAR, + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ, + deleted_at TIMESTAMPTZ + ); + + CREATE TABLE IF NOT EXISTS people ( + id VARCHAR PRIMARY KEY, + name VARCHAR NOT NULL, + role VARCHAR, + birthdate DATE, + notes VARCHAR + ); + + CREATE TABLE IF NOT EXISTS foods ( + id VARCHAR PRIMARY KEY, + name VARCHAR NOT NULL, + brand VARCHAR, + category VARCHAR, + per_100 JSON, + density_g_per_ml DOUBLE, + ingredients_text VARCHAR, + barcode VARCHAR, + source VARCHAR, + description VARCHAR + ); + + CREATE TABLE IF NOT EXISTS recipes ( + id VARCHAR PRIMARY KEY, + title VARCHAR NOT NULL, + servings INTEGER DEFAULT 1, + ingredients JSON, + estimated_delta JSON, + devices VARCHAR[], + tags VARCHAR[], + documents VARCHAR[], + description VARCHAR + ); + + CREATE TABLE IF NOT EXISTS places ( + id VARCHAR PRIMARY KEY, + name VARCHAR NOT NULL, + category VARCHAR NOT NULL, + lat DOUBLE NOT NULL, + lon DOUBLE NOT NULL, + address VARCHAR, + google_maps_url VARCHAR, + tags VARCHAR[], + attributes JSON, + documents VARCHAR[], + notes VARCHAR + ); + + CREATE TABLE IF NOT EXISTS garmin_daily ( + calendarDate DATE PRIMARY KEY, + totalKilocalories INTEGER, + activeKilocalories INTEGER, + bmrKilocalories INTEGER, + totalSteps INTEGER, + restingHeartRate INTEGER, + raw JSON + ); + """) + + def reload_all(self): + """Reloads all JSONL files from data_dir into DuckDB using fast vector-optimized read_json_auto.""" + with self._lock: + # Clear tables + for tbl in ["sleep", "nutrition", "mila", "foods", "recipes", "places", "people", "garmin_daily"]: + try: + self.con.execute(f'DELETE FROM "{tbl}";') + except Exception: + pass + + if not self.data_dir.is_dir(): + return + + # 1. Entities + entities_dir = self.data_dir / "entities" + if entities_dir.is_dir(): + for coll in ["foods", "recipes", "places", "people"]: + f = entities_dir / f"{coll}.jsonl" + if f.is_file() and f.stat().st_size > 0: + try: + self.con.execute(f'INSERT OR REPLACE INTO "{coll}" SELECT * FROM read_json_auto(?, union_by_name=true)', [str(f)]) + except Exception as e: + logger.warning(f"Fast load failed for {coll}, falling back: {e}") + self._load_jsonl_file(f, coll) + + # 2. Nutrition + nutrition_files = list((self.data_dir / "nutrition").glob("*.jsonl")) if (self.data_dir / "nutrition").is_dir() else [] + valid_nutrition = [str(f) for f in nutrition_files if f.stat().st_size > 0] + if valid_nutrition: + try: + self.con.execute('INSERT OR REPLACE INTO nutrition SELECT * FROM read_json_auto(?, union_by_name=true)', [valid_nutrition]) + except Exception as e: + logger.warning(f"Fast load failed for nutrition, falling back: {e}") + for f in nutrition_files: + self._load_jsonl_file(f, "nutrition") + + # 3. Sleep + sleep_files = list((self.data_dir / "sleep").glob("*.jsonl")) if (self.data_dir / "sleep").is_dir() else [] + valid_sleep = [str(f) for f in sleep_files if f.stat().st_size > 0] + if valid_sleep: + try: + self.con.execute('INSERT OR REPLACE INTO sleep SELECT * FROM read_json_auto(?, union_by_name=true)', [valid_sleep]) + except Exception as e: + logger.warning(f"Fast load failed for sleep, falling back: {e}") + for f in sleep_files: + self._load_jsonl_file(f, "sleep") + + # 4. Mila + mila_files = list((self.data_dir / "mila").glob("*.jsonl")) if (self.data_dir / "mila").is_dir() else [] + valid_mila = [str(f) for f in mila_files if f.stat().st_size > 0] + if valid_mila: + try: + self.con.execute( + """ + INSERT OR REPLACE INTO mila (id, kind, subject, actor, start, "end", note, payload, source_ref, created_at, updated_at, deleted_at) + SELECT id, kind, subject, actor, start, "end", note, payload, source_ref, created_at, updated_at, deleted_at + FROM read_json_auto(?, union_by_name=true) + """, + [valid_mila], + ) + except Exception as e: + logger.warning(f"Fast load failed for mila, falling back: {e}") + for f in mila_files: + self._load_jsonl_file(f, "mila") + + # 5. Garmin daily + garmin_dir = self.data_dir / "garmin" / "daily" + garmin_files = list(garmin_dir.glob("*.jsonl")) if garmin_dir.is_dir() else [] + valid_garmin = [str(f) for f in garmin_files if f.stat().st_size > 0] + if valid_garmin: + try: + self.con.execute( + """ + INSERT OR REPLACE INTO garmin_daily + SELECT calendarDate, totalKilocalories, activeKilocalories, bmrKilocalories, totalSteps, restingHeartRate, to_json(r) AS raw + FROM read_json_auto(?, union_by_name=true) r + """, + [valid_garmin], + ) + except Exception as e: + logger.warning(f"Fast load failed for garmin daily, falling back: {e}") + for f in garmin_files: + self._load_garmin_daily(f) + + def _load_jsonl_file(self, file_path: Path, table_name: str): + if not file_path.is_file() or file_path.stat().st_size == 0: + return + + allowed_cols = VALID_COLS_MAP.get(table_name) + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + r = json.loads(line) + if allowed_cols: + cols = [c for c in r.keys() if c in allowed_cols] + else: + cols = list(r.keys()) + col_names = ", ".join([f'"{c}"' for c in cols]) + placeholders = ", ".join(["?"] * len(cols)) + vals = [json.dumps(r[c]) if isinstance(r[c], (dict, list)) else r[c] for c in cols] + self.con.execute( + f'INSERT OR REPLACE INTO "{table_name}" ({col_names}) VALUES ({placeholders})', + vals, + ) + except Exception as e: + logger.warning(f"Error loading {table_name} record from {file_path}: {e}") + + def _load_garmin_daily(self, file_path: Path): + if not file_path.is_file() or file_path.stat().st_size == 0: + return + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + r = json.loads(line) + cal_date = r.get("calendarDate") + if not cal_date: + continue + self.con.execute( + """ + INSERT OR REPLACE INTO garmin_daily + (calendarDate, totalKilocalories, activeKilocalories, bmrKilocalories, totalSteps, restingHeartRate, raw) + VALUES (?, ?, ?, ?, ?, ?, ?) + """, + [ + cal_date, + r.get("totalKilocalories"), + r.get("activeKilocalories"), + r.get("bmrKilocalories"), + r.get("totalSteps"), + r.get("restingHeartRate"), + json.dumps(r, ensure_ascii=False), + ], + ) + except Exception as e: + logger.warning(f"Error loading garmin record from {file_path}: {e}") + + def get_table_counts(self) -> Dict[str, int]: + with self._lock: + counts = {} + for tbl in ["sleep", "nutrition", "mila", "foods", "recipes", "places", "people", "garmin_daily"]: + try: + res = self.con.execute(f'SELECT count(*) FROM "{tbl}"').fetchone() + counts[tbl] = res[0] if res else 0 + except Exception: + counts[tbl] = 0 + return counts + + # -------------------------------------------------------------------------- + # Read Queries + # -------------------------------------------------------------------------- + def query(self, sql: str, params: Optional[list] = None) -> List[Dict[str, Any]]: + clean_sql = sql.strip() + disallowed = ["DROP ", "ALTER ", "TRUNCATE ", "DELETE ", "UPDATE ", "INSERT "] + for d in disallowed: + if clean_sql.upper().startswith(d): + raise ValueError(f"Direct {d.strip()} queries not permitted via query(). Use dedicated write methods.") + + with self._lock: + cursor = self.con.execute(clean_sql, params or []) + cols = [desc[0] for desc in cursor.description] + rows = cursor.fetchall() + results = [] + for row in rows: + rec = {} + for col, val in zip(cols, row): + if isinstance(val, (datetime.datetime, datetime.date)): + rec[col] = val.isoformat() + else: + rec[col] = val + results.append(rec) + return results + + # -------------------------------------------------------------------------- + # Curated Mila Dashboard Payload + # -------------------------------------------------------------------------- + def get_mila_dashboard(self, as_of_date: Optional[str] = None) -> Dict[str, Any]: + t0 = time.perf_counter() + now_berlin = datetime.datetime.now(BERLIN_TZ) + today_date = datetime.date.fromisoformat(as_of_date) if as_of_date else now_berlin.date() + today_str = today_date.strftime("%Y-%m-%d") + today_pretty = f"{WEEKDAYS_LONG_DE[today_date.weekday()]}, {today_date.strftime('%d.%m.%Y')}" + age_str = calculate_age_str(today_date) + + with self._lock: + # 1. Active open sleep check + open_sleep = self.con.execute( + """ + SELECT id, start, local_start, sleep_type, location, note, + date_diff('minute', start, CURRENT_TIMESTAMP) AS duration_mins + FROM v_sleep + WHERE subject = 'mila' AND is_open = true + ORDER BY start DESC LIMIT 1 + """ + ).fetchone() + + is_sleeping = open_sleep is not None + active_sleep_id = open_sleep[0] if is_sleeping else None + active_sleep_duration_str = "" + active_sleep_start_time = "" + active_sleep_iso = "" + wake_window_str = "" + wake_window_minutes = 0 + last_wake_time_str = "" + last_wake_iso = "" + + if is_sleeping: + dur = max(0, open_sleep[6] or 0) + h, m = divmod(dur, 60) + active_sleep_duration_str = f"{h} h {m:02d} min" if h > 0 else f"{m} min" + s_dt = datetime.datetime.fromisoformat(str(open_sleep[2])) + active_sleep_start_time = s_dt.strftime("%H:%M") + active_sleep_iso = s_dt.isoformat() + wake_window_minutes = 0 + else: + last_closed = self.con.execute( + """ + SELECT "end", local_end, date_diff('minute', "end", CURRENT_TIMESTAMP) AS mins_ago + FROM v_sleep + WHERE subject = 'mila' AND is_open = false AND "end" IS NOT NULL + ORDER BY "end" DESC LIMIT 1 + """ + ).fetchone() + if last_closed: + mins_ago = max(0, last_closed[2] or 0) + wake_window_minutes = mins_ago + h, m = divmod(mins_ago, 60) + wake_window_str = f"{h} h {m:02d} min" if h > 0 else f"{m} min" + e_dt = datetime.datetime.fromisoformat(str(last_closed[1])) + last_wake_time_str = e_dt.strftime("%H:%M") + last_wake_iso = e_dt.isoformat() + + # Parent Cockpit Live Status: Last Feed & Last Diaper + last_feed = self.con.execute( + """ + SELECT "start", local_time, date_diff('minute', "start", CURRENT_TIMESTAMP) AS mins_ago, + consumed_ml, solid_g, item, kind + FROM v_feeding + WHERE subject = 'mila' AND "start" IS NOT NULL + ORDER BY "start" DESC LIMIT 1 + """ + ).fetchone() + + last_feed_iso = None + last_feed_time_str = None + last_feed_since_str = "—" + last_feed_since_minutes = None + last_feed_summary = None + + if last_feed: + f_mins = max(0, last_feed[2] or 0) + last_feed_since_minutes = f_mins + f_h, f_m = divmod(f_mins, 60) + last_feed_since_str = f"{f_h} h {f_m:02d} min" if f_h > 0 else f"{f_m} min" + f_dt = datetime.datetime.fromisoformat(str(last_feed[1])) + last_feed_time_str = f_dt.strftime("%H:%M") + last_feed_iso = f_dt.isoformat() + if last_feed[3]: + last_feed_summary = f"{last_feed[3]} ml" + elif last_feed[4]: + last_feed_summary = f"{last_feed[4]} g {last_feed[5] or ''}".strip() + else: + last_feed_summary = last_feed[5] or "Mahlzeit" + + last_diaper = self.con.execute( + """ + SELECT "start", local_time, date_diff('minute', "start", CURRENT_TIMESTAMP) AS mins_ago, + pee, poo, texture + FROM v_diaper + WHERE subject = 'mila' AND "start" IS NOT NULL + ORDER BY "start" DESC LIMIT 1 + """ + ).fetchone() + + last_diaper_iso = None + last_diaper_time_str = None + last_diaper_since_str = "—" + last_diaper_since_minutes = None + last_diaper_type = None + + if last_diaper: + d_mins = max(0, last_diaper[2] or 0) + last_diaper_since_minutes = d_mins + d_h, d_m = divmod(d_mins, 60) + last_diaper_since_str = f"{d_h} h {d_m:02d} min" if d_h > 0 else f"{d_m} min" + d_dt = datetime.datetime.fromisoformat(str(last_diaper[1])) + last_diaper_time_str = d_dt.strftime("%H:%M") + last_diaper_iso = d_dt.isoformat() + if last_diaper[3] and last_diaper[4]: + last_diaper_type = "Pipi & Stuhl" + elif last_diaper[4]: + last_diaper_type = "Stuhl" + elif last_diaper[3]: + last_diaper_type = "Pipi" + else: + last_diaper_type = "Windel" + + last_stool = self.con.execute( + """ + SELECT "start", local_time, date_diff('minute', "start", CURRENT_TIMESTAMP) AS mins_ago + FROM v_diaper + WHERE subject = 'mila' AND poo = true AND "start" IS NOT NULL + ORDER BY "start" DESC LIMIT 1 + """ + ).fetchone() + + last_stool_iso = None + last_stool_str = "—" + if last_stool: + st_mins = max(0, last_stool[2] or 0) + st_h, st_m = divmod(st_mins, 60) + last_stool_str = f"{st_h} h {st_m:02d} min" if st_h > 0 else f"{st_m} min" + st_dt = datetime.datetime.fromisoformat(str(last_stool[1])) + last_stool_iso = st_dt.isoformat() + + # 2. Today's sleep sessions + today_sessions = self.con.execute( + f""" + SELECT id, strftime(local_start, '%H:%M') AS start_fmt, + CASE WHEN is_open THEN NULL ELSE strftime(local_end, '%H:%M') END AS end_fmt, + sleep_type, location, note, duration_minutes, is_open + FROM v_sleep + WHERE subject = 'mila' AND ( + log_date = '{today_str}' + OR (sleep_type = 'night' AND CAST(local_end AS DATE) = '{today_str}') + ) + ORDER BY start ASC + """ + ).fetchall() + + today_naps = [] + today_nights = [] + for s in today_sessions: + s_dict = { + "id": s[0], + "start": s[1], + "end": s[2], + "sleep_type": s[3], + "location": s[4] or "", + "note": s[5] or "", + "duration_minutes": s[6], + "is_open": bool(s[7]), + } + if s[3] == "night": + today_nights.append(s_dict) + else: + today_naps.append(s_dict) + + # Daily sleep aggregate + today_agg = self.con.execute( + f""" + SELECT total_sleep_hours, nap_count, night_sleep_minutes, nap_sleep_minutes + FROM v_sleep_daily + WHERE subject = 'mila' AND log_date = '{today_str}' + """ + ).fetchone() + + morning_night = next((s for s in today_nights if not s["is_open"] and s["duration_minutes"]), None) + if morning_night and morning_night["duration_minutes"]: + today_night_min = morning_night["duration_minutes"] + else: + today_night_min = today_agg[2] if today_agg and today_agg[2] is not None else 0 + + today_nap_count = today_agg[1] if today_agg and today_agg[1] is not None else len(today_naps) + today_nap_min = sum(n["duration_minutes"] or 0 for n in today_naps) + today_tot_min = today_night_min + today_nap_min + today_tot_hours = f"{today_tot_min / 60.0:.2f} h" if today_tot_min > 0 else "0 h" + + today_night_h, today_night_m = divmod(today_night_min, 60) + today_night_dur_str = f"{today_night_h} h {today_night_m:02d} min" if today_night_h > 0 else f"{today_night_m} min" + + # 3. Today's feedings + feedings_rows = self.con.execute( + f""" + SELECT id, strftime(local_time, '%H:%M') AS time_str, + consumed_ml, milk_type, item, solid_g, kcal, kind, note + FROM v_feeding + WHERE subject = 'mila' AND log_date = '{today_str}' + ORDER BY start ASC + """ + ).fetchall() + + feedings_list = [] + for f in feedings_rows: + feedings_list.append({ + "id": f[0], + "time": f[1], + "consumed_ml": f[2], + "milk_type": f[3] or "", + "item": f[4] or "", + "solid_g": f[5], + "kcal": f[6], + "kind": f[7], + "note": f[8] or "", + }) + + feed_agg = self.con.execute( + f""" + SELECT bottle_count, total_consumed_ml, solid_count, total_solid_g, total_kcal + FROM v_feeding_daily + WHERE subject = 'mila' AND log_date = '{today_str}' + """ + ).fetchone() + + today_bottle_count = int(feed_agg[0]) if feed_agg and feed_agg[0] is not None else 0 + today_bottle_ml = int(feed_agg[1]) if feed_agg and feed_agg[1] is not None else 0 + today_solid_count = int(feed_agg[2]) if feed_agg and feed_agg[2] is not None else 0 + today_solid_g = int(feed_agg[3]) if feed_agg and feed_agg[3] is not None else 0 + today_feeding_kcal = int(feed_agg[4]) if feed_agg and feed_agg[4] is not None else 0 + + # 4. Today's diapers + diaper_rows = self.con.execute( + f""" + SELECT id, strftime(local_time, '%H:%M') AS time_str, pee, poo, texture, note + FROM v_diaper + WHERE subject = 'mila' AND log_date = '{today_str}' + ORDER BY start ASC + """ + ).fetchall() + + diaper_list = [] + for d in diaper_rows: + diaper_list.append({ + "id": d[0], + "time": d[1], + "pee": bool(d[2]), + "poo": bool(d[3]), + "texture": d[4] or "", + "note": d[5] or "", + }) + + diaper_agg = self.con.execute( + f""" + SELECT total_changes, wet_count, dirty_count + FROM v_diaper_daily + WHERE subject = 'mila' AND log_date = '{today_str}' + """ + ).fetchone() + + today_diaper_count = int(diaper_agg[0]) if diaper_agg and diaper_agg[0] is not None else 0 + today_wet_count = int(diaper_agg[1]) if diaper_agg and diaper_agg[1] is not None else 0 + today_dirty_count = int(diaper_agg[2]) if diaper_agg and diaper_agg[2] is not None else 0 + + # 5. 7d and 30d sleep averages + avg_7 = self.con.execute( + """ + SELECT ROUND(AVG(total_sleep_hours), 2), ROUND(AVG(night_sleep_minutes)/60.0, 2), + ROUND(AVG(nap_sleep_minutes)/60.0, 2), ROUND(AVG(nap_count), 1) + FROM (SELECT total_sleep_hours, night_sleep_minutes, nap_sleep_minutes, nap_count + FROM v_sleep_daily WHERE subject = 'mila' ORDER BY log_date DESC LIMIT 7) + """ + ).fetchone() + + avg_7_tot = f"{avg_7[0]:.2f} h" if avg_7 and avg_7[0] is not None else "—" + avg_7_night = f"{avg_7[1]:.2f} h" if avg_7 and avg_7[1] is not None else "—" + avg_7_naps = f"{avg_7[3]} Naps ({avg_7[2]:.2f} h)" if avg_7 and avg_7[3] is not None else "—" + + avg_30 = self.con.execute( + """ + SELECT ROUND(AVG(total_sleep_hours), 2) + FROM (SELECT total_sleep_hours FROM v_sleep_daily WHERE subject = 'mila' ORDER BY log_date DESC LIMIT 30) + """ + ).fetchone() + avg_30_tot = f"{avg_30[0]:.2f} h" if avg_30 and avg_30[0] is not None else "—" + + feed_avg_7 = self.con.execute( + """ + SELECT ROUND(AVG(total_consumed_ml), 0), ROUND(AVG(total_solid_g), 0), + ROUND(AVG(total_kcal), 0), ROUND(AVG(bottle_count), 1) + FROM (SELECT total_consumed_ml, total_solid_g, total_kcal, bottle_count + FROM v_feeding_daily WHERE subject = 'mila' ORDER BY log_date DESC LIMIT 7) + """ + ).fetchone() + + diaper_avg_7 = self.con.execute( + """ + SELECT ROUND(AVG(wet_count), 1), ROUND(AVG(total_changes), 1) + FROM (SELECT wet_count, total_changes + FROM v_diaper_daily WHERE subject = 'mila' ORDER BY log_date DESC LIMIT 7) + """ + ).fetchone() + + # 6. Past 30 Days History Table & sessions + history_rows_data = self.con.execute( + """ + WITH dates AS ( + SELECT DISTINCT log_date FROM v_sleep_daily WHERE subject = 'mila' + UNION + SELECT DISTINCT log_date FROM v_feeding_daily WHERE subject = 'mila' + UNION + SELECT DISTINCT log_date FROM v_diaper_daily WHERE subject = 'mila' + ) + SELECT + dt.log_date, + COALESCE(s.total_sleep_hours, 0.0) AS total_sleep_hours, + COALESCE(s.night_sleep_minutes, 0) AS night_sleep_minutes, + COALESCE(s.nap_count, 0) AS nap_count, + COALESCE(s.nap_sleep_minutes, 0) AS nap_sleep_minutes, + COALESCE(f.total_consumed_ml, 0) AS feed_ml, + COALESCE(f.bottle_count, 0) AS feed_bottles, + COALESCE(f.total_solid_g, 0) AS feed_solid_g, + COALESCE(f.solid_count, 0) AS feed_solid_count, + COALESCE(d.total_changes, 0) AS diaper_cnt, + COALESCE(d.dirty_count, 0) AS diaper_dirty, + COALESCE(d.wet_count, 0) AS diaper_wet, + COALESCE(f.total_kcal, 0) AS feed_kcal + FROM dates dt + LEFT JOIN v_sleep_daily s ON dt.log_date = s.log_date AND s.subject = 'mila' + LEFT JOIN v_feeding_daily f ON dt.log_date = f.log_date AND f.subject = 'mila' + LEFT JOIN v_diaper_daily d ON dt.log_date = d.log_date AND d.subject = 'mila' + ORDER BY dt.log_date DESC + LIMIT 30 + """ + ).fetchall() + + all_recent_sessions = self.con.execute( + """ + SELECT log_date, strftime(local_start, '%H:%M'), + CASE WHEN is_open THEN NULL ELSE strftime(local_end, '%H:%M') END, + sleep_type, duration_minutes, is_open, note, local_start, local_end + FROM v_sleep + WHERE subject = 'mila' AND log_date >= (CURRENT_DATE - INTERVAL 30 DAY) + ORDER BY start ASC + """ + ).fetchall() + + sessions_by_date: Dict[str, list] = {} + for row in all_recent_sessions: + d_key = str(row[0]) + if d_key not in sessions_by_date: + sessions_by_date[d_key] = [] + sessions_by_date[d_key].append({ + "start": row[1], + "end": row[2] or "läuft", + "type": row[3], + "duration_minutes": row[4], + "is_open": bool(row[5]), + "note": row[6] or "", + "local_start": str(row[7]), + "local_end": str(row[8]) if row[8] else None, + }) + + history_list = [] + for r in history_rows_data: + d_str = str(r[0]) + d_obj = datetime.date.fromisoformat(d_str) + nh, nm = divmod(r[2] or 0, 60) + d_sessions = sessions_by_date.get(d_str, []) + night_durs = [s["duration_minutes"] for s in d_sessions if s["type"] == "night" and s["duration_minutes"]] + longest_night = max(night_durs) if night_durs else int(r[2] or 0) + + wake_windows = [] + day_sessions = [s for s in d_sessions if s["type"] == "nap" and s.get("local_start") and s.get("local_end")] + for i in range(len(day_sessions) - 1): + try: + e_prev = datetime.datetime.fromisoformat(day_sessions[i]["local_end"]) + s_next = datetime.datetime.fromisoformat(day_sessions[i + 1]["local_start"]) + diff = int((s_next - e_prev).total_seconds() / 60) + if 30 <= diff <= 360: + wake_windows.append(diff) + except Exception: + pass + avg_wake = round(sum(wake_windows) / len(wake_windows)) if wake_windows else None + + history_list.append({ + "date": d_str, + "weekday": WEEKDAYS_DE[d_obj.weekday()], + "formatted_date": d_obj.strftime("%d.%m."), + "is_today": (d_str == today_str), + "total_hours": round(r[1], 2) if r[1] is not None else 0.0, + "night_minutes": int(r[2] or 0), + "night_duration_str": f"{nh} h {nm:02d} min" if nh > 0 else f"{nm} min", + "nap_minutes": int(r[4] or 0), + "nap_count": int(r[3] or 0), + "nap_str": f"{r[3]} ({r[4]} min)", + "longest_night_stretch_min": longest_night, + "avg_wake_window_min": avg_wake, + "feed_bottles_ml": int(r[5]), + "feed_bottles_count": int(r[6]), + "feed_solid_g": int(r[7]), + "feed_solid_count": int(r[8]), + "feed_total_kcal": int(r[12] or 0), + "diaper_changes": int(r[9]), + "diaper_dirty": int(r[10]), + "diaper_wet": int(r[11] or 0), + "sessions": d_sessions, + }) + + # 7. Growth Measurements & Percentiles + growth_rows = self.con.execute( + """ + SELECT id, log_date, weight_kg, height_cm, head_circ_cm, note + FROM v_growth + WHERE subject = 'mila' + ORDER BY start ASC + """ + ).fetchall() + + growth_measurements = [] + for row in growth_rows: + r_id, r_date, r_weight, r_height, r_hc, r_note = row + d_obj = datetime.date.fromisoformat(str(r_date)) + age_days = (d_obj - MILA_BIRTHDATE).days + age_months = max(0.0, age_days / 30.4375) + + pw = calculate_percentile("weight", r_weight, age_months) if r_weight is not None else None + ph = calculate_percentile("height", r_height, age_months) if r_height is not None else None + + growth_measurements.append({ + "id": r_id, + "date_str": str(r_date), + "date_pretty": d_obj.strftime("%d.%m.%Y"), + "age_str": calculate_age_str(d_obj), + "age_months": round(age_months, 1), + "weight_kg": r_weight, + "weight_pct": pw["percentile_str"] if pw else "—", + "height_cm": r_height, + "height_pct": ph["percentile_str"] if ph else "—", + "head_circ_cm": r_hc, + "note": r_note or "", + }) + + latest_weight_kg = growth_measurements[-1]["weight_kg"] if growth_measurements and growth_measurements[-1]["weight_kg"] else 7.5 + age_days_calc = (today_date - MILA_BIRTHDATE).days + age_months_calc = max(0.0, age_days_calc / 30.4375) + + age_norms = { + "age_months": round(age_months_calc, 1), + "sleep_total_hours_min": 12.0, + "sleep_total_hours_max": 15.0, + "night_sleep_hours_min": 10.0, + "night_sleep_hours_max": 11.5, + "longest_night_stretch_hours_min": 5.0, + "longest_night_stretch_hours_max": 8.5, + "nap_sleep_hours_min": 2.5, + "nap_sleep_hours_max": 3.5, + "nap_count_min": 2, + "nap_count_max": 3, + "wake_window_min_minutes": 135, + "wake_window_max_minutes": 180, + "feed_interval_min_minutes": 180, + "feed_interval_max_minutes": 240, + "milk_ml_min": 500, + "milk_ml_max": 800, + "bottle_size_ml_min": 150, + "bottle_size_ml_max": 210, + "solid_g_min": 150, + "solid_g_max": 380, + "solid_meals_target": "1–2 Breimahlzeiten (Mittags- & Abendbrei)", + "energy_kcal_target": round(latest_weight_kg * 80) if latest_weight_kg else 600, + "energy_kcal_min": 550, + "energy_kcal_max": 700, + "wet_diapers_min": 4, + "wet_diapers_max": 6, + } + + execution_time_ms = round((time.perf_counter() - t0) * 1000, 2) + git_status = self.git_sync_manager.status if self.git_sync_manager else "ok" + git_conflict = self.git_sync_manager.is_conflict if self.git_sync_manager else False + + return { + "status": "ok", + "execution_time_ms": execution_time_ms, + "git_status": git_status, + "git_conflict": git_conflict, + "metadata": { + "subject": "mila", + "today_date": today_str, + "today_pretty": today_pretty, + "age_str": age_str, + }, + "live_status": { + "is_sleeping": is_sleeping, + "active_sleep_id": active_sleep_id, + "active_sleep_duration_str": active_sleep_duration_str, + "active_sleep_start_time": active_sleep_start_time, + "active_sleep_iso": active_sleep_iso, + "wake_window_str": wake_window_str, + "wake_window_minutes": wake_window_minutes, + "last_wake_time_str": last_wake_time_str, + "last_wake_iso": last_wake_iso, + "last_feed_iso": last_feed_iso, + "last_feed_time_str": last_feed_time_str, + "last_feed_since_str": last_feed_since_str, + "last_feed_since_minutes": last_feed_since_minutes, + "last_feed_summary": last_feed_summary, + "last_diaper_iso": last_diaper_iso, + "last_diaper_time_str": last_diaper_time_str, + "last_diaper_since_str": last_diaper_since_str, + "last_diaper_since_minutes": last_diaper_since_minutes, + "last_diaper_type": last_diaper_type, + "last_stool_iso": last_stool_iso, + "last_stool_str": last_stool_str, + }, + "today": { + "total_sleep_hours_str": today_tot_hours, + "nap_count": today_nap_count, + "nap_minutes": today_nap_min, + "night_duration_str": today_night_dur_str, + "naps": today_naps, + "nights": today_nights, + "feedings": feedings_list, + "feeding_summary": { + "bottle_count": today_bottle_count, + "total_consumed_ml": today_bottle_ml, + "solid_count": today_solid_count, + "total_solid_g": today_solid_g, + "total_kcal": today_feeding_kcal, + }, + "diapers": diaper_list, + "diaper_summary": { + "total_changes": today_diaper_count, + "wet_count": today_wet_count, + "dirty_count": today_dirty_count, + }, + }, + "averages": { + "avg_7_tot": avg_7_tot, + "avg_7_night": avg_7_night, + "avg_7_naps": avg_7_naps, + "avg_30_tot": avg_30_tot, + "avg_7_feed_ml": int(feed_avg_7[0]) if feed_avg_7 and feed_avg_7[0] is not None else 0, + "avg_7_solid_g": int(feed_avg_7[1]) if feed_avg_7 and feed_avg_7[1] is not None else 0, + "avg_7_kcal": int(feed_avg_7[2]) if feed_avg_7 and feed_avg_7[2] is not None else 0, + "avg_7_bottles": float(feed_avg_7[3]) if feed_avg_7 and feed_avg_7[3] is not None else 0.0, + "avg_7_diapers_wet": float(diaper_avg_7[0]) if diaper_avg_7 and diaper_avg_7[0] is not None else 0.0, + "avg_7_diapers_total": float(diaper_avg_7[1]) if diaper_avg_7 and diaper_avg_7[1] is not None else 0.0, + }, + "history": history_list, + "growth": { + "measurements": growth_measurements, + "latest": growth_measurements[-1] if growth_measurements else None, + }, + "age_norms": age_norms, + } + + # -------------------------------------------------------------------------- + # Curated Moritz Dashboard Payload + # -------------------------------------------------------------------------- + def get_moritz_dashboard(self, as_of_date: Optional[str] = None) -> Dict[str, Any]: + t0 = time.perf_counter() + now_berlin = datetime.datetime.now(BERLIN_TZ) + today_date = datetime.date.fromisoformat(as_of_date) if as_of_date else now_berlin.date() + yesterday_date = today_date - datetime.timedelta(days=1) + today_str = today_date.strftime("%Y-%m-%d") + yesterday_str = yesterday_date.strftime("%Y-%m-%d") + + today_pretty = f"{WEEKDAYS_LONG_DE[today_date.weekday()]}, {today_date.strftime('%d.%m.%Y')}" + yesterday_pretty = f"{WEEKDAYS_LONG_DE[yesterday_date.weekday()]}, {yesterday_date.strftime('%d.%m.%Y')}" + + with self._lock: + # 1. Heute Nutrition + today_summary = self.con.execute( + """ + SELECT total_protein_g, total_carbs_g, total_sugar_g, total_fat_g, total_fiber_g, total_salt_g, total_kcal, item_count + FROM v_nutrition_daily + WHERE subject = 'moritz' AND log_date = ? + """, + [today_str], + ).fetchone() + + today_kcal = round(today_summary[6]) if today_summary and today_summary[6] is not None else 0 + today_protein = round(today_summary[0], 1) if today_summary and today_summary[0] is not None else 0.0 + today_carbs = round(today_summary[1], 1) if today_summary and today_summary[1] is not None else 0.0 + today_fat = round(today_summary[3], 1) if today_summary and today_summary[3] is not None else 0.0 + today_count = int(today_summary[7]) if today_summary and today_summary[7] is not None else 0 + + today_meals_rows = self.con.execute( + """ + SELECT id, strftime(local_time, '%H:%M') AS time_str, item, qty, unit, protein_g, carbs_g, fat_g, fiber_g, kcal, estimated + FROM v_nutrition + WHERE subject = 'moritz' AND log_date = ? + ORDER BY start ASC + """, + [today_str], + ).fetchall() + + today_meals = [] + for m in today_meals_rows: + today_meals.append({ + "id": m[0], + "time": m[1], + "item": m[2] or "", + "qty": m[3], + "unit": m[4] or "g", + "protein_g": round(m[5], 1) if m[5] is not None else 0.0, + "carbs_g": round(m[6], 1) if m[6] is not None else 0.0, + "fat_g": round(m[7], 1) if m[7] is not None else 0.0, + "fiber_g": round(m[8], 1) if m[8] is not None else 0.0, + "kcal": round(m[9]) if m[9] is not None else 0, + "estimated": bool(m[10]), + }) + + # 2. Gestern 24h Netto-Bilanz + yesterday_balance = self.con.execute( + """ + SELECT intake_kcal, expenditure_kcal, active_kcal, rmr_kcal, steps, balance_kcal, balance_status, protein_g, carbs_g, fat_g + FROM v_daily_balance + WHERE subject = 'moritz' AND log_date = ? + """, + [yesterday_str], + ).fetchone() + + if not yesterday_balance or yesterday_balance[1] is None: + g_row = self.con.execute( + "SELECT total_expenditure_kcal, active_kcal, rmr_kcal, steps, resting_hr FROM v_garmin_daily WHERE log_date = ?", + [yesterday_str], + ).fetchone() + n_row = self.con.execute( + "SELECT total_kcal, total_protein_g, total_carbs_g, total_fat_g FROM v_nutrition_daily WHERE subject = 'moritz' AND log_date = ?", + [yesterday_str], + ).fetchone() + + intake_y = round(n_row[0]) if n_row and n_row[0] is not None else 0 + exp_y = round(g_row[0]) if g_row and g_row[0] is not None else 0 + act_y = round(g_row[1]) if g_row and g_row[1] is not None else 0 + rmr_y = round(g_row[2]) if g_row and g_row[2] is not None else 0 + steps_y = int(g_row[3]) if g_row and g_row[3] is not None else 0 + if exp_y > 0: + bal_y = intake_y - exp_y + status_y = "Defizit" if bal_y < 0 else ("Überschuss" if bal_y > 0 else "Ausgeglichen") + else: + bal_y = None + status_y = "Garmin ausstehend" + prot_y = round(n_row[1], 1) if n_row and n_row[1] is not None else 0.0 + carbs_y = round(n_row[2], 1) if n_row and n_row[2] is not None else 0.0 + fat_y = round(n_row[3], 1) if n_row and n_row[3] is not None else 0.0 + rhr_y = int(g_row[4]) if g_row and g_row[4] is not None else None + else: + intake_y = round(yesterday_balance[0]) if yesterday_balance[0] is not None else 0 + exp_y = round(yesterday_balance[1]) if yesterday_balance[1] is not None else 0 + act_y = round(yesterday_balance[2]) if yesterday_balance[2] is not None else 0 + rmr_y = round(yesterday_balance[3]) if yesterday_balance[3] is not None else 0 + steps_y = int(yesterday_balance[4]) if yesterday_balance[4] is not None else 0 + bal_y = round(yesterday_balance[5]) if yesterday_balance[5] is not None else (intake_y - exp_y if exp_y > 0 else None) + status_y = yesterday_balance[6] or ("Garmin ausstehend" if not exp_y else "Ausgeglichen") + prot_y = round(yesterday_balance[7], 1) if yesterday_balance[7] is not None else 0.0 + carbs_y = round(yesterday_balance[8], 1) if yesterday_balance[8] is not None else 0.0 + fat_y = round(yesterday_balance[9], 1) if yesterday_balance[9] is not None else 0.0 + + rhr_check = self.con.execute( + "SELECT resting_hr FROM v_garmin_daily WHERE log_date = ?", [yesterday_str] + ).fetchone() + rhr_y = int(rhr_check[0]) if rhr_check and rhr_check[0] is not None else None + + yesterday_meals_rows = self.con.execute( + """ + SELECT strftime(local_time, '%H:%M') AS time_str, item, qty, unit, protein_g, carbs_g, fat_g, fiber_g, kcal + FROM v_nutrition + WHERE subject = 'moritz' AND log_date = ? + ORDER BY start ASC + """, + [yesterday_str], + ).fetchall() + + yesterday_meals = [] + for m in yesterday_meals_rows: + yesterday_meals.append({ + "time": m[0], + "item": m[1] or "", + "qty": m[2], + "unit": m[3] or "g", + "protein_g": round(m[4], 1) if m[4] is not None else 0.0, + "carbs_g": round(m[5], 1) if m[5] is not None else 0.0, + "fat_g": round(m[6], 1) if m[6] is not None else 0.0, + "fiber_g": round(m[7], 1) if m[7] is not None else 0.0, + "kcal": round(m[8]) if m[8] is not None else 0, + }) + + # 3. Garmin Sleep & Recovery + sleep_y_row = self.con.execute( + """ + SELECT total_sleep_hours, total_sleep_minutes, sleep_score, sleep_score_qualifier, + avg_overnight_hrv, hrv_status, body_battery_change, resting_heart_rate, + deep_sleep_minutes, light_sleep_minutes, rem_sleep_minutes, awake_sleep_minutes + FROM v_sleep_daily + WHERE subject = 'moritz' AND log_date = ? + """, + [yesterday_str], + ).fetchone() + + sleep_date_label = yesterday_pretty + if not sleep_y_row or sleep_y_row[1] is None or sleep_y_row[1] == 0: + latest_sleep = self.con.execute( + """ + SELECT total_sleep_hours, total_sleep_minutes, sleep_score, sleep_score_qualifier, + avg_overnight_hrv, hrv_status, body_battery_change, resting_heart_rate, + deep_sleep_minutes, light_sleep_minutes, rem_sleep_minutes, awake_sleep_minutes, log_date + FROM v_sleep_daily + WHERE subject = 'moritz' AND total_sleep_minutes > 0 + ORDER BY log_date DESC LIMIT 1 + """ + ).fetchone() + if latest_sleep: + sleep_y_row = latest_sleep[:12] + d_obj = datetime.date.fromisoformat(str(latest_sleep[12])) + sleep_date_label = f"{WEEKDAYS_LONG_DE[d_obj.weekday()]}, {d_obj.strftime('%d.%m.%Y')}" + + if sleep_y_row and sleep_y_row[1]: + sleep_dur_tot_m = int(sleep_y_row[1]) + s_dh, s_dm = divmod(sleep_dur_tot_m, 60) + sleep_dur_str = f"{s_dh}h {s_dm:02d}m" + sleep_score = sleep_y_row[2] + sleep_qualifier = sleep_y_row[3] or "" + hrv_val = round(sleep_y_row[4]) if sleep_y_row[4] is not None else None + hrv_status = sleep_y_row[5] or "" + bb_change = sleep_y_row[6] + rhr_val = sleep_y_row[7] or rhr_y + deep_m = int(sleep_y_row[8] or 0) + light_m = int(sleep_y_row[9] or 0) + rem_m = int(sleep_y_row[10] or 0) + awake_m = int(sleep_y_row[11] or 0) + tot_stages = (deep_m + light_m + rem_m + awake_m) or 1 + deep_pct = round((deep_m / tot_stages) * 100, 1) + light_pct = round((light_m / tot_stages) * 100, 1) + rem_pct = round((rem_m / tot_stages) * 100, 1) + awake_pct = round((awake_m / tot_stages) * 100, 1) + else: + sleep_dur_str = "—" + sleep_score = None + sleep_qualifier = "" + hrv_val = None + hrv_status = "" + bb_change = None + rhr_val = rhr_y + deep_m = light_m = rem_m = awake_m = 0 + deep_pct = light_pct = rem_pct = awake_pct = 0.0 + + # 4. Letzte 7 Tage + seven_days = self.con.execute( + """ + WITH dates AS ( + SELECT DISTINCT log_date FROM v_nutrition_daily WHERE subject = 'moritz' + UNION + SELECT DISTINCT log_date FROM v_garmin_daily + ) + SELECT + dt.log_date, + COALESCE(n.total_kcal, 0) AS intake_kcal, + COALESCE(g.total_expenditure_kcal, 0) AS expenditure_kcal, + COALESCE(g.active_kcal, 0) AS active_kcal, + COALESCE(g.steps, 0) AS steps, + CASE + WHEN g.total_expenditure_kcal IS NOT NULL THEN (COALESCE(n.total_kcal, 0) - g.total_expenditure_kcal) + ELSE NULL + END AS balance_kcal, + COALESCE(n.total_protein_g, 0.0) AS protein_g, + COALESCE(n.total_carbs_g, 0.0) AS carbs_g, + COALESCE(n.total_fat_g, 0.0) AS fat_g, + g.resting_hr + FROM dates dt + LEFT JOIN v_nutrition_daily n ON dt.log_date = n.log_date AND n.subject = 'moritz' + LEFT JOIN v_garmin_daily g ON dt.log_date = g.log_date + WHERE dt.log_date < ? + ORDER BY dt.log_date DESC LIMIT 7 + """, + [today_str], + ).fetchall() + + seven_days_list = [] + for r in reversed(seven_days): + d_obj = datetime.date.fromisoformat(str(r[0])) + seven_days_list.append({ + "date": str(r[0]), + "weekday": WEEKDAYS_DE[d_obj.weekday()], + "intake_kcal": round(r[1]) if r[1] is not None else 0, + "expenditure_kcal": round(r[2]) if r[2] is not None else 0, + "active_kcal": round(r[3]) if r[3] is not None else 0, + "steps": int(r[4]) if r[4] is not None else 0, + "balance_kcal": round(r[5]) if r[5] is not None else None, + "protein_g": round(r[6], 1) if r[6] is not None else 0.0, + "carbs_g": round(r[7], 1) if r[7] is not None else 0.0, + "fat_g": round(r[8], 1) if r[8] is not None else 0.0, + "resting_hr": int(r[9]) if r[9] is not None else None, + }) + + valid_intake_7 = [r["intake_kcal"] for r in seven_days_list if r["intake_kcal"] > 0] + valid_exp_7 = [r["expenditure_kcal"] for r in seven_days_list if r["expenditure_kcal"] > 0] + valid_bal_7 = [r["balance_kcal"] for r in seven_days_list if r["balance_kcal"] is not None] + valid_steps_7 = [r["steps"] for r in seven_days_list if r["steps"] > 0] + valid_prot_7 = [r["protein_g"] for r in seven_days_list if r["protein_g"] > 0] + + avg_intake_7 = round(sum(valid_intake_7) / len(valid_intake_7)) if valid_intake_7 else 0 + avg_exp_7 = round(sum(valid_exp_7) / len(valid_exp_7)) if valid_exp_7 else 0 + avg_bal_7 = round(sum(valid_bal_7) / len(valid_bal_7)) if valid_bal_7 else (avg_intake_7 - avg_exp_7) + avg_steps_7 = round(sum(valid_steps_7) / len(valid_steps_7)) if valid_steps_7 else 0 + avg_prot_7 = round(sum(valid_prot_7) / len(valid_prot_7), 1) if valid_prot_7 else 0.0 + + # 5. Letzte 30 Tage + thirty_days = self.con.execute( + """ + WITH dates AS ( + SELECT DISTINCT log_date FROM v_nutrition_daily WHERE subject = 'moritz' + UNION + SELECT DISTINCT log_date FROM v_garmin_daily + ) + SELECT + dt.log_date, + COALESCE(n.total_kcal, 0) AS intake_kcal, + COALESCE(g.total_expenditure_kcal, 0) AS expenditure_kcal, + COALESCE(g.active_kcal, 0) AS active_kcal, + COALESCE(g.rmr_kcal, 0) AS rmr_kcal, + COALESCE(g.steps, 0) AS steps, + CASE + WHEN g.total_expenditure_kcal IS NOT NULL THEN (COALESCE(n.total_kcal, 0) - g.total_expenditure_kcal) + ELSE NULL + END AS balance_kcal, + CASE + WHEN g.total_expenditure_kcal IS NULL THEN 'Garmin ausstehend' + WHEN (COALESCE(n.total_kcal, 0) - g.total_expenditure_kcal) < 0 THEN 'Defizit' + WHEN (COALESCE(n.total_kcal, 0) - g.total_expenditure_kcal) > 0 THEN 'Überschuss' + ELSE 'Ausgeglichen' + END AS balance_status, + COALESCE(n.total_protein_g, 0.0) AS protein_g, + COALESCE(n.total_carbs_g, 0.0) AS carbs_g, + COALESCE(n.total_fat_g, 0.0) AS fat_g, + g.resting_hr + FROM dates dt + LEFT JOIN v_nutrition_daily n ON dt.log_date = n.log_date AND n.subject = 'moritz' + LEFT JOIN v_garmin_daily g ON dt.log_date = g.log_date + WHERE dt.log_date <= ? + ORDER BY dt.log_date DESC LIMIT 30 + """, + [today_str], + ).fetchall() + + thirty_days_list = [] + for r in thirty_days: + d_obj = datetime.date.fromisoformat(str(r[0])) + thirty_days_list.append({ + "date": str(r[0]), + "weekday": WEEKDAYS_DE[d_obj.weekday()], + "intake_kcal": round(r[1]) if r[1] is not None else 0, + "expenditure_kcal": round(r[2]) if r[2] is not None else 0, + "active_kcal": round(r[3]) if r[3] is not None else 0, + "rmr_kcal": round(r[4]) if r[4] is not None else 0, + "steps": int(r[5]) if r[5] is not None else 0, + "balance_kcal": round(r[6]) if r[6] is not None else None, + "balance_status": r[7] or ("Defizit" if r[6] and r[6] < 0 else "Überschuss"), + "protein_g": round(r[8], 1) if r[8] is not None else 0.0, + "carbs_g": round(r[9], 1) if r[9] is not None else 0.0, + "fat_g": round(r[10], 1) if r[10] is not None else 0.0, + "resting_hr": int(r[11]) if r[11] is not None else None, + }) + + valid_exp_30 = [r["expenditure_kcal"] for r in thirty_days_list if r["expenditure_kcal"] > 0] + valid_intake_30 = [r["intake_kcal"] for r in thirty_days_list if r["intake_kcal"] > 0] + valid_bal_30 = [r["balance_kcal"] for r in thirty_days_list if r["balance_kcal"] is not None] + valid_steps_30 = [r["steps"] for r in thirty_days_list if r["steps"] > 0] + + avg_intake_30 = round(sum(valid_intake_30) / len(valid_intake_30)) if valid_intake_30 else 0 + avg_exp_30 = round(sum(valid_exp_30) / len(valid_exp_30)) if valid_exp_30 else 0 + avg_bal_30 = round(sum(valid_bal_30) / len(valid_bal_30)) if valid_bal_30 else 0 + total_bal_30 = round(sum(valid_bal_30)) if valid_bal_30 else 0 + avg_steps_30 = round(sum(valid_steps_30) / len(valid_steps_30)) if valid_steps_30 else 0 + + execution_time_ms = round((time.perf_counter() - t0) * 1000, 2) + git_status = self.git_sync_manager.status if self.git_sync_manager else "ok" + git_conflict = self.git_sync_manager.is_conflict if self.git_sync_manager else False + + return { + "status": "ok", + "execution_time_ms": execution_time_ms, + "git_status": git_status, + "git_conflict": git_conflict, + "metadata": { + "subject": "moritz", + "today_date": today_str, + "today_pretty": today_pretty, + "yesterday_date": yesterday_str, + "yesterday_pretty": yesterday_pretty, + "sleep_date_label": sleep_date_label, + }, + "today": { + "total_kcal": today_kcal, + "protein_g": today_protein, + "carbs_g": today_carbs, + "fat_g": today_fat, + "item_count": today_count, + "meals": today_meals, + }, + "yesterday": { + "intake_kcal": intake_y, + "expenditure_kcal": exp_y, + "active_kcal": act_y, + "rmr_kcal": rmr_y, + "steps": steps_y, + "balance_kcal": bal_y, + "balance_status": status_y, + "protein_g": prot_y, + "carbs_g": carbs_y, + "fat_g": fat_y, + "resting_hr": rhr_y, + "meals": yesterday_meals, + }, + "garmin_recovery": { + "sleep_dur_str": sleep_dur_str, + "sleep_score": sleep_score, + "sleep_qualifier": sleep_qualifier, + "hrv_val": hrv_val, + "hrv_status": hrv_status, + "bb_change": bb_change, + "resting_hr": rhr_val, + "deep_minutes": deep_m, + "light_minutes": light_m, + "rem_minutes": rem_m, + "awake_minutes": awake_m, + "deep_pct": deep_pct, + "light_pct": light_pct, + "rem_pct": rem_pct, + "awake_pct": awake_pct, + }, + "seven_days": { + "days": seven_days_list, + "avg_intake_kcal": avg_intake_7, + "avg_expenditure_kcal": avg_exp_7, + "avg_balance_kcal": avg_bal_7, + "avg_steps": avg_steps_7, + "avg_protein_g": avg_prot_7, + }, + "thirty_days": { + "days": thirty_days_list, + "avg_intake_kcal": avg_intake_30, + "avg_expenditure_kcal": avg_exp_30, + "avg_balance_kcal": avg_bal_30, + "total_balance_kcal": total_bal_30, + "avg_steps": avg_steps_30, + }, + } + + # -------------------------------------------------------------------------- + # Mutating Event & Entity Operations + # -------------------------------------------------------------------------- + def _get_target_db(self, kind: str) -> str: + if kind.startswith("sleep."): + return "sleep" + elif kind.startswith("diaper.") or kind.startswith("growth."): + return "mila" + else: + return "nutrition" + + def _sort_jsonl_file(self, file_path: Path, key_fn): + if not file_path.is_file(): + return + records = [] + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if line: + try: + records.append(json.loads(line)) + except Exception: + pass + records.sort(key=key_fn) + with open(file_path, "w", encoding="utf-8") as f: + for r in records: + f.write(json.dumps(r, ensure_ascii=False) + "\n") + + def add_event(self, req: EventCreateRequest) -> Dict[str, Any]: + with self._lock: + event_id = str(ULID()) + now_dt = datetime.datetime.now(datetime.timezone.utc) + now_iso = now_dt.isoformat() + + if req.since and req.start: + raise ValueError("Cannot specify both 'since' and 'start'.") + + if req.date: + req.payload["date"] = req.date + if not req.start and not req.since: + start_dt = datetime.datetime.fromisoformat(f"{req.date}T12:00:00").replace(tzinfo=BERLIN_TZ) + start_iso = start_dt.isoformat() + elif req.since: + delta = parse_duration(req.since) + start_dt = (now_dt - delta).astimezone(BERLIN_TZ) + start_iso = start_dt.isoformat() + else: + start_dt = datetime.datetime.fromisoformat(req.start) + if start_dt.tzinfo is None: + start_dt = start_dt.replace(tzinfo=BERLIN_TZ) + start_iso = start_dt.isoformat() + elif req.since: + delta = parse_duration(req.since) + start_dt = (now_dt - delta).astimezone(BERLIN_TZ) + start_iso = start_dt.isoformat() + elif not req.start: + start_dt = now_dt.astimezone(BERLIN_TZ) + start_iso = start_dt.isoformat() + else: + start_dt = datetime.datetime.fromisoformat(req.start) + if start_dt.tzinfo is None: + start_dt = start_dt.replace(tzinfo=BERLIN_TZ) + start_iso = start_dt.isoformat() + + end_iso = None + end_dt = None + if req.end: + end_dt = datetime.datetime.fromisoformat(req.end) + if end_dt.tzinfo is None: + end_dt = end_dt.replace(tzinfo=BERLIN_TZ) + if end_dt < start_dt: + raise ValueError(f"End time {req.end} cannot be earlier than start time {req.start}") + end_iso = end_dt.isoformat() + + # 15-Minute Duplicate Guard + if not req.allow_duplicate: + if req.kind in ("nutrition.intake", "feeding.bottle", "feeding.solid"): + item_val = req.payload.get("item") or req.payload.get("food_id") or "" + req_ml = req.payload.get("consumed_ml") + dup_rows = self.con.execute( + """ + SELECT id, kind, subject, start, payload FROM events + WHERE subject = ? AND kind = ? AND deleted_at IS NULL + AND abs(date_diff('minute', CAST(start AS TIMESTAMPTZ), CAST(? AS TIMESTAMPTZ))) <= 15 + """, + [req.subject, req.kind, start_iso], + ).fetchall() + for d_id, d_kind, d_subj, d_start, d_payload in dup_rows: + dp = json.loads(d_payload) if isinstance(d_payload, str) else (d_payload or {}) + d_item = dp.get("item") or dp.get("food_id") or "" + d_ml = dp.get("consumed_ml") + if (item_val and item_val == d_item) or (req_ml is not None and req_ml == d_ml): + fb = self._get_event_feedback(req.kind, req.subject, start_dt.date()) + rec = {"id": d_id, "kind": d_kind, "subject": d_subj, "start": str(d_start), "payload": dp} + return { + "status": "duplicate_skipped", + "id": d_id, + "duplicate_guard": "skipped", + "event": rec, + "record": rec, + "feedback": fb, + } + elif req.kind == "diaper.change": + dup_rows = self.con.execute( + """ + SELECT id, kind, subject, start, payload FROM events + WHERE subject = ? AND kind = 'diaper.change' AND deleted_at IS NULL + AND abs(date_diff('minute', CAST(start AS TIMESTAMPTZ), CAST(? AS TIMESTAMPTZ))) <= 10 + """, + [req.subject, start_iso], + ).fetchall() + for d_id, d_kind, d_subj, d_start, d_payload in dup_rows: + dp = json.loads(d_payload) if isinstance(d_payload, str) else (d_payload or {}) + if dp.get("pee") == req.payload.get("pee") and dp.get("poo") == req.payload.get("poo"): + fb = self._get_event_feedback(req.kind, req.subject, start_dt.date()) + rec = {"id": d_id, "kind": d_kind, "subject": d_subj, "start": str(d_start), "payload": dp} + return { + "status": "duplicate_skipped", + "id": d_id, + "duplicate_guard": "skipped", + "event": rec, + "record": rec, + "feedback": fb, + } + + target_db = self._get_target_db(req.kind) + month_str = start_dt.astimezone(BERLIN_TZ).strftime("%Y-%m") + db_dir = self.data_dir / target_db + db_dir.mkdir(parents=True, exist_ok=True) + partition_file = db_dir / f"{month_str}.jsonl" + + open_session_warning = None + if target_db == "sleep": + cal_date = start_dt.astimezone(BERLIN_TZ).strftime("%Y-%m-%d") + sleep_type = req.payload.get("type") or "nap" + location = req.payload.get("location") or "bett" + is_open = (end_iso is None) + + if is_open: + open_row = self.con.execute( + "SELECT id, startIso FROM sleep WHERE subject = ? AND (isOpen = true OR endIso IS NULL) AND deleted_at IS NULL ORDER BY startIso DESC LIMIT 1", + [req.subject], + ).fetchone() + if open_row: + if not req.allow_duplicate: + raise ValueError( + f"A sleep session is already active for subject '{req.subject}' (id={open_row[0]}, started={open_row[1]}). Stop it first before starting a new one." + ) + else: + open_session_warning = {"active_id": open_row[0], "start": str(open_row[1])} + + start_gmt = int(start_dt.timestamp() * 1000) + end_gmt = int(end_dt.timestamp() * 1000) if end_dt else None + start_local = int((start_dt.timestamp() + start_dt.utcoffset().total_seconds()) * 1000) + end_local = int((end_dt.timestamp() + end_dt.utcoffset().total_seconds()) * 1000) if end_dt else None + dur_sec = int((end_dt - start_dt).total_seconds()) if end_dt else None + nap_sec = dur_sec if (sleep_type == "nap" and dur_sec is not None) else 0 + + disk_record = { + "id": event_id, + "subject": req.subject, + "calendarDate": cal_date, + "sleepType": sleep_type, + "location": location, + "isOpen": is_open, + "startIso": start_iso, + "endIso": end_iso, + "sleepStartTimestampGMT": start_gmt, + "sleepEndTimestampGMT": end_gmt, + "sleepStartTimestampLocal": start_local, + "sleepEndTimestampLocal": end_local, + "sleepTimeSeconds": dur_sec, + "napTimeSeconds": nap_sec, + "deepSleepSeconds": None, + "lightSleepSeconds": None, + "remSleepSeconds": None, + "awakeSleepSeconds": None, + "awakeCount": None, + "avgSleepStress": None, + "avgHeartRate": None, + "averageSpO2Value": None, + "lowestSpO2Value": None, + "highestSpO2Value": None, + "averageRespirationValue": None, + "sleepScores": None, + "avgOvernightHrv": None, + "hrvStatus": None, + "bodyBatteryChange": None, + "restingHeartRate": None, + "restlessMomentsCount": None, + "note": req.note, + "actor": req.actor, + "created_at": now_iso, + "updated_at": None, + "deleted_at": None, + } + self.con.execute( + """ + INSERT INTO sleep ( + id, subject, calendarDate, sleepType, location, isOpen, + startIso, endIso, sleepStartTimestampGMT, sleepEndTimestampGMT, + sleepStartTimestampLocal, sleepEndTimestampLocal, + sleepTimeSeconds, napTimeSeconds, note, actor, created_at, updated_at, deleted_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + [ + event_id, req.subject, cal_date, sleep_type, location, is_open, + start_iso, end_iso, start_gmt, end_gmt, start_local, end_local, + dur_sec, nap_sec, req.note, req.actor, now_iso, None, None, + ], + ) + sort_key = lambda x: (x.get("calendarDate", ""), x.get("startIso", ""), x.get("id", "")) + elif target_db == "mila": + disk_record = { + "id": event_id, + "kind": req.kind, + "subject": req.subject, + "actor": req.actor, + "start": start_iso, + "end": end_iso, + "note": req.note, + "payload": req.payload, + "source_ref": req.source_ref, + "created_at": now_iso, + "updated_at": None, + "deleted_at": None, + } + self.con.execute( + """ + INSERT INTO mila (id, kind, subject, actor, start, "end", note, payload, source_ref, created_at, updated_at, deleted_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + [event_id, req.kind, req.subject, req.actor, start_iso, end_iso, req.note, json.dumps(req.payload), req.source_ref, now_iso, None, None], + ) + sort_key = lambda x: (x.get("start", ""), x.get("id", "")) + else: + disk_record = { + "id": event_id, + "kind": req.kind, + "subject": req.subject, + "actor": req.actor, + "start": start_iso, + "end": end_iso, + "estimated": req.estimated, + "meal": req.meal, + "note": req.note, + "payload": req.payload, + "source_ref": req.source_ref, + "created_at": now_iso, + "updated_at": None, + "deleted_at": None, + } + self.con.execute( + """ + INSERT INTO nutrition (id, kind, subject, actor, start, "end", estimated, meal, note, payload, source_ref, created_at, updated_at, deleted_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + [event_id, req.kind, req.subject, req.actor, start_iso, end_iso, req.estimated, req.meal, req.note, json.dumps(req.payload), req.source_ref, now_iso, None, None], + ) + sort_key = lambda x: (x.get("start", ""), x.get("id", "")) + + with open(partition_file, "a", encoding="utf-8") as f: + f.write(json.dumps(disk_record, ensure_ascii=False) + "\n") + + self._sort_jsonl_file(partition_file, key_fn=sort_key) + + if self.git_sync_manager: + self.git_sync_manager.commit_and_push(f"chore(data): log {req.kind} for {req.subject}") + + feedback = self._get_event_feedback(req.kind, req.subject, start_dt.date()) + res = { + "status": "success", + "id": event_id, + "event": disk_record, + "record": disk_record, + "feedback": feedback, + } + if open_session_warning: + res["open_session_warning"] = open_session_warning + return res + + def stop_event(self, req: EventStopRequest) -> Dict[str, Any]: + with self._lock: + target_db = self._get_target_db(req.kind) + now_dt = datetime.datetime.now(datetime.timezone.utc) + + if req.since and req.end_time: + raise ValueError("Cannot specify both 'since' and 'end_time'.") + + if req.since: + delta = parse_duration(req.since) + end_dt = (now_dt - delta).astimezone(BERLIN_TZ) + elif req.end_time: + end_dt = datetime.datetime.fromisoformat(req.end_time) + if end_dt.tzinfo is None: + end_dt = end_dt.replace(tzinfo=BERLIN_TZ) + else: + end_dt = now_dt.astimezone(BERLIN_TZ) + + if target_db == "sleep": + if req.event_id: + row = self.con.execute( + """ + SELECT id, startIso, sleepType FROM sleep + WHERE id = ? AND subject = ? AND (isOpen = true OR endIso IS NULL) AND deleted_at IS NULL + """, + [req.event_id, req.subject], + ).fetchone() + else: + row = self.con.execute( + """ + SELECT id, startIso, sleepType FROM sleep + WHERE subject = ? AND (isOpen = true OR endIso IS NULL) AND deleted_at IS NULL + ORDER BY startIso DESC LIMIT 1 + """, + [req.subject], + ).fetchone() + if not row: + raise ValueError(f"No active open sleep session found for subject '{req.subject}'.") + resolved_id, start_str, sleep_type = row[0], str(row[1]), row[2] + else: + if req.event_id: + row = self.con.execute( + f""" + SELECT id, start FROM "{target_db}" + WHERE id = ? AND kind = ? AND subject = ? AND "end" IS NULL AND deleted_at IS NULL + """, + [req.event_id, req.kind, req.subject], + ).fetchone() + else: + row = self.con.execute( + f""" + SELECT id, start FROM "{target_db}" + WHERE kind = ? AND subject = ? AND "end" IS NULL AND deleted_at IS NULL + ORDER BY start DESC LIMIT 1 + """, + [req.kind, req.subject], + ).fetchone() + if not row: + raise ValueError(f"No active open event found for kind='{req.kind}' and subject='{req.subject}'.") + resolved_id, start_str, sleep_type = row[0], str(row[1]), None + + start_dt = datetime.datetime.fromisoformat(start_str.replace("Z", "+00:00")) + if start_dt.tzinfo is None: + start_dt = start_dt.replace(tzinfo=BERLIN_TZ) + if end_dt < start_dt: + raise ValueError(f"End time {end_dt.isoformat()} cannot be earlier than start time {start_dt.isoformat()}") + + end_iso = end_dt.isoformat() + now_iso = now_dt.isoformat() + dur_sec = int((end_dt - start_dt).total_seconds()) + dur_min = dur_sec // 60 + + if target_db == "sleep": + end_gmt = int(end_dt.timestamp() * 1000) + end_local = int((end_dt.timestamp() + end_dt.utcoffset().total_seconds()) * 1000) + nap_sec = dur_sec if sleep_type == "nap" else 0 + self.con.execute( + """ + UPDATE sleep + SET endIso = ?, isOpen = false, sleepEndTimestampGMT = ?, sleepEndTimestampLocal = ?, + sleepTimeSeconds = ?, napTimeSeconds = ?, updated_at = ? + WHERE id = ? + """, + [end_iso, end_gmt, end_local, dur_sec, nap_sec, now_iso, resolved_id], + ) + self._update_jsonl_record("sleep", resolved_id, { + "endIso": end_iso, + "isOpen": False, + "sleepEndTimestampGMT": end_gmt, + "sleepEndTimestampLocal": end_local, + "sleepTimeSeconds": dur_sec, + "napTimeSeconds": nap_sec, + "updated_at": now_iso, + }) + else: + self.con.execute( + f'UPDATE "{target_db}" SET "end" = ?, updated_at = ? WHERE id = ?', + [end_iso, now_iso, resolved_id], + ) + self._update_jsonl_record(target_db, resolved_id, {"end": end_iso, "updated_at": now_iso}) + + if self.git_sync_manager: + self.git_sync_manager.commit_and_push(f"chore(data): stop {req.kind} for {req.subject}") + + feedback = self._get_event_feedback(req.kind, req.subject, end_dt.date()) + return { + "status": "success", + "id": resolved_id, + "duration_minutes": dur_min, + "end": end_iso, + "feedback": feedback, + } + + def delete_event(self, event_id: str) -> Dict[str, Any]: + with self._lock: + now_iso = datetime.datetime.now(datetime.timezone.utc).isoformat() + row = self.con.execute("SELECT kind, subject FROM events WHERE id = ?", [event_id]).fetchone() + if not row: + raise ValueError(f"Event with id '{event_id}' not found.") + + kind, subject = row[0], row[1] + target_db = self._get_target_db(kind) + + self.con.execute(f'UPDATE "{target_db}" SET deleted_at = ? WHERE id = ?', [now_iso, event_id]) + self._update_jsonl_record(target_db, event_id, {"deleted_at": now_iso}) + + if self.git_sync_manager: + self.git_sync_manager.commit_and_push(f"chore(data): delete event {event_id} ({kind})") + + return {"status": "success", "id": event_id} + + def put_entity(self, req: EntityPutRequest) -> Dict[str, Any]: + with self._lock: + if req.collection not in ["foods", "recipes", "places", "people"]: + raise ValueError(f"Unknown entity collection: {req.collection}") + + entity_id = req.record.get("id") + if not entity_id: + raise ValueError("Entity record must have an 'id' field.") + + entities_dir = self.data_dir / "entities" + entities_dir.mkdir(parents=True, exist_ok=True) + target_file = entities_dir / f"{req.collection}.jsonl" + + existing_records = [] + replaced = False + if target_file.is_file(): + with open(target_file, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if line: + try: + r = json.loads(line) + if r.get("id") == entity_id: + existing_records.append(req.record) + replaced = True + else: + existing_records.append(r) + except Exception: + pass + + if not replaced: + existing_records.append(req.record) + + existing_records.sort(key=lambda x: str(x.get("id", ""))) + + with open(target_file, "w", encoding="utf-8") as f: + for r in existing_records: + f.write(json.dumps(r, ensure_ascii=False) + "\n") + + columns = list(req.record.keys()) + placeholders = ", ".join(["?"] * len(columns)) + col_names = ", ".join([f'"{c}"' for c in columns]) + values = [ + json.dumps(req.record[c]) if isinstance(req.record[c], (dict, list)) else req.record[c] + for c in columns + ] + self.con.execute( + f'INSERT OR REPLACE INTO "{req.collection}" ({col_names}) VALUES ({placeholders})', + values, + ) + + if self.git_sync_manager: + self.git_sync_manager.commit_and_push(f"chore(data): update entity {req.collection}/{entity_id}") + + return {"status": "success", "collection": req.collection, "id": entity_id} + + def _update_jsonl_record(self, target_db: str, event_id: str, updates: Dict[str, Any]): + db_dir = self.data_dir / target_db + if not db_dir.is_dir(): + return + + for p_file in db_dir.glob("*.jsonl"): + records = [] + found = False + with open(p_file, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + r = json.loads(line) + if r.get("id") == event_id: + r.update(updates) + found = True + records.append(r) + except Exception: + pass + if found: + with open(p_file, "w", encoding="utf-8") as f: + for r in records: + f.write(json.dumps(r, ensure_ascii=False) + "\n") + return + + def _get_event_feedback(self, kind: str, subject: str, target_date: datetime.date) -> Dict[str, Any]: + """Generates compact running status feedback after an insert or stop.""" + date_str = target_date.strftime("%Y-%m-%d") + if kind.startswith("nutrition") and subject != "mila": + daily = self.con.execute( + "SELECT total_protein_g, total_carbs_g, total_sugar_g, total_fat_g, total_kcal FROM v_nutrition_daily WHERE subject = ? AND log_date = ?", + [subject, date_str], + ).fetchone() + if daily: + return { + "day_total_formatted": f"Tag bisher ({date_str}): ~{daily[0]} g Eiweiß · ~{daily[1]} g KH (davon ~{daily[2]} g Zucker) · ~{daily[3]} g Fett · ~{int(daily[4])} kcal", + "protein_g": daily[0], + "carbs_g": daily[1], + "kcal": daily[4], + } + elif kind.startswith("sleep"): + daily = self.con.execute( + "SELECT total_sleep_hours, nap_count, night_sleep_minutes FROM v_sleep_daily WHERE subject = ? AND log_date = ?", + [subject, date_str], + ).fetchone() + if daily: + return { + "day_total_formatted": f"Schlaf ({date_str}): {daily[0]} h gesamt ({daily[1]} Schläfchen, {daily[2]} min Nacht)", + "total_hours": daily[0], + "nap_count": daily[1], + } + elif kind.startswith("diaper"): + daily = self.con.execute( + "SELECT total_changes, wet_count, dirty_count FROM v_diaper_daily WHERE subject = ? AND log_date = ?", + [subject, date_str], + ).fetchone() + if daily: + return { + "day_total_formatted": f"Windeln ({date_str}): {daily[0]} gewechselt ({daily[1]} Pipi, {daily[2]} Stuhl)", + "total_changes": daily[0], + "wet_count": daily[1], + "dirty_count": daily[2], + } + elif kind.startswith("feeding") or (kind.startswith("nutrition") and subject == "mila"): + daily = self.con.execute( + "SELECT bottle_count, total_consumed_ml, solid_count, total_solid_g, total_kcal FROM v_feeding_daily WHERE subject = ? AND log_date = ?", + [subject, date_str], + ).fetchone() + if daily: + b_cnt, b_ml, s_cnt, s_g, tot_kcal = daily[0], daily[1], daily[2], daily[3], daily[4] + parts = [] + if b_cnt > 0 or b_ml > 0: + parts.append(f"{b_cnt} Fläschchen ({int(b_ml)} ml getrunken)") + if s_cnt > 0 or s_g > 0: + parts.append(f"{s_cnt}x Brei/Beikost ({int(s_g)} g)") + summary_str = " · ".join(parts) if parts else f"{b_cnt} Fläschchen ({int(b_ml)} ml getrunken)" + return { + "day_total_formatted": f"Ernährung Mila ({date_str}): {summary_str} · ~{int(tot_kcal)} kcal", + "bottle_count": b_cnt, + "total_consumed_ml": b_ml, + "solid_count": s_cnt, + "total_solid_g": s_g, + "total_kcal": tot_kcal, + } + elif kind.startswith("growth"): + row = self.con.execute( + "SELECT weight_kg, height_cm, head_circ_cm FROM v_growth WHERE subject = ? AND log_date = ? ORDER BY start DESC LIMIT 1", + [subject, date_str], + ).fetchone() + if row: + w_kg, h_cm, hc_cm = row[0], row[1], row[2] + p_row = self.con.execute("SELECT birthdate FROM people WHERE id = ?", [subject]).fetchone() + bdate = p_row[0] if p_row and p_row[0] else datetime.date(2026, 3, 14) + if isinstance(bdate, str): + bdate = datetime.date.fromisoformat(bdate) + age_days = (target_date - bdate).days + age_months = max(0.0, age_days / 30.4375) + try: + from app.who_growth import format_growth_feedback, calculate_percentile + fb_text = format_growth_feedback(w_kg, h_cm, age_months, date_str) + fb_res: Dict[str, Any] = { + "day_total_formatted": fb_text, + "age_months": round(age_months, 2), + } + if w_kg is not None: + pw = calculate_percentile("weight", w_kg, age_months) + fb_res["weight_kg"] = w_kg + fb_res["weight_percentile"] = pw["percentile"] + fb_res["weight_percentile_str"] = pw["percentile_str"] + if h_cm is not None: + ph = calculate_percentile("height", h_cm, age_months) + fb_res["height_cm"] = h_cm + fb_res["height_percentile"] = ph["percentile"] + fb_res["height_percentile_str"] = ph["percentile_str"] + return fb_res + except Exception as e: + logger.warning(f"Error computing growth feedback: {e}") + return { + "day_total_formatted": f"Wachstum ({date_str}): Gewicht {w_kg} kg, Größe {h_cm} cm", + "weight_kg": w_kg, + "height_cm": h_cm, + } + return {} + + def get_mila_day_detail(self, target_date: str) -> Dict[str, Any]: + """Returns the full day breakdown for Mila on target_date YYYY-MM-DD.""" + return self.get_mila_dashboard(as_of_date=target_date) + + def get_moritz_day_detail(self, target_date: str) -> Dict[str, Any]: + """Returns the full day breakdown for Moritz on target_date YYYY-MM-DD.""" + return self.get_moritz_dashboard(as_of_date=target_date) + + def get_summary(self, subject: str, date_str: Optional[str] = None) -> Dict[str, Any]: + """Returns daily summary for subject (nutrition, sleep, deficit, diaper, feeding, growth).""" + with self._lock: + target_date = date_str or datetime.datetime.now(BERLIN_TZ).strftime("%Y-%m-%d") + res: Dict[str, Any] = {"subject": subject, "date": target_date} + + nut = self.query(f"SELECT * FROM v_nutrition_daily WHERE subject = '{subject}' AND log_date = '{target_date}'") + if nut: + res["nutrition"] = nut[0] + else: + res["nutrition"] = { + "total_protein_g": 0.0, + "total_carbs_g": 0.0, + "total_sugar_g": 0.0, + "total_fat_g": 0.0, + "total_fiber_g": 0.0, + "total_salt_g": 0.0, + "total_kcal": 0, + "item_count": 0, + } + + slp = self.query(f"SELECT * FROM v_sleep_daily WHERE subject = '{subject}' AND log_date = '{target_date}'") + if slp: + res["sleep"] = slp[0] + + open_sleep = self.query( + f"SELECT id, start, local_start, sleep_type, location FROM v_sleep WHERE subject = '{subject}' AND is_open = true" + ) + if open_sleep: + res["open_sleep"] = open_sleep[0] + + dia = self.query(f"SELECT * FROM v_diaper_daily WHERE subject = '{subject}' AND log_date = '{target_date}'") + if dia: + res["diaper"] = dia[0] + + fee = self.query(f"SELECT * FROM v_feeding_daily WHERE subject = '{subject}' AND log_date = '{target_date}'") + if fee: + res["feeding"] = fee[0] + + grw = self.query(f"SELECT * FROM v_growth WHERE subject = '{subject}' ORDER BY start DESC LIMIT 1") + if grw: + res["growth_latest"] = grw[0] + + return res + + def find_places_near( + self, + lat: float, + lon: float, + radius_m: float = 1000.0, + category: Optional[str] = None, + ) -> List[Dict[str, Any]]: + """Radius search for places using DuckDB distance_m macro.""" + with self._lock: + cat_filter = f"AND category = '{category}'" if category else "" + sql = f""" + SELECT id, name, category, lat, lon, address, google_maps_url, tags, notes, documents, + ROUND(distance_m({lat}, {lon}, lat, lon), 1) AS distance_meters + FROM places + WHERE distance_m({lat}, {lon}, lat, lon) <= {radius_m} + {cat_filter} + ORDER BY distance_meters ASC + """ + res = self.con.execute(sql).fetchall() + col_names = [desc[0] for desc in self.con.description] + results = [] + for row in res: + rec = {} + for c, val in zip(col_names, row): + if isinstance(val, str) and (val.startswith("{") or val.startswith("[")): + try: + rec[c] = json.loads(val) + except Exception: + rec[c] = val + else: + rec[c] = val + results.append(rec) + return results + + def list_entities(self, collection: str) -> List[Dict[str, Any]]: + """Lists all entity records in the specified collection.""" + with self._lock: + if collection not in ["foods", "recipes", "places", "people"]: + raise ValueError(f"Unknown entity collection: {collection}") + res = self.con.execute(f'SELECT * FROM "{collection}"').fetchall() + col_names = [desc[0] for desc in self.con.description] + results = [] + for row in res: + rec = {} + for c, val in zip(col_names, row): + if isinstance(val, str) and (val.startswith("{") or val.startswith("[")): + try: + rec[c] = json.loads(val) + except Exception: + rec[c] = val + else: + rec[c] = val + results.append(rec) + return results + + def sync_garmin(self, req: GarminSyncRequest) -> Dict[str, Any]: + """Mirrors Garmin daily, sleep, and activity summaries to jsonl and reloads DuckDB.""" + with self._lock: + garmin_dir = self.data_dir / "garmin" + daily_dir = garmin_dir / "daily" + sleep_dir = garmin_dir / "sleep" + act_dir = garmin_dir / "activities" + unified_sleep_dir = self.data_dir / "sleep" + + daily_dir.mkdir(parents=True, exist_ok=True) + sleep_dir.mkdir(parents=True, exist_ok=True) + act_dir.mkdir(parents=True, exist_ok=True) + unified_sleep_dir.mkdir(parents=True, exist_ok=True) + + def _read_existing(file_path: Path) -> List[Dict[str, Any]]: + if not file_path.is_file(): + return [] + items = [] + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + if line.strip(): + try: + items.append(json.loads(line)) + except Exception: + pass + return items + + def _write_atomic(file_path: Path, items: List[Dict[str, Any]]): + tmp_path = file_path.with_suffix(".tmp") + with open(tmp_path, "w", encoding="utf-8") as f: + for item in items: + f.write(json.dumps(item, ensure_ascii=False) + "\n") + tmp_path.replace(file_path) + + # 1. Upsert daily summaries + for summary in req.daily: + cal_date = summary.get("calendarDate") + if not cal_date: + continue + month = cal_date[:7] + target_file = daily_dir / f"{month}.jsonl" + existing = _read_existing(target_file) + id_map = {item.get("calendarDate"): item for item in existing if item.get("calendarDate")} + id_map[cal_date] = summary + sorted_items = sorted(id_map.values(), key=lambda x: str(x.get("calendarDate", ""))) + _write_atomic(target_file, sorted_items) + + # 2. Upsert sleep data + for sleep_data in req.sleep: + dto = sleep_data.get("dailySleepDTO") if isinstance(sleep_data.get("dailySleepDTO"), dict) else {} + cal_date = dto.get("calendarDate") or sleep_data.get("calendarDate") + if not cal_date: + continue + month = cal_date[:7] + target_file = sleep_dir / f"{month}.jsonl" + existing = _read_existing(target_file) + + def _get_date(x): + d = (x.get("dailySleepDTO") or {}).get("calendarDate") if isinstance(x.get("dailySleepDTO"), dict) else None + return str(d or x.get("calendarDate") or "") + + id_map = {_get_date(item): item for item in existing if _get_date(item)} + id_map[cal_date] = sleep_data + sorted_items = sorted(id_map.values(), key=_get_date) + _write_atomic(target_file, sorted_items) + + # Unified sleep record for Moritz + start_gmt = dto.get("sleepStartTimestampGMT") + end_gmt = dto.get("sleepEndTimestampGMT") + if start_gmt: + start_dt = datetime.datetime.fromtimestamp(start_gmt / 1000, datetime.timezone.utc) + start_iso = start_dt.isoformat() + else: + start_iso = f"{cal_date}T22:30:00+02:00" + + if end_gmt: + end_dt = datetime.datetime.fromtimestamp(end_gmt / 1000, datetime.timezone.utc) + end_iso = end_dt.isoformat() + else: + end_iso = f"{cal_date}T06:30:00+02:00" + + nap_sec = dto.get("napTimeSeconds") or 0 + sleep_sec = dto.get("sleepTimeSeconds") or 0 + sleep_type = "nap" if (nap_sec > 0 and sleep_sec == 0) else "night" + + unified_rec = { + "id": str(dto.get("id") or (int(start_gmt) if start_gmt else cal_date)), + "subject": "moritz", + "calendarDate": cal_date, + "sleepType": sleep_type, + "location": "bett", + "isOpen": False, + "startIso": start_iso, + "endIso": end_iso, + "sleepStartTimestampGMT": dto.get("sleepStartTimestampGMT"), + "sleepEndTimestampGMT": dto.get("sleepEndTimestampGMT"), + "sleepStartTimestampLocal": dto.get("sleepStartTimestampLocal"), + "sleepEndTimestampLocal": dto.get("sleepEndTimestampLocal"), + "sleepTimeSeconds": dto.get("sleepTimeSeconds"), + "napTimeSeconds": nap_sec, + "deepSleepSeconds": dto.get("deepSleepSeconds"), + "lightSleepSeconds": dto.get("lightSleepSeconds"), + "remSleepSeconds": dto.get("remSleepSeconds"), + "awakeSleepSeconds": dto.get("awakeSleepSeconds"), + "awakeCount": dto.get("awakeCount"), + "avgSleepStress": dto.get("avgSleepStress"), + "avgHeartRate": dto.get("avgHeartRate"), + "averageSpO2Value": dto.get("averageSpO2Value"), + "lowestSpO2Value": dto.get("lowestSpO2Value"), + "highestSpO2Value": dto.get("highestSpO2Value"), + "averageRespirationValue": dto.get("averageRespirationValue"), + "sleepScores": dto.get("sleepScores"), + "avgOvernightHrv": sleep_data.get("avgOvernightHrv"), + "hrvStatus": sleep_data.get("hrvStatus"), + "bodyBatteryChange": sleep_data.get("bodyBatteryChange"), + "restingHeartRate": sleep_data.get("restingHeartRate"), + "restlessMomentsCount": sleep_data.get("restlessMomentsCount"), + "note": None, + "actor": "garmin_sync", + "created_at": start_iso, + "updated_at": None, + "deleted_at": None, + } + + unified_file = unified_sleep_dir / f"{month}.jsonl" + existing_u = _read_existing(unified_file) + new_u = [it for it in existing_u if not (it.get("subject") == "moritz" and it.get("calendarDate") == cal_date)] + new_u.append(unified_rec) + new_u.sort(key=lambda x: (str(x.get("calendarDate", "")), str(x.get("startIso", "")), str(x.get("id", "")))) + _write_atomic(unified_file, new_u) + + # 3. Upsert activities + if req.activities: + by_month: Dict[str, List[Dict[str, Any]]] = {} + for act in req.activities: + start_local = act.get("startTimeLocal", "") + m = start_local[:7] if len(start_local) >= 7 else datetime.date.today().strftime("%Y-%m") + by_month.setdefault(m, []).append(act) + + for month, act_list in by_month.items(): + target_file = act_dir / f"{month}.jsonl" + existing = _read_existing(target_file) + id_map = {item.get("activityId"): item for item in existing if item.get("activityId")} + for act in act_list: + aid = act.get("activityId") + if aid: + id_map[aid] = act + sorted_acts = sorted(id_map.values(), key=lambda x: str(x.get("startTimeLocal", ""))) + _write_atomic(target_file, sorted_acts) + + # Reload all DuckDB tables + self.reload_all() + + if self.git_sync_manager: + self.git_sync_manager.commit_and_push("chore(garmin): sync daily/sleep/activities data") + + return { + "status": "success", + "synced_daily": len(req.daily), + "synced_sleep": len(req.sleep), + "synced_activities": len(req.activities), + } diff --git a/projects/duckdb-backend/app/git_sync.py b/projects/duckdb-backend/app/git_sync.py new file mode 100644 index 0000000..ebf2eb1 --- /dev/null +++ b/projects/duckdb-backend/app/git_sync.py @@ -0,0 +1,326 @@ +from __future__ import annotations + +import asyncio +import datetime +import logging +import os +import subprocess +import threading +import urllib.parse +from pathlib import Path +from typing import Callable, Optional + +from app.config import ( + AUTO_GIT_SYNC, + GIT_AUTHOR_EMAIL, + GIT_AUTHOR_NAME, + GIT_BRANCH, + GIT_PASSWORD, + GIT_REPO_URL, + GIT_SYNC_INTERVAL_SECONDS, + GIT_USERNAME, + WIKI_DIR, +) + +logger = logging.getLogger("duckdb_backend.git_sync") + + +class GitSyncManager: + def __init__(self, wiki_dir: Optional[Path] = None, on_data_pulled: Optional[Callable[[], None]] = None): + self.wiki_dir = wiki_dir or WIKI_DIR + self.on_data_pulled = on_data_pulled + self._lock = threading.Lock() + self.status = "ok" + self.is_conflict = False + self.last_sync_time: Optional[str] = None + self.last_commit_hash: Optional[str] = None + self.last_error: Optional[str] = None + self._bg_task: Optional[asyncio.Task] = None + self._stop_event = asyncio.Event() + + def _configure_git_client(self): + """Configures git client with safe.directory and author identity.""" + try: + subprocess.run(["git", "config", "--global", "http.sslVerify", "false"], check=False) + subprocess.run(["git", "config", "--global", "--add", "safe.directory", "*"], check=False) + if (self.wiki_dir / ".git").is_dir(): + subprocess.run(["git", "-C", str(self.wiki_dir), "config", "user.name", GIT_AUTHOR_NAME], check=False) + subprocess.run(["git", "-C", str(self.wiki_dir), "config", "user.email", GIT_AUTHOR_EMAIL], check=False) + except Exception as e: + logger.warning(f"Failed to configure git client options: {e}") + + def get_auth_repo_url(self) -> str: + if GIT_USERNAME and GIT_PASSWORD and "://" in GIT_REPO_URL: + proto, rest = GIT_REPO_URL.split("://", 1) + # Remove existing credentials in URL if any + if "@" in rest: + rest = rest.split("@", 1)[1] + user_enc = urllib.parse.quote(GIT_USERNAME, safe="") + pass_enc = urllib.parse.quote(GIT_PASSWORD, safe="") + return f"{proto}://{user_enc}:{pass_enc}@{rest}" + return GIT_REPO_URL + + def ensure_repo(self) -> bool: + """Ensures repository exists and is initialized.""" + with self._lock: + self._configure_git_client() + if (self.wiki_dir / ".git").is_dir(): + try: + res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "rev-parse", "--short", "HEAD"], + capture_output=True, + text=True, + check=False, + ) + if res.returncode == 0: + self.last_commit_hash = res.stdout.strip() + return True + except Exception as e: + logger.warning(f"Failed to check git rev: {e}") + return True + + if not GIT_REPO_URL: + logger.info(f"Wiki directory {self.wiki_dir} is not a git repo, but no GIT_REPO_URL configured.") + return False + + logger.info(f"Initializing repository {GIT_REPO_URL} in {self.wiki_dir}...") + self.wiki_dir.mkdir(parents=True, exist_ok=True) + auth_url = self.get_auth_repo_url() + try: + # Use git init + remote + fetch + checkout to safely support non-empty directories (e.g. lost+found on PVC) + subprocess.run(["git", "-C", str(self.wiki_dir), "init"], capture_output=True, check=False) + self._configure_git_client() + subprocess.run( + ["git", "-C", str(self.wiki_dir), "remote", "add", "origin", auth_url], + capture_output=True, + check=False, + ) + subprocess.run( + ["git", "-C", str(self.wiki_dir), "remote", "set-url", "origin", auth_url], + capture_output=True, + check=False, + ) + res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "fetch", "origin", GIT_BRANCH], + capture_output=True, + text=True, + check=False, + timeout=60, + ) + if res.returncode == 0: + if (self.wiki_dir / ".git" / "shallow").exists(): + subprocess.run( + ["git", "-C", str(self.wiki_dir), "fetch", "--unshallow", "origin", GIT_BRANCH], + capture_output=True, + check=False, + ) + checkout_res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "checkout", "-f", "-B", GIT_BRANCH, f"origin/{GIT_BRANCH}"], + capture_output=True, + text=True, + check=False, + ) + if checkout_res.returncode == 0: + logger.info("Successfully initialized and checked out wiki repository.") + self.status = "ok" + self.is_conflict = False + self.last_sync_time = datetime.datetime.now(datetime.timezone.utc).isoformat() + return True + else: + self.status = "error" + self.last_error = f"Checkout failed: {checkout_res.stderr.strip()}" + logger.error(self.last_error) + return False + else: + self.status = "error" + self.last_error = f"Fetch failed: {res.stderr.strip()}" + logger.error(self.last_error) + return False + except Exception as e: + self.status = "error" + self.last_error = f"Clone exception: {e}" + logger.error(self.last_error) + return False + + def pull_rebase(self) -> bool: + """Pulls latest changes via rebase. Handles conflicts cleanly.""" + if not (self.wiki_dir / ".git").is_dir(): + return False + + with self._lock: + try: + # Update remote url with credentials if provided + auth_url = self.get_auth_repo_url() + subprocess.run( + ["git", "-C", str(self.wiki_dir), "remote", "set-url", "origin", auth_url], + capture_output=True, + check=False, + ) + + # Fetch and rebase with autostash + res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "pull", "--rebase", "--autostash", "origin", GIT_BRANCH], + capture_output=True, + text=True, + check=False, + timeout=30, + ) + if res.returncode == 0: + self.status = "ok" + self.is_conflict = False + self.last_error = None + self.last_sync_time = datetime.datetime.now(datetime.timezone.utc).isoformat() + # Update commit hash + rev = subprocess.run( + ["git", "-C", str(self.wiki_dir), "rev-parse", "--short", "HEAD"], + capture_output=True, + text=True, + check=False, + ) + if rev.returncode == 0: + self.last_commit_hash = rev.stdout.strip() + + if self.on_data_pulled: + try: + self.on_data_pulled() + except Exception as ex: + logger.error(f"Error in on_data_pulled callback: {ex}") + return True + else: + # Check if conflict occurred + stderr = res.stderr or res.stdout + logger.warning(f"Git pull --rebase failed: {stderr}") + # Abort any in-progress rebase to keep working tree stable + subprocess.run( + ["git", "-C", str(self.wiki_dir), "rebase", "--abort"], + capture_output=True, + check=False, + ) + self.is_conflict = True + self.status = "conflict" + self.last_error = f"Rebase conflict: {stderr.strip()}" + return False + except Exception as e: + self.status = "error" + self.last_error = f"Pull error: {e}" + logger.error(self.last_error) + return False + + def commit_and_push(self, commit_msg: str) -> bool: + """Stages data/, commits with descriptive message, rebases and pushes.""" + if not (self.wiki_dir / ".git").is_dir(): + return False + + with self._lock: + try: + self._configure_git_client() + data_rel = "data" + subprocess.run( + ["git", "-C", str(self.wiki_dir), "add", data_rel], + capture_output=True, + check=False, + ) + commit_res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "commit", "-m", f"{commit_msg} [skip ci]"], + capture_output=True, + text=True, + check=False, + ) + if commit_res.returncode != 0: + # Nothing to commit or already committed + logger.debug(f"Commit returncode {commit_res.returncode}: {commit_res.stdout.strip()}") + return True + + # Pull rebase with autostash before push + auth_url = self.get_auth_repo_url() + subprocess.run( + ["git", "-C", str(self.wiki_dir), "remote", "set-url", "origin", auth_url], + capture_output=True, + check=False, + ) + + rebase_res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "pull", "--rebase", "--autostash", "origin", GIT_BRANCH], + capture_output=True, + text=True, + check=False, + timeout=30, + ) + if rebase_res.returncode != 0: + stderr = rebase_res.stderr or rebase_res.stdout + logger.warning(f"Rebase failed during commit_and_push: {stderr}") + subprocess.run( + ["git", "-C", str(self.wiki_dir), "rebase", "--abort"], + capture_output=True, + check=False, + ) + self.is_conflict = True + self.status = "conflict" + self.last_error = f"Rebase conflict on push: {stderr.strip()}" + return False + + # Push to remote + push_res = subprocess.run( + ["git", "-C", str(self.wiki_dir), "push", "origin", GIT_BRANCH], + capture_output=True, + text=True, + check=False, + timeout=30, + ) + if push_res.returncode == 0: + self.status = "ok" + self.is_conflict = False + self.last_error = None + self.last_sync_time = datetime.datetime.now(datetime.timezone.utc).isoformat() + rev = subprocess.run( + ["git", "-C", str(self.wiki_dir), "rev-parse", "--short", "HEAD"], + capture_output=True, + text=True, + check=False, + ) + if rev.returncode == 0: + self.last_commit_hash = rev.stdout.strip() + return True + else: + self.status = "error" + self.last_error = f"Push error: {push_res.stderr.strip()}" + logger.error(self.last_error) + return False + except Exception as e: + self.status = "error" + self.last_error = f"Commit/push error: {e}" + logger.error(self.last_error) + return False + + async def start_periodic_sync(self): + """Starts background periodic git pull loop.""" + if not AUTO_GIT_SYNC: + logger.info("Automatic git sync is disabled by configuration.") + return + + self._stop_event.clear() + + async def _loop(): + logger.info(f"Starting periodic git sync every {GIT_SYNC_INTERVAL_SECONDS}s") + while not self._stop_event.is_set(): + try: + await asyncio.to_thread(self.pull_rebase) + except Exception as ex: + logger.error(f"Error during periodic git pull: {ex}") + try: + await asyncio.wait_for(self._stop_event.wait(), timeout=GIT_SYNC_INTERVAL_SECONDS) + except asyncio.TimeoutError: + pass + + self._bg_task = asyncio.create_task(_loop()) + + async def stop_periodic_sync(self): + """Stops background sync loop.""" + self._stop_event.set() + if self._bg_task: + self._bg_task.cancel() + try: + await self._bg_task + except asyncio.CancelledError: + pass + self._bg_task = None diff --git a/projects/duckdb-backend/app/main.py b/projects/duckdb-backend/app/main.py new file mode 100644 index 0000000..56fc9e0 --- /dev/null +++ b/projects/duckdb-backend/app/main.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +import logging +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +from app.config import DATA_DIR, WIKI_DIR +from app.engine import DuckDBEngine +from app.git_sync import GitSyncManager +from app.routes.dashboard import router as dashboard_router +from app.routes.entities import router as entities_router +from app.routes.events import router as events_router +from app.routes.query import router as query_router +from app.routes.system import router as system_router + +logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") +logger = logging.getLogger("duckdb_backend") + + +@asynccontextmanager +async def lifespan(app: FastAPI): + logger.info("Initializing DuckDB Backend...") + git_sync = GitSyncManager( + wiki_dir=WIKI_DIR, + on_data_pulled=lambda: app.state.engine.reload_all() if hasattr(app.state, "engine") else None, + ) + git_sync.ensure_repo() + app.state.git_sync = git_sync + + engine = DuckDBEngine(data_dir=DATA_DIR, git_sync_manager=git_sync) + app.state.engine = engine + + await git_sync.start_periodic_sync() + logger.info("DuckDB Backend is ready to serve queries.") + + yield + + logger.info("Shutting down DuckDB Backend...") + await git_sync.stop_periodic_sync() + + +app = FastAPI( + title="DuckDB Backend for Knowledge Wiki", + version="1.0.0", + description="HTTP-based analytical and transactional backend for personal logging data powered by DuckDB", + lifespan=lifespan, +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# API v1 prefix +v1_router = FastAPI() +app.include_router(dashboard_router, prefix="/duckdb-api/v1") +app.include_router(query_router, prefix="/duckdb-api/v1") +app.include_router(events_router, prefix="/duckdb-api/v1") +app.include_router(entities_router, prefix="/duckdb-api/v1") +app.include_router(system_router, prefix="/duckdb-api/v1") + +# Direct root health probes for Kubernetes +app.include_router(system_router) diff --git a/projects/duckdb-backend/app/models.py b/projects/duckdb-backend/app/models.py new file mode 100644 index 0000000..1c930f3 --- /dev/null +++ b/projects/duckdb-backend/app/models.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Optional +from pydantic import BaseModel, Field + +class QueryRequest(BaseModel): + query: str = Field(..., description="Read-only SQL query to execute in DuckDB") + params: Optional[List[Any]] = Field(default=None, description="Positional query parameters") + +class QueryResponse(BaseModel): + columns: List[str] + rows: List[Dict[str, Any]] + count: int + execution_time_ms: float + +class EventCreateRequest(BaseModel): + kind: str = Field(..., description="Event kind, e.g. sleep.session, nutrition.intake, diaper.change, feeding.bottle, growth.measurement") + subject: str = Field(..., description="Event subject, e.g. mila or moritz") + payload: Dict[str, Any] = Field(default_factory=dict, description="Event-specific payload") + actor: Optional[str] = Field(default="web-app", description="Actor who logged the event") + date: Optional[str] = Field(default=None, description="Explicit log date override YYYY-MM-DD") + start: Optional[str] = Field(default=None, description="ISO-8601 start timestamp") + end: Optional[str] = Field(default=None, description="ISO-8601 end timestamp (optional)") + since: Optional[str] = Field(default=None, description="Relative start duration like '15m', '1h'") + estimated: bool = Field(default=False, description="Whether intake is estimated") + meal: Optional[str] = Field(default=None, description="Meal category, e.g. fruehstueck, mittagessen, abendessen, snack") + note: Optional[str] = Field(default=None, description="Free-text note") + source_ref: Optional[str] = Field(default=None, description="Source reference") + allow_duplicate: bool = Field(default=False, description="Allow event within 15min of duplicate") + +class EventStopRequest(BaseModel): + kind: str = Field(default="sleep.session", description="Event kind to stop") + subject: str = Field(..., description="Event subject, e.g. mila") + end_time: Optional[str] = Field(default=None, description="ISO-8601 end timestamp") + since: Optional[str] = Field(default=None, description="Relative end duration like '5m'") + event_id: Optional[str] = Field(default=None, description="Specific event ID to close") + actor: Optional[str] = Field(default="web-app", description="Actor who stopped the event") + +class EntityPutRequest(BaseModel): + collection: str = Field(..., description="Target collection: foods, recipes, places, people") + record: Dict[str, Any] = Field(..., description="Entity record with 'id'") + +class GarminSyncRequest(BaseModel): + daily: List[Dict[str, Any]] = Field(default_factory=list, description="Garmin daily summary records") + sleep: List[Dict[str, Any]] = Field(default_factory=list, description="Garmin sleep records") + activities: List[Dict[str, Any]] = Field(default_factory=list, description="Garmin activity records") + +class StatusResponse(BaseModel): + status: str + git_conflict: bool + last_sync_time: Optional[str] + last_commit_hash: Optional[str] + last_error: Optional[str] + data_dir: str + table_counts: Dict[str, int] diff --git a/projects/duckdb-backend/app/routes/__init__.py b/projects/duckdb-backend/app/routes/__init__.py new file mode 100644 index 0000000..d0a5c98 --- /dev/null +++ b/projects/duckdb-backend/app/routes/__init__.py @@ -0,0 +1 @@ +# routes package diff --git a/projects/duckdb-backend/app/routes/dashboard.py b/projects/duckdb-backend/app/routes/dashboard.py new file mode 100644 index 0000000..d3e36e0 --- /dev/null +++ b/projects/duckdb-backend/app/routes/dashboard.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from typing import Any, Dict, Optional +from fastapi import APIRouter, Depends, HTTPException, Query, Request + +from app.engine import DuckDBEngine + +router = APIRouter(tags=["Dashboards"]) + + +def get_engine(request: Request) -> DuckDBEngine: + return request.app.state.engine + + +@router.get("/mila/dashboard") +async def get_mila_dashboard( + as_of: Optional[str] = Query(default=None, description="Optional target date YYYY-MM-DD"), + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.get_mila_dashboard(as_of_date=as_of) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/moritz/dashboard") +async def get_moritz_dashboard( + as_of: Optional[str] = Query(default=None, description="Optional target date YYYY-MM-DD"), + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.get_moritz_dashboard(as_of_date=as_of) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/mila/day/{date}") +async def get_mila_day_detail( + date: str, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.get_mila_day_detail(target_date=date) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/moritz/day/{date}") +async def get_moritz_day_detail( + date: str, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.get_moritz_day_detail(target_date=date) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/summary/{subject}") +async def get_summary( + subject: str, + date: Optional[str] = Query(default=None, description="Target date YYYY-MM-DD"), + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.get_summary(subject=subject, date_str=date) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/projects/duckdb-backend/app/routes/entities.py b/projects/duckdb-backend/app/routes/entities.py new file mode 100644 index 0000000..ef766a1 --- /dev/null +++ b/projects/duckdb-backend/app/routes/entities.py @@ -0,0 +1,51 @@ +from typing import Any, Dict, List, Optional +from fastapi import APIRouter, Depends, HTTPException, Query, Request + +from app.engine import DuckDBEngine +from app.models import EntityPutRequest + +router = APIRouter(tags=["Entities"]) + + +def get_engine(request: Request) -> DuckDBEngine: + return request.app.state.engine + + +@router.post("/entities") +async def put_entity( + req: EntityPutRequest, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.put_entity(req) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/entities/{collection}") +async def list_entities( + collection: str, + engine: DuckDBEngine = Depends(get_engine), +) -> List[Dict[str, Any]]: + try: + return engine.list_entities(collection=collection) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/places/near") +async def find_places_near( + lat: float = Query(..., description="Latitude"), + lon: float = Query(..., description="Longitude"), + radius_m: float = Query(default=1000.0, description="Radius in meters"), + category: Optional[str] = Query(default=None, description="Category filter"), + engine: DuckDBEngine = Depends(get_engine), +) -> List[Dict[str, Any]]: + try: + return engine.find_places_near(lat=lat, lon=lon, radius_m=radius_m, category=category) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/projects/duckdb-backend/app/routes/events.py b/projects/duckdb-backend/app/routes/events.py new file mode 100644 index 0000000..82627a2 --- /dev/null +++ b/projects/duckdb-backend/app/routes/events.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from typing import Any, Dict +from fastapi import APIRouter, Depends, HTTPException, Request + +from app.engine import DuckDBEngine +from app.models import EventCreateRequest, EventStopRequest, GarminSyncRequest + +router = APIRouter(tags=["Events"]) + + +def get_engine(request: Request) -> DuckDBEngine: + return request.app.state.engine + + +@router.post("/events") +async def add_event( + req: EventCreateRequest, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.add_event(req) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/events/stop") +async def stop_event( + req: EventStopRequest, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.stop_event(req) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.delete("/events/{event_id}") +async def delete_event( + event_id: str, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.delete_event(event_id) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/garmin/sync") +async def sync_garmin( + req: GarminSyncRequest, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + try: + return engine.sync_garmin(req) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/projects/duckdb-backend/app/routes/query.py b/projects/duckdb-backend/app/routes/query.py new file mode 100644 index 0000000..ab53c77 --- /dev/null +++ b/projects/duckdb-backend/app/routes/query.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +import time +from fastapi import APIRouter, Depends, HTTPException, Request + +from app.engine import DuckDBEngine +from app.models import QueryRequest, QueryResponse + +router = APIRouter(tags=["Generic Queries"]) + + +def get_engine(request: Request) -> DuckDBEngine: + return request.app.state.engine + + +@router.post("/query", response_model=QueryResponse) +async def execute_query( + req: QueryRequest, + engine: DuckDBEngine = Depends(get_engine), +) -> QueryResponse: + t0 = time.perf_counter() + try: + rows = engine.query(req.query, req.params) + duration_ms = round((time.perf_counter() - t0) * 1000, 2) + cols = list(rows[0].keys()) if rows else [] + return QueryResponse( + columns=cols, + rows=rows, + count=len(rows), + execution_time_ms=duration_ms, + ) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/projects/duckdb-backend/app/routes/system.py b/projects/duckdb-backend/app/routes/system.py new file mode 100644 index 0000000..efb0f21 --- /dev/null +++ b/projects/duckdb-backend/app/routes/system.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +from typing import Any, Dict +from fastapi import APIRouter, Depends, HTTPException, Request + +from app.config import DATA_DIR +from app.engine import DuckDBEngine +from app.git_sync import GitSyncManager +from app.models import StatusResponse + +router = APIRouter(tags=["System"]) + + +def get_engine(request: Request) -> DuckDBEngine: + return request.app.state.engine + + +def get_git_sync(request: Request) -> Optional[GitSyncManager]: + return getattr(request.app.state, "git_sync", None) + + +@router.get("/healthz") +async def healthz( + request: Request, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + git_sync: Optional[GitSyncManager] = get_git_sync(request) + conflict = git_sync.is_conflict if git_sync else False + status_str = "conflict" if conflict else "ok" + return { + "status": status_str, + "conflict": conflict, + "engine_ready": True, + } + + +@router.get("/status", response_model=StatusResponse) +async def status( + request: Request, + engine: DuckDBEngine = Depends(get_engine), +) -> StatusResponse: + git_sync: Optional[GitSyncManager] = get_git_sync(request) + counts = engine.get_table_counts() + return StatusResponse( + status=git_sync.status if git_sync else "ok", + git_conflict=git_sync.is_conflict if git_sync else False, + last_sync_time=git_sync.last_sync_time if git_sync else None, + last_commit_hash=git_sync.last_commit_hash if git_sync else None, + last_error=git_sync.last_error if git_sync else None, + data_dir=str(engine.data_dir), + table_counts=counts, + ) + + +@router.post("/git/sync") +async def trigger_sync( + request: Request, + engine: DuckDBEngine = Depends(get_engine), +) -> Dict[str, Any]: + git_sync: Optional[GitSyncManager] = get_git_sync(request) + if not git_sync: + raise HTTPException(status_code=400, detail="Git sync is not configured") + + success = git_sync.pull_rebase() + if success: + engine.reload_all() + return { + "status": "ok", + "message": "Git pull --rebase completed and DuckDB reloaded.", + "commit": git_sync.last_commit_hash, + } + else: + return { + "status": git_sync.status, + "conflict": git_sync.is_conflict, + "error": git_sync.last_error, + } diff --git a/projects/duckdb-backend/app/who_growth.py b/projects/duckdb-backend/app/who_growth.py new file mode 100644 index 0000000..371e6d7 --- /dev/null +++ b/projects/duckdb-backend/app/who_growth.py @@ -0,0 +1,128 @@ +from __future__ import annotations + +import math +from typing import Any, Dict, List, Optional, Tuple + +WHO_GIRLS_WEIGHT = [ + {"month": 0, "L": 0.3809, "M": 3.2322, "S": 0.14171, "p3": 2.4, "p50": 3.2, "p97": 4.2}, + {"month": 1, "L": 0.1714, "M": 4.1873, "S": 0.13724, "p3": 3.2, "p50": 4.2, "p97": 5.4}, + {"month": 2, "L": 0.0962, "M": 5.1282, "S": 0.13000, "p3": 4.0, "p50": 5.1, "p97": 6.5}, + {"month": 3, "L": 0.0402, "M": 5.8458, "S": 0.12619, "p3": 4.6, "p50": 5.8, "p97": 7.4}, + {"month": 4, "L": -0.0050, "M": 6.4237, "S": 0.12402, "p3": 5.1, "p50": 6.4, "p97": 8.1}, + {"month": 5, "L": -0.0430, "M": 6.8985, "S": 0.12274, "p3": 5.5, "p50": 6.9, "p97": 8.7}, + {"month": 6, "L": -0.0756, "M": 7.2970, "S": 0.12204, "p3": 5.8, "p50": 7.3, "p97": 9.2}, + {"month": 7, "L": -0.1039, "M": 7.6422, "S": 0.12178, "p3": 6.1, "p50": 7.6, "p97": 9.6}, + {"month": 8, "L": -0.1288, "M": 7.9487, "S": 0.12181, "p3": 6.3, "p50": 7.9, "p97": 10.0}, + {"month": 9, "L": -0.1507, "M": 8.2254, "S": 0.12199, "p3": 6.6, "p50": 8.2, "p97": 10.4}, + {"month": 10, "L": -0.1700, "M": 8.4800, "S": 0.12223, "p3": 6.8, "p50": 8.5, "p97": 10.7}, + {"month": 11, "L": -0.1872, "M": 8.7192, "S": 0.12247, "p3": 7.0, "p50": 8.7, "p97": 11.0}, + {"month": 12, "L": -0.2024, "M": 8.9481, "S": 0.12268, "p3": 7.1, "p50": 8.9, "p97": 11.3}, + {"month": 13, "L": -0.2158, "M": 9.1699, "S": 0.12283, "p3": 7.3, "p50": 9.2, "p97": 11.6}, + {"month": 14, "L": -0.2278, "M": 9.3870, "S": 0.12294, "p3": 7.5, "p50": 9.4, "p97": 11.9}, + {"month": 15, "L": -0.2384, "M": 9.6008, "S": 0.12299, "p3": 7.7, "p50": 9.6, "p97": 12.2}, + {"month": 16, "L": -0.2478, "M": 9.8124, "S": 0.12303, "p3": 7.8, "p50": 9.8, "p97": 12.5}, + {"month": 17, "L": -0.2562, "M": 10.0226, "S": 0.12306, "p3": 8.0, "p50": 10.0, "p97": 12.7}, + {"month": 18, "L": -0.2637, "M": 10.2315, "S": 0.12309, "p3": 8.2, "p50": 10.2, "p97": 13.0}, + {"month": 19, "L": -0.2703, "M": 10.4393, "S": 0.12315, "p3": 8.3, "p50": 10.4, "p97": 13.3}, + {"month": 20, "L": -0.2762, "M": 10.6464, "S": 0.12323, "p3": 8.5, "p50": 10.6, "p97": 13.5}, + {"month": 21, "L": -0.2815, "M": 10.8534, "S": 0.12335, "p3": 8.7, "p50": 10.9, "p97": 13.8}, + {"month": 22, "L": -0.2862, "M": 11.0608, "S": 0.12350, "p3": 8.8, "p50": 11.1, "p97": 14.1}, + {"month": 23, "L": -0.2903, "M": 11.2688, "S": 0.12369, "p3": 9.0, "p50": 11.3, "p97": 14.3}, + {"month": 24, "L": -0.2941, "M": 11.4775, "S": 0.12390, "p3": 9.2, "p50": 11.5, "p97": 14.6}, +] + +WHO_GIRLS_HEIGHT = [ + {"month": 0, "L": 1.0, "M": 49.1477, "S": 0.03790, "p3": 45.6, "p50": 49.1, "p97": 52.7}, + {"month": 1, "L": 1.0, "M": 53.6872, "S": 0.03640, "p3": 50.0, "p50": 53.7, "p97": 57.4}, + {"month": 2, "L": 1.0, "M": 57.0673, "S": 0.03568, "p3": 53.2, "p50": 57.1, "p97": 60.9}, + {"month": 3, "L": 1.0, "M": 59.8029, "S": 0.03520, "p3": 55.8, "p50": 59.8, "p97": 63.8}, + {"month": 4, "L": 1.0, "M": 62.0899, "S": 0.03486, "p3": 58.0, "p50": 62.1, "p97": 66.2}, + {"month": 5, "L": 1.0, "M": 64.0301, "S": 0.03463, "p3": 59.9, "p50": 64.0, "p97": 68.2}, + {"month": 6, "L": 1.0, "M": 65.7311, "S": 0.03448, "p3": 61.5, "p50": 65.7, "p97": 70.0}, + {"month": 7, "L": 1.0, "M": 67.2873, "S": 0.03441, "p3": 62.9, "p50": 67.3, "p97": 71.6}, + {"month": 8, "L": 1.0, "M": 68.7498, "S": 0.03440, "p3": 64.3, "p50": 68.7, "p97": 73.2}, + {"month": 9, "L": 1.0, "M": 70.1435, "S": 0.03444, "p3": 65.6, "p50": 70.1, "p97": 74.7}, + {"month": 10, "L": 1.0, "M": 71.4818, "S": 0.03452, "p3": 66.8, "p50": 71.5, "p97": 76.1}, + {"month": 11, "L": 1.0, "M": 72.7710, "S": 0.03464, "p3": 68.0, "p50": 72.8, "p97": 77.5}, + {"month": 12, "L": 1.0, "M": 74.0150, "S": 0.03479, "p3": 69.2, "p50": 74.0, "p97": 78.9}, + {"month": 13, "L": 1.0, "M": 75.2176, "S": 0.03496, "p3": 70.3, "p50": 75.2, "p97": 80.2}, + {"month": 14, "L": 1.0, "M": 76.3817, "S": 0.03514, "p3": 71.3, "p50": 76.4, "p97": 81.4}, + {"month": 15, "L": 1.0, "M": 77.5099, "S": 0.03534, "p3": 72.4, "p50": 77.5, "p97": 82.7}, + {"month": 16, "L": 1.0, "M": 78.6055, "S": 0.03555, "p3": 73.3, "p50": 78.6, "p97": 83.9}, + {"month": 17, "L": 1.0, "M": 79.6710, "S": 0.03576, "p3": 74.3, "p50": 79.7, "p97": 85.0}, + {"month": 18, "L": 1.0, "M": 80.7079, "S": 0.03598, "p3": 75.2, "p50": 80.7, "p97": 86.2}, + {"month": 19, "L": 1.0, "M": 81.7182, "S": 0.03620, "p3": 76.2, "p50": 81.7, "p97": 87.3}, + {"month": 20, "L": 1.0, "M": 82.7036, "S": 0.03643, "p3": 77.0, "p50": 82.7, "p97": 88.4}, + {"month": 21, "L": 1.0, "M": 83.6654, "S": 0.03666, "p3": 77.9, "p50": 83.7, "p97": 89.4}, + {"month": 22, "L": 1.0, "M": 84.6040, "S": 0.03688, "p3": 78.7, "p50": 84.6, "p97": 90.5}, + {"month": 23, "L": 1.0, "M": 85.5202, "S": 0.03711, "p3": 79.6, "p50": 85.5, "p97": 91.5}, + {"month": 24, "L": 1.0, "M": 86.4153, "S": 0.03734, "p3": 80.3, "p50": 86.4, "p97": 92.5}, +] + +def _interpolate_lms(table: List[Dict[str, float]], age_months: float) -> Tuple[float, float, float, float, float, float]: + m_clamped = max(0.0, min(float(table[-1]["month"]), float(age_months))) + m_low = int(math.floor(m_clamped)) + m_high = int(math.ceil(m_clamped)) + + r_low = table[m_low] + if m_low == m_high: + return r_low["L"], r_low["M"], r_low["S"], r_low["p3"], r_low["p50"], r_low["p97"] + + r_high = table[m_high] + frac = m_clamped - m_low + + L = r_low["L"] + frac * (r_high["L"] - r_low["L"]) + M = r_low["M"] + frac * (r_high["M"] - r_low["M"]) + S = r_low["S"] + frac * (r_high["S"] - r_low["S"]) + p3 = r_low["p3"] + frac * (r_high["p3"] - r_low["p3"]) + p50 = r_low["p50"] + frac * (r_high["p50"] - r_low["p50"]) + p97 = r_low["p97"] + frac * (r_high["p97"] - r_low["p97"]) + + return L, M, S, p3, p50, p97 + +def calculate_percentile(metric: str, value: float, age_months: float) -> Dict[str, Any]: + table = WHO_GIRLS_WEIGHT if metric == "weight" else WHO_GIRLS_HEIGHT + L, M, S, p3, p50, p97 = _interpolate_lms(table, age_months) + + if value <= 0 or M <= 0 or S <= 0: + return { + "value": value, + "age_months": round(age_months, 2), + "z_score": 0.0, + "percentile": 50.0, + "percentile_str": "P50", + "p3": round(p3, 2), + "p50": round(p50, 2), + "p97": round(p97, 2), + "in_normal_range": True, + "status": "normal", + } + + if abs(L) > 1e-6: + z = ((value / M) ** L - 1.0) / (L * S) + else: + z = math.log(value / M) / S + + p = 0.5 * (1.0 + math.erf(z / math.sqrt(2.0))) * 100.0 + p_clamped = max(0.1, min(99.9, p)) + + in_normal = 3.0 <= p_clamped <= 97.0 + if p_clamped < 3.0: + status = "unter P3" + elif p_clamped > 97.0: + status = "über P97" + else: + status = "im WHO-Normbereich" + + return { + "value": value, + "age_months": round(age_months, 2), + "z_score": round(z, 2), + "percentile": round(p_clamped, 1), + "percentile_str": f"P{int(round(p_clamped))}", + "p3": round(p3, 2), + "p50": round(p50, 2), + "p97": round(p97, 2), + "in_normal_range": in_normal, + "status": status, + } diff --git a/projects/duckdb-backend/pyproject.toml b/projects/duckdb-backend/pyproject.toml new file mode 100644 index 0000000..b5263fd --- /dev/null +++ b/projects/duckdb-backend/pyproject.toml @@ -0,0 +1,28 @@ +[project] +name = "duckdb-backend" +version = "1.0.0" +description = "FastAPI HTTP DuckDB Backend for Knowledge Wiki Personal Data" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "fastapi>=0.115.0", + "uvicorn[standard]>=0.30.0", + "duckdb>=1.1.0", + "python-ulid>=3.0.0", + "pytz>=2024.1", + "pydantic>=2.8.0", + "httpx>=0.27.0", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8.0.0", + "pytest-asyncio>=0.24.0", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["app"] diff --git a/projects/duckdb-backend/tests/conftest.py b/projects/duckdb-backend/tests/conftest.py new file mode 100644 index 0000000..5e76595 --- /dev/null +++ b/projects/duckdb-backend/tests/conftest.py @@ -0,0 +1,35 @@ +import os +import shutil +import tempfile +from pathlib import Path +import pytest +from fastapi.testclient import TestClient + +from app.config import DATA_DIR +from app.engine import DuckDBEngine +from app.git_sync import GitSyncManager +from app.main import app + + +@pytest.fixture(scope="session") +def test_data_dir(): + # Use real wiki data dir if exists, else temporary copy + if DATA_DIR.is_dir(): + yield DATA_DIR + else: + temp_dir = Path(tempfile.mkdtemp()) + yield temp_dir + shutil.rmtree(temp_dir, ignore_errors=True) + + +@pytest.fixture +def engine(test_data_dir): + return DuckDBEngine(data_dir=test_data_dir) + + +@pytest.fixture +def client(engine): + app.state.engine = engine + app.state.git_sync = GitSyncManager(wiki_dir=engine.data_dir.parent) + with TestClient(app) as c: + yield c diff --git a/projects/duckdb-backend/tests/test_api_curated.py b/projects/duckdb-backend/tests/test_api_curated.py new file mode 100644 index 0000000..bb9f38b --- /dev/null +++ b/projects/duckdb-backend/tests/test_api_curated.py @@ -0,0 +1,179 @@ +import pytest +from fastapi.testclient import TestClient + + +def test_mila_dashboard_endpoint(client: TestClient): + resp = client.get("/duckdb-api/v1/mila/dashboard") + assert resp.status_code == 200 + data = resp.json() + assert data["status"] == "ok" + assert data["metadata"]["subject"] == "mila" + assert "live_status" in data + assert "today" in data + assert "growth" in data + + +def test_moritz_dashboard_endpoint(client: TestClient): + resp = client.get("/duckdb-api/v1/moritz/dashboard") + assert resp.status_code == 200 + data = resp.json() + assert data["status"] == "ok" + assert data["metadata"]["subject"] == "moritz" + assert "today" in data + assert "yesterday" in data + assert "seven_days" in data + assert "thirty_days" in data + + +def test_healthz_and_status_endpoints(client: TestClient): + resp_h = client.get("/healthz") + assert resp_h.status_code == 200 + assert resp_h.json()["engine_ready"] is True + + resp_s = client.get("/duckdb-api/v1/status") + assert resp_s.status_code == 200 + data_s = resp_s.json() + assert "status" in data_s + assert "table_counts" in data_s + assert data_s["table_counts"]["sleep"] > 0 + + +def test_mila_history_includes_diaper_only_days(client: TestClient): + # Log a diaper change for a specific day without sleep + client.post("/duckdb-api/v1/events", json={ + "kind": "diaper.change", + "subject": "mila", + "start": "2026-10-12T12:00:00+02:00", + "payload": {"pee": True, "poo": True}, + }) + resp = client.get("/duckdb-api/v1/mila/dashboard") + assert resp.status_code == 200 + data = resp.json() + history = data["history"] + dates = [h["date"] for h in history] + assert "2026-10-12" in dates + + +def test_moritz_seven_days_includes_garmin_days(client: TestClient): + resp = client.get("/duckdb-api/v1/moritz/dashboard") + assert resp.status_code == 200 + data = resp.json() + days = data["seven_days"]["days"] + assert len(days) > 0 + # Every returned day has a valid date and steps or expenditure + for d in days: + assert d["date"] is not None + assert "expenditure_kcal" in d + + +def test_mila_dashboard_parent_cockpit_and_norms(client: TestClient): + resp = client.get("/duckdb-api/v1/mila/dashboard") + assert resp.status_code == 200 + data = resp.json() + + # Parent cockpit live fields + live = data["live_status"] + assert "is_sleeping" in live + assert "active_sleep_duration_str" in live + assert "wake_window_minutes" in live + assert "last_feed_since_str" in live + assert "last_diaper_since_str" in live + assert "last_stool_str" in live + + # Science age norms + assert "age_norms" in data + norms = data["age_norms"] + assert norms["age_months"] >= 6.0 + assert norms["wake_window_min_minutes"] == 135 + assert norms["wake_window_max_minutes"] == 180 + assert norms["feed_interval_min_minutes"] == 180 + + # Ensure IDs on items + today = data["today"] + for f in today["feedings"]: + assert "id" in f + for d in today["diapers"]: + assert "id" in d + + +def test_day_detail_and_summary_endpoints(client: TestClient): + # Test mila day detail + resp_mila = client.get("/duckdb-api/v1/mila/day/2026-10-12") + assert resp_mila.status_code == 200 + assert resp_mila.json()["metadata"]["today_date"] == "2026-10-12" + + # Test moritz day detail + resp_moritz = client.get("/duckdb-api/v1/moritz/day/2026-10-12") + assert resp_moritz.status_code == 200 + assert "today" in resp_moritz.json() + + # Test summary + resp_sum = client.get("/duckdb-api/v1/summary/mila?date=2026-10-12") + assert resp_sum.status_code == 200 + sum_data = resp_sum.json() + assert sum_data["subject"] == "mila" + assert sum_data["date"] == "2026-10-12" + assert "nutrition" in sum_data + + +def test_entities_and_places_endpoints(client: TestClient): + # Put and list entity + client.post("/duckdb-api/v1/entities", json={ + "collection": "places", + "record": { + "id": "test-biergarten", + "name": "Test Biergarten", + "category": "biergarten", + "lat": 49.02, + "lon": 12.09, + } + }) + + resp_places = client.get("/duckdb-api/v1/entities/places") + assert resp_places.status_code == 200 + places = resp_places.json() + assert any(p["id"] == "test-biergarten" for p in places) + + # Places near search + resp_near = client.get("/duckdb-api/v1/places/near?lat=49.02&lon=12.09&radius_m=500") + assert resp_near.status_code == 200 + near = resp_near.json() + assert len(near) > 0 + assert near[0]["id"] == "test-biergarten" + + +def test_garmin_sync_and_duplicate_guard(client: TestClient): + # Duplicate guard test + post_data = { + "kind": "feeding.bottle", + "subject": "mila", + "start": "2026-10-12T10:00:00+02:00", + "payload": {"consumed_ml": 180, "milk_type": "pre"}, + } + r1 = client.post("/duckdb-api/v1/events", json=post_data) + assert r1.status_code == 200 + assert r1.json()["status"] == "success" + assert "feedback" in r1.json() + + # Second post within 15min should be duplicate_skipped + r2 = client.post("/duckdb-api/v1/events", json=post_data) + assert r2.status_code == 200 + assert r2.json()["status"] == "duplicate_skipped" + + # Garmin sync test + garmin_payload = { + "daily": [{ + "calendarDate": "2026-10-15", + "totalKilocalories": 2400, + "activeKilocalories": 600, + "bmrKilocalories": 1800, + "totalSteps": 11000, + "restingHeartRate": 52, + }], + "sleep": [], + "activities": [], + } + r_sync = client.post("/duckdb-api/v1/garmin/sync", json=garmin_payload) + assert r_sync.status_code == 200 + assert r_sync.json()["status"] == "success" + assert r_sync.json()["synced_daily"] == 1 diff --git a/projects/duckdb-backend/tests/test_api_events.py b/projects/duckdb-backend/tests/test_api_events.py new file mode 100644 index 0000000..1230215 --- /dev/null +++ b/projects/duckdb-backend/tests/test_api_events.py @@ -0,0 +1,129 @@ +import tempfile +import pytest +from pathlib import Path +from fastapi.testclient import TestClient + +from app.engine import DuckDBEngine +from app.models import EventCreateRequest, EventStopRequest + + +def test_add_and_stop_sleep_event(tmp_path: Path): + # Use isolated temp directory for write tests so we do not pollute wiki git repo + engine = DuckDBEngine(data_dir=tmp_path) + + # 1. Add active sleep event (end=None) + add_req = EventCreateRequest( + kind="sleep.session", + subject="mila", + payload={"type": "nap", "location": "kinderwagen"}, + actor="test-runner", + note="Mittagsschlaf Test", + ) + res_add = engine.add_event(add_req) + assert res_add["status"] == "success" + event_id = res_add["id"] + assert event_id is not None + + # Check that it appears in open sleep + open_rows = engine.query(f"SELECT * FROM sleep WHERE id = '{event_id}' AND (isOpen = true OR endIso IS NULL)") + assert len(open_rows) == 1 + + # 2. Stop the active sleep event + stop_req = EventStopRequest( + kind="sleep.session", + subject="mila", + event_id=event_id, + actor="test-runner", + ) + res_stop = engine.stop_event(stop_req) + assert res_stop["status"] == "success" + assert res_stop["id"] == event_id + + # Check that it is now closed + closed_rows = engine.query(f"SELECT isOpen, endIso FROM sleep WHERE id = '{event_id}'") + assert len(closed_rows) == 1 + assert closed_rows[0]["isOpen"] is False + assert closed_rows[0]["endIso"] is not None + + +def test_add_nutrition_and_diaper_event(tmp_path: Path): + engine = DuckDBEngine(data_dir=tmp_path) + + # Add nutrition event + nut_req = EventCreateRequest( + kind="nutrition.intake", + subject="moritz", + payload={"item": "Apfel", "qty": 150.0, "kcal": 78.0, "protein_g": 0.5}, + meal="snack", + actor="test-runner", + ) + res_nut = engine.add_event(nut_req) + assert res_nut["status"] == "success" + nut_id = res_nut["id"] + + nut_rows = engine.query(f"SELECT * FROM nutrition WHERE id = '{nut_id}'") + assert len(nut_rows) == 1 + + # Add diaper event + diaper_req = EventCreateRequest( + kind="diaper.change", + subject="mila", + payload={"pee": True, "poo": False}, + actor="test-runner", + ) + res_diaper = engine.add_event(diaper_req) + assert res_diaper["status"] == "success" + diaper_id = res_diaper["id"] + + diaper_rows = engine.query(f"SELECT * FROM mila WHERE id = '{diaper_id}'") + assert len(diaper_rows) == 1 + + +def test_duplicate_open_sleep_rejected(tmp_path: Path): + engine = DuckDBEngine(data_dir=tmp_path) + + # 1. Start first open sleep session + req1 = EventCreateRequest( + kind="sleep.session", + subject="mila", + payload={"type": "nap", "location": "bett"}, + actor="parent", + ) + res1 = engine.add_event(req1) + assert res1["status"] == "success" + + # 2. Attempt to start second open sleep session without stopping the first + req2 = EventCreateRequest( + kind="sleep.session", + subject="mila", + payload={"type": "nap", "location": "kinderwagen"}, + actor="parent", + ) + with pytest.raises(ValueError, match="already active for subject 'mila'"): + engine.add_event(req2) + + +def test_duplicate_open_sleep_api_endpoint(client: TestClient): + # 1. Start first session via API + res1 = client.post("/duckdb-api/v1/events", json={ + "kind": "sleep.session", + "subject": "test_baby", + "payload": {"type": "nap"}, + }) + assert res1.status_code == 200 + + # 2. Start second session via API -> must return 400 Bad Request + res2 = client.post("/duckdb-api/v1/events", json={ + "kind": "sleep.session", + "subject": "test_baby", + "payload": {"type": "nap"}, + }) + assert res2.status_code == 400 + assert "already active for subject 'test_baby'" in res2.json()["detail"] + + # 3. Clean up by stopping + stop_res = client.post("/duckdb-api/v1/events/stop", json={ + "kind": "sleep.session", + "subject": "test_baby", + }) + assert stop_res.status_code == 200 diff --git a/projects/duckdb-backend/tests/test_api_query.py b/projects/duckdb-backend/tests/test_api_query.py new file mode 100644 index 0000000..276a4cd --- /dev/null +++ b/projects/duckdb-backend/tests/test_api_query.py @@ -0,0 +1,28 @@ +import pytest +from fastapi.testclient import TestClient + + +def test_generic_query_select(client: TestClient): + payload = { + "query": "SELECT count(*) AS cnt FROM v_sleep WHERE subject = 'mila'" + } + resp = client.post("/duckdb-api/v1/query", json=payload) + assert resp.status_code == 200 + data = resp.json() + assert "rows" in data + assert len(data["rows"]) == 1 + assert data["rows"][0]["cnt"] > 0 + assert data["execution_time_ms"] < 50.0 # verifies sub-50ms execution + + +def test_generic_query_disallowed_drop(client: TestClient): + payload = {"query": "DROP TABLE sleep;"} + resp = client.post("/duckdb-api/v1/query", json=payload) + assert resp.status_code == 400 + assert "not permitted" in resp.json()["detail"] + + +def test_generic_query_disallowed_insert(client: TestClient): + payload = {"query": "INSERT INTO sleep VALUES ('x', 'y')"} + resp = client.post("/duckdb-api/v1/query", json=payload) + assert resp.status_code == 400 diff --git a/projects/duckdb-backend/tests/test_engine.py b/projects/duckdb-backend/tests/test_engine.py new file mode 100644 index 0000000..811b006 --- /dev/null +++ b/projects/duckdb-backend/tests/test_engine.py @@ -0,0 +1,36 @@ +import pytest +from app.engine import DuckDBEngine + + +def test_engine_init_and_counts(engine: DuckDBEngine): + counts = engine.get_table_counts() + assert "sleep" in counts + assert "nutrition" in counts + assert "mila" in counts + assert "garmin_daily" in counts + assert counts["sleep"] > 0 + assert counts["nutrition"] > 0 + + +def test_mila_dashboard_payload(engine: DuckDBEngine): + data = engine.get_mila_dashboard() + assert data["status"] == "ok" + assert data["metadata"]["subject"] == "mila" + assert "live_status" in data + assert "today" in data + assert "averages" in data + assert "history" in data + assert "growth" in data + assert len(data["history"]) > 0 + + +def test_moritz_dashboard_payload(engine: DuckDBEngine): + data = engine.get_moritz_dashboard() + assert data["status"] == "ok" + assert data["metadata"]["subject"] == "moritz" + assert "today" in data + assert "yesterday" in data + assert "garmin_recovery" in data + assert "seven_days" in data + assert "thirty_days" in data + assert len(data["thirty_days"]["days"]) > 0 diff --git a/projects/duckdb-backend/tests/test_git_sync.py b/projects/duckdb-backend/tests/test_git_sync.py new file mode 100644 index 0000000..1103746 --- /dev/null +++ b/projects/duckdb-backend/tests/test_git_sync.py @@ -0,0 +1,68 @@ +import subprocess +from pathlib import Path +from app.git_sync import GitSyncManager + + +def test_git_sync_conflict_handling(tmp_path: Path): + repo_dir = tmp_path / "fake_repo" + repo_dir.mkdir() + subprocess.run(["git", "init", "-b", "main", str(repo_dir)], check=True) + subprocess.run(["git", "-C", str(repo_dir), "config", "user.email", "test@test.local"], check=True) + subprocess.run(["git", "-C", str(repo_dir), "config", "user.name", "Test User"], check=True) + + test_file = repo_dir / "test.txt" + test_file.write_text("initial") + subprocess.run(["git", "-C", str(repo_dir), "add", "."], check=True) + subprocess.run(["git", "-C", str(repo_dir), "commit", "-m", "initial commit"], check=True) + + mgr = GitSyncManager(wiki_dir=repo_dir) + assert mgr.ensure_repo() is True + assert mgr.status == "ok" + assert mgr.is_conflict is False + + +def test_git_url_encoding(monkeypatch): + monkeypatch.setattr("app.git_sync.GIT_USERNAME", "moritz@graf") + monkeypatch.setattr("app.git_sync.GIT_PASSWORD", "p@ss:w/ord%123") + monkeypatch.setattr("app.git_sync.GIT_REPO_URL", "https://git.moritzgraf.de/moritz/knowledge-wiki.git") + + mgr = GitSyncManager() + auth_url = mgr.get_auth_repo_url() + assert auth_url == "https://moritz%40graf:p%40ss%3Aw%2Ford%25123@git.moritzgraf.de/moritz/knowledge-wiki.git" + + +def test_ensure_repo_handles_non_empty_dir(tmp_path: Path): + # Simulate a PVC containing lost+found before repo initialization + wiki_pvc = tmp_path / "wiki_pvc" + wiki_pvc.mkdir() + (wiki_pvc / "lost+found").mkdir() + + # Create upstream origin to fetch from + origin = tmp_path / "origin.git" + subprocess.run(["git", "init", "--bare", str(origin)], check=True) + + # Push initial commit to bare origin + work = tmp_path / "work" + work.mkdir() + subprocess.run(["git", "init", "-b", "main", str(work)], check=True) + subprocess.run(["git", "-C", str(work), "config", "user.name", "Admin"], check=True) + subprocess.run(["git", "-C", str(work), "config", "user.email", "admin@test.local"], check=True) + (work / "README.md").write_text("# Knowledge Wiki") + subprocess.run(["git", "-C", str(work), "add", "."], check=True) + subprocess.run(["git", "-C", str(work), "commit", "-m", "init"], check=True) + subprocess.run(["git", "-C", str(work), "remote", "add", "origin", str(origin)], check=True) + subprocess.run(["git", "-C", str(work), "push", "origin", "main"], check=True) + + # Now verify GitSyncManager initializes cleanly into non-empty directory + mgr = GitSyncManager(wiki_dir=wiki_pvc) + # Point URL to file repo + import app.git_sync + app.git_sync.GIT_REPO_URL = str(origin) + app.git_sync.GIT_USERNAME = "" + app.git_sync.GIT_PASSWORD = "" + + success = mgr.ensure_repo() + assert success is True + assert (wiki_pvc / ".git").is_dir() + assert (wiki_pvc / "README.md").is_file() + assert (wiki_pvc / "lost+found").is_dir() diff --git a/projects/duckdb-backend/uv.lock b/projects/duckdb-backend/uv.lock new file mode 100644 index 0000000..9ef91ff --- /dev/null +++ b/projects/duckdb-backend/uv.lock @@ -0,0 +1,813 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anyio" +version = "4.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.15'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "click" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, +] + +[[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 = "duckdb" +version = "1.5.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/0b/d65ea3be00ea79aa276a8388bec588a9cbf409ce637c6d306e5316210d15/duckdb-1.5.6.tar.gz", hash = "sha256:166a91dbfacfc0c9f08cc76c0243cb6d3d4296bfab5bad72a3cfb63140a5b7c8", size = 18032957, upload-time = "2026-09-28T13:38:37.978Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/d5/d0ab77a0a1702a43171c93874f44c1f6481e30038bd3987df0d77a16a5c6/duckdb-1.5.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:48d07d0651aaeac2c3974afd37599970154b7b79b54c18f27c319c14ccf98d9d", size = 32810486, upload-time = "2026-09-28T13:37:47.254Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cd/b22201de5377faa3be6c38d5f3eaa504cb480392a448bed6a4d2239469b4/duckdb-1.5.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:79de3dfa8705b1ba0d59e7e3252e40ff399e0afd12f485502a6c7bf7c2fd809a", size = 17405278, upload-time = "2026-09-28T13:37:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6d/f9cfb1493bbdc2f095693a402e42dce1192077f9e11573f00baed6a748de/duckdb-1.5.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcccce20965e6986cd083fdf192c461685ad0b93cd1ccd0b2a8207f1185f078b", size = 15532943, upload-time = "2026-09-28T13:37:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/53/04/f65ccfaa5a833f2e570c4a140f03c8f95da416da9fe8ed08401f81f8242a/duckdb-1.5.6-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce89a1025a5317ebe9c520876c48032b5247ac574865486648b1a004f6009875", size = 19454940, upload-time = "2026-09-28T13:37:55.732Z" }, + { url = "https://files.pythonhosted.org/packages/4c/99/be75c788a492f8d77b7a1cdc1b19939ae7be0007f2028691ad371a1a33ee/duckdb-1.5.6-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc9619ed7d4ffa117b5155d84b44794366bb6635178d78ed5e13a6024845c757", size = 21568087, upload-time = "2026-09-28T13:37:58.191Z" }, + { url = "https://files.pythonhosted.org/packages/b5/95/889f8508960e47c0a7c75cc5bf57cde8512fc24f8db7b3129cca5388da42/duckdb-1.5.6-cp312-cp312-win_amd64.whl", hash = "sha256:09ff51b230219f0d8b47fc8a1e17fb595ba9fab0c3d96a6de4d00b8ff86b3cf1", size = 13190189, upload-time = "2026-09-28T13:38:00.407Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c9/baab503364a68309f8368c88e77f5341e7d94927bdf3e6d703f0e5035f3e/duckdb-1.5.6-cp312-cp312-win_arm64.whl", hash = "sha256:b8d795c8b2d5634b3269f974aa97f1fdf878f62f032317a52252a151b693fb1e", size = 14021977, upload-time = "2026-09-28T13:38:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/a476197fcba557738a588ec844747a19bc0a24b0e6f1809e308f29d68c0e/duckdb-1.5.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ae352646374cacf48e9981cf031191c494865192fc436d13667a2531fc5d1da3", size = 32810376, upload-time = "2026-09-28T13:38:05.148Z" }, + { url = "https://files.pythonhosted.org/packages/0c/6d/5466a2b53ddd557644dfa47a763f68748efccdf282e6ae7c4f1bcfb3da69/duckdb-1.5.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a1261e90785e9d29953293e44f60fa073bd1137098924e8de21a037a861b051", size = 17405385, upload-time = "2026-09-28T13:38:07.363Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a0/bf87071170835ee4a34fe764fc11c1c6e7040a0e021b36c1b6f834a4c22f/duckdb-1.5.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97dd7a555b8f5298b76bc7d48a11cb2c64336e8de9bfde783cffb86ea9f54807", size = 15533132, upload-time = "2026-09-28T13:38:09.681Z" }, + { url = "https://files.pythonhosted.org/packages/31/e0/38095c8e140ecfbe847519ac07bcba94301b8fbb76b2870015e33e07f179/duckdb-1.5.6-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:364992ba1089a2b327391cfcb68fd0bd0ce9090cf293baef861a0ba6847abfee", size = 19454994, upload-time = "2026-09-28T13:38:11.836Z" }, + { url = "https://files.pythonhosted.org/packages/70/21/61dd2876bbaa69cf77d7b5c620e52e8b25faae7096f4d2e4a812b52095d7/duckdb-1.5.6-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:644f54ce99b3b61844bc9a3fe80e0aecb1ea4084b1fffc4396d1569db6111679", size = 21568700, upload-time = "2026-09-28T13:38:14.258Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/100730e7785e85268be4d4d5bd62cfc8314e261d2f42efa208243eef35cb/duckdb-1.5.6-cp313-cp313-win_amd64.whl", hash = "sha256:ced693d33ddcee2e5345f077d342c87d2aaa80e41c514e64c9ff2d4e5963c251", size = 13190707, upload-time = "2026-09-28T13:38:16.875Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2e/bc7f44eab4e89ee5c1cb427bb1168ad021d985042e6841ec0694c3d3d501/duckdb-1.5.6-cp313-cp313-win_arm64.whl", hash = "sha256:41ecc75bb9328d72d154a705c1a653d2c5c60f686a5c0c6578aa80020753c884", size = 14020962, upload-time = "2026-09-28T13:38:19.007Z" }, + { url = "https://files.pythonhosted.org/packages/fb/62/a8a30a4c6b94c0861d348ed5633b963f6745a5525527530f02f3c1a7c931/duckdb-1.5.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:aa21d2ad803b2524326e8622d7d96b2bb1ff1d5b60368e1978ee805df9c21fb3", size = 32828003, upload-time = "2026-09-28T13:38:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/71/b7/1dcca0005eb8c67adf9fc06bf0cbb1d2bf4ea1974cc89e7a7c2ad66aac28/duckdb-1.5.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8a1b2ad27d414068cbca06c55cfa802eece10f86ea4812ff082f8ab4cb25fc85", size = 17413912, upload-time = "2026-09-28T13:38:23.915Z" }, + { url = "https://files.pythonhosted.org/packages/93/b0/e3ac175443550f3464f2d95731a8b0aae9b4dc3875c3a186c352262b43c2/duckdb-1.5.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c79c6d222b1d015cde73b5139087186b00db65357fb4e2c94c2308fbbf465a72", size = 15543122, upload-time = "2026-09-28T13:38:26.317Z" }, + { url = "https://files.pythonhosted.org/packages/9d/08/cc510a7952aba69d5cdca17f3ef61c95713d86143f2ee9aa3e097d38f50b/duckdb-1.5.6-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1052b8050ef5696e2c0d8c836949c72f3dd11f0690466acbea739613e8e2750b", size = 19457946, upload-time = "2026-09-28T13:38:28.877Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a5/6f8099d9a5a02ddff89e5c85875df3465054845b0920fb0703fbdf8dd2ec/duckdb-1.5.6-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19c5e485e59613b8878d1670bcaa7a010f53c5a4da5ae8e08863e5e529ca6182", size = 21575132, upload-time = "2026-09-28T13:38:31.231Z" }, + { url = "https://files.pythonhosted.org/packages/9f/58/762f7159662d7859e201fa05ca29f306795daeabf84f3e087215a966b001/duckdb-1.5.6-cp314-cp314-win_amd64.whl", hash = "sha256:ebcbd09cd8578ab1093393e9b16289cda0e8f1791ac595bf00eb5bad75c3cf00", size = 13713963, upload-time = "2026-09-28T13:38:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/69/64d165db322de13f5c3e75d377b6b9694df1821155ad1fa4b14b04601abc/duckdb-1.5.6-cp314-cp314-win_arm64.whl", hash = "sha256:820a8384faef11cd86068ea48c5da57ce2d8f1c7b3d2bdb9be3398317a7c3728", size = 14514368, upload-time = "2026-09-28T13:38:35.676Z" }, +] + +[[package]] +name = "duckdb-backend" +version = "1.0.0" +source = { editable = "." } +dependencies = [ + { name = "duckdb" }, + { name = "fastapi" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "python-ulid" }, + { name = "pytz" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + +[package.metadata] +requires-dist = [ + { name = "duckdb", specifier = ">=1.1.0" }, + { name = "fastapi", specifier = ">=0.115.0" }, + { name = "httpx", specifier = ">=0.27.0" }, + { name = "pydantic", specifier = ">=2.8.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, + { name = "python-ulid", specifier = ">=3.0.0" }, + { name = "pytz", specifier = ">=2024.1" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.30.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "fastapi" +version = "0.143.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "opentelemetry-api" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/d7/6a8753ab6c1d432dc53703c3e1b92974a94531b7d047c32bbaae461ea844/fastapi-0.143.0.tar.gz", hash = "sha256:1acffe48206a80917cf7dac21992b5c44b25384e8902bf745c1fd9dabcf6c51f", size = 468391, upload-time = "2026-10-08T12:29:46.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/f4/27e386913417ad32aae42bba48b0c0cce40e9ff2fba1a871ca2702c37324/fastapi-0.143.0-py3-none-any.whl", hash = "sha256:3e9395fd35276425b61b516a31fdd7c77fe2af83e41b4da22e30696fb1304c5d", size = 144665, upload-time = "2026-10-08T12:29:44.853Z" }, +] + +[[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 = "httptools" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/ec/deed52912ab7ca6c0b12859330c571c60c61d7267b341b28951fcbf13694/httptools-0.9.0.tar.gz", hash = "sha256:d484ebb7e3a3f3597b0f645fbd1b85633674ca808c1f5ba11c2caf7c66f5c8b6", size = 282523, upload-time = "2026-10-09T19:57:04.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/ed/0916b8b7ebd1deeaf22acba71b68c57b4b6b69aa1918f3812dea208b4276/httptools-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9ccc9884241efceb4547a92955d128574c864681f11b7ea3ecbde295fafbe8b", size = 119039, upload-time = "2026-10-09T19:54:32.556Z" }, + { url = "https://files.pythonhosted.org/packages/c2/0b/9b6de4a01a563a904d0826c9069c824b330e1816df26c9bdf93f60b50857/httptools-0.9.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:45b3002392948dcf578029c89f6318e1289a993a1a5ec38a4161560fab60f811", size = 115051, upload-time = "2026-10-09T19:54:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/85/3f/642113e9882f53158ecddf58003d25f18ded2c210ed23bf6eb663d4d51c3/httptools-0.9.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3e3201fe4d46e0d15d7ff9fafc94a605da9eb82d2c5b9837f0368acb325481f1", size = 552848, upload-time = "2026-10-09T19:54:35.434Z" }, + { url = "https://files.pythonhosted.org/packages/95/4c/3ecc59c99c28652d8d08d9b5be65770a14d2cadc616dad94224cee2b0e7e/httptools-0.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58a1b0ec4cbb930e69669f9771715b2c7898d3cdf064d9811f7a66afef96b544", size = 549181, upload-time = "2026-10-09T19:54:37.099Z" }, + { url = "https://files.pythonhosted.org/packages/43/ce/21f5b2759590b7054e38d3b704a3c6b853c3395c370b3d6f16c45aea0fc0/httptools-0.9.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4c58dc91aefb31adad500aa68054334f429b840b36dd29e34e834101044cb2ef", size = 569121, upload-time = "2026-10-09T19:54:38.772Z" }, + { url = "https://files.pythonhosted.org/packages/52/c3/7c523aa8d0fa7a57010a3e1bbdebc209585009076465f3d1ae6a3f54b814/httptools-0.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b900073e7b8481ef1aaf4f6c1789d210a1db01a9da8789821578cfeb4c2d540", size = 487649, upload-time = "2026-10-09T19:54:40.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/e2/d90d60002692b8afcbc06fb49ca3a4365b32abed6c40fb2b612c67721a00/httptools-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6c12d0393a903b58bc5f5a7406d6c5290acfb8284290d68547ce620c06f7d133", size = 529583, upload-time = "2026-10-09T19:54:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/46/c0/19172874cde0344a20c85877a0b2d0dcfca31111729ad8a79e8b4ac4e207/httptools-0.9.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:29b0d823e3c1e7cd1093a5dc889245db693ef13ada624cd66e2262421ef38867", size = 552414, upload-time = "2026-10-09T19:54:44.19Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b8/02ea7910f69e5371986b025fb3b410592106df54e977a5732fd1d95917b5/httptools-0.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6ebd39ee26db460cfe5ab8b71a15d1149b289139a0d3981522757d6af620887e", size = 482400, upload-time = "2026-10-09T19:54:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/de/97/f05eac916d44cbbfe43668a6a40ab93e7fd8f94d5120d1ce2d8e55c69871/httptools-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4efbee349138a3fee7a4cc3a95abd2d499fae70dd5bff9fed9138d6f570f4283", size = 536148, upload-time = "2026-10-09T19:54:47.695Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e9/9435dfcb7f1a1d6ebdc79a902164dfca70e33774c80bb60d25c630c31ef1/httptools-0.9.0-cp312-cp312-win32.whl", hash = "sha256:36fac804b8cfd6b935ae64f71349f833d2b6298404626d017a2c57bb942bc643", size = 86274, upload-time = "2026-10-09T19:54:49.1Z" }, + { url = "https://files.pythonhosted.org/packages/8b/69/813f1bf90be507d4166c437be1a413574d0e0abf36e2fec10c266661b0ee/httptools-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e32b83bd8c2f8b6fa726ef34e63e21c4d7eddc277d40d4ef7245ea3ed28e5b6", size = 92446, upload-time = "2026-10-09T19:54:50.498Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e0/1d29e328c4cafe843403341e1455e0aec18b0e6910fbb14f12b36b563f19/httptools-0.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:813a32f94991b9627795528053c73a57d2ce3eb98ede89f0e1c7a31095938e81", size = 88676, upload-time = "2026-10-09T19:54:51.844Z" }, + { url = "https://files.pythonhosted.org/packages/9c/04/223994f8589750d2a36ceb43203e739cf75bd9e12c226680d73567766908/httptools-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4fb995082fe41ec410b33c48b54fb1d44abb8a6ee762c31e8c42519e8c3a30a9", size = 117115, upload-time = "2026-10-09T19:54:53.356Z" }, + { url = "https://files.pythonhosted.org/packages/31/d8/b4407836e567a862ce79d78a628d785db99aba52e63496d68c60eed0d475/httptools-0.9.0-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:b9cd15cb7cf0d5cc41f649fd789aae12c56c3b83eff593f8e095c1d4555ad5c3", size = 113225, upload-time = "2026-10-09T19:54:54.81Z" }, + { url = "https://files.pythonhosted.org/packages/79/f6/0caa51b077492a7306bdbd9dfb907a2246985f0aed1fe2d086255921848b/httptools-0.9.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:088de1738e1af624466a01c35d652dbe6fb825be887c76d68aa850621d81db88", size = 520112, upload-time = "2026-10-09T19:54:56.3Z" }, + { url = "https://files.pythonhosted.org/packages/fa/da/7a47b7c2106bb10e6d4c04a139d045257a4f93c672fae6f0b9e92b1f7bc2/httptools-0.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b1ac7f1bc6c0dbf90684b77571a51a21b2463909fd916ce0ac9bfc4d566dc75", size = 516079, upload-time = "2026-10-09T19:54:57.938Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4d/417b42d2663acf4f5aeb2718dc894ec2be4e3dcfd8caa2d3bf9ee2dce511/httptools-0.9.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9430f65db521db7962ad951571d446171213686f96c998a54dc18ed574821e2", size = 535040, upload-time = "2026-10-09T19:54:59.769Z" }, + { url = "https://files.pythonhosted.org/packages/cb/de/8df4c09a33ddaf50f697719f20201cf93631ef4b50cec05e42acf179a7c1/httptools-0.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:52fe0176682a25b15370f23f5b0f1366a84771df89144fb0cd979cb72a94b5ca", size = 462799, upload-time = "2026-10-09T19:55:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/e8/90/1bfe91e3fca29c541d85d7ba8ed92a406d4dd13608c281baf7ec75369fec/httptools-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:757e3f79cb865a7db94e0db5f4d0ed3284a69e39d53568f433982ea13c60cac1", size = 497596, upload-time = "2026-10-09T19:55:03.201Z" }, + { url = "https://files.pythonhosted.org/packages/b0/af/2bbd5af0dd7a0e0c3b63bfefafd87a07041eb13d7cd710fbf30708b70773/httptools-0.9.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6ff5f0ed70783dcb9562dbd20edca51c3d4d277f128223709e3da6b75986d1d4", size = 517110, upload-time = "2026-10-09T19:55:05.011Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/9f165817c3e27df9098f3d50a675417d8721253f1073434f48a3f9d9a6c2/httptools-0.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0f537e5e8152e8d9cae82804024790cb973061abd3b7ef8f66f46e2b5c7bb51", size = 459198, upload-time = "2026-10-09T19:55:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/93/20/b93279e334946c359d39aaf405241c6fd60f9e60da709bc4156731a4413c/httptools-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a7f1df31829c258158be01bb04eb668c4fba7df1ddf2262131a972962e651b6", size = 502996, upload-time = "2026-10-09T19:55:08.733Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/ac3657943d40c5a9949b72565ee03151e480fb18c062c7c13c0c0276df6f/httptools-0.9.0-cp313-cp313-win32.whl", hash = "sha256:714bf348f468532d86bed670837e7d5ddff3834dd7f5d3c08066da400c86f088", size = 85878, upload-time = "2026-10-09T19:55:10.275Z" }, + { url = "https://files.pythonhosted.org/packages/74/69/d23079cd4bc16d11e49c3f51c2540c018736f26701a2a73183cae9255a1c/httptools-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:805b0f2618e5d4c3e28f45b731eb1a0539691ae4a2f97b4ce014de0bf96a1ff5", size = 91549, upload-time = "2026-10-09T19:55:11.701Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ed/5ff678a774b721f054c095f04d84fc536e7369ea4f4c9af3813a518d95b6/httptools-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:bfdabac0c6d3d6a5be8c2a100a001c92c14a39bbafd5999545a675c493626e64", size = 88043, upload-time = "2026-10-09T19:55:13.046Z" }, + { url = "https://files.pythonhosted.org/packages/31/39/0965023968452245ece67b161adbf7c5652f8d0697ac69312f9d21849411/httptools-0.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a4050a651e1f2faf05eb028ce9f2168abbcee9e24b209f5c1f2eb96d8c569e4", size = 118142, upload-time = "2026-10-09T19:55:14.491Z" }, + { url = "https://files.pythonhosted.org/packages/31/39/a6ec662d81059e505e953af709797038e83e489014df721e506f4fd0d3c5/httptools-0.9.0-cp314-cp314-macosx_11_0_x86_64.whl", hash = "sha256:130635fea6e611a6b2026120037965ddb88b3dafd11bb64e264b101a70a76630", size = 113943, upload-time = "2026-10-09T19:55:15.887Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/4ecb7251a6c55bef61b157bb93fd44678943c35702a5966e4d5ebda2d450/httptools-0.9.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:18d800aaa2d6bff7d889df810d1b19a5fde72b1f6c0ca96e8d9f28a692fe5460", size = 514397, upload-time = "2026-10-09T19:55:17.48Z" }, + { url = "https://files.pythonhosted.org/packages/31/5a/0c26c98ee06f0f39608de715e7ca868baec942171a77feace5a0ba548ca6/httptools-0.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0e45def4d9ce7073e2226535572442d9d6efb4047c7a5fd8960807e877ce70a", size = 514383, upload-time = "2026-10-09T19:55:19.221Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6c/0f85d4f1f579c49aea6e4946dd304e9f33a680382b5117970ab887885bc7/httptools-0.9.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1f6da814aeecbc6cb8872d6d3e85ed16e8ab1653f9557cea8658725ce212348a", size = 534993, upload-time = "2026-10-09T19:55:20.992Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/97a836533b7bc9e269fc6d075c2d27669ca9786bf43f229158b9b4b15021/httptools-0.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8e1e037bb57dbc549c6fe20370b763ea74bdb09413cdcf857e4f14d9e4e2fb13", size = 461494, upload-time = "2026-10-09T19:55:22.785Z" }, + { url = "https://files.pythonhosted.org/packages/67/cf/a2d5e8dc3bad9b0b966bb546170234b4614275346cccbc01f6cdb6fce3b3/httptools-0.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cd3e55223a77d6e08d5730ebacb4930ecca5d2ce7c57e7ba10833be7e52903f1", size = 495859, upload-time = "2026-10-09T19:55:24.9Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d9/7472c4ca2aa1cfe6d0f9923380784b034cb77addc88589f2e5c92fd3b4df/httptools-0.9.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:beb2c8a34cc90fb4d862b7284eafdb322030d6a8b2ee5eb6a744f84205beedc3", size = 516303, upload-time = "2026-10-09T19:55:26.84Z" }, + { url = "https://files.pythonhosted.org/packages/c1/dd/f9be002ba859714cc306fe86204b7cb12bac091be66a7e23d7bb25d259bb/httptools-0.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0cc339a807c156d840b54f8bf050ba0fc265eb81692c24bca8535b52fbd797c6", size = 458188, upload-time = "2026-10-09T19:55:28.571Z" }, + { url = "https://files.pythonhosted.org/packages/89/7a/ed8bb5344071afd12c87e57e8839fa65abc3895b92a5d065be79ecacb919/httptools-0.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ee42112d785a913dd63ec0335435a3dddbea5040c151252db815b0095cf066", size = 498356, upload-time = "2026-10-09T19:55:30.301Z" }, + { url = "https://files.pythonhosted.org/packages/04/8d/3f1390c901d4a266ad9d5b988c47c4883e322e6f6cc021c592b9a050fb19/httptools-0.9.0-cp314-cp314-win32.whl", hash = "sha256:d1e329a1866981efe0201d05a374617f6c6cf14434a501d78ab22793d1ab1fa6", size = 88479, upload-time = "2026-10-09T19:55:32.071Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/7de70a4eea3b52d31a95fe64eb5775ccdead01e4913e4741b4424e9ef180/httptools-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:edd5aa045fa3cc57143db018dd32ce7962bd5b525d05230709015d7e570100aa", size = 94809, upload-time = "2026-10-09T19:55:33.423Z" }, + { url = "https://files.pythonhosted.org/packages/e8/79/7f6c354a8f8f74381fd473f365d2db3cd976ee8d1422b8dd7455dfc52b62/httptools-0.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:6ff0145b34610e57c9fae20df4e133c8d54266447387de6fcc0bdabfe4db4569", size = 91508, upload-time = "2026-10-09T19:55:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/94/0c/f9e8148ca684b41b4b5d0ced0860530b9a9bcb7c38bf727d83dcbfea42d0/httptools-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:80eae881cfb69383303e9a4d7961a478025b89c24f38f2e69b30c516fa0d57f2", size = 123684, upload-time = "2026-10-09T19:55:36.445Z" }, + { url = "https://files.pythonhosted.org/packages/3d/54/3c1d910e8f0bc9ee0ba7867b687e3272c8ae4a7da2df2fbf1b2bce77f0f9/httptools-0.9.0-cp314-cp314t-macosx_11_0_x86_64.whl", hash = "sha256:b2ab3aad55d75d0b8df8d8a1b5920baaec9b161112cd5e95984848b4d2cd3dfe", size = 118378, upload-time = "2026-10-09T19:55:37.851Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/3b9694880da927ae69b5629b8847cfe73d14584be2aa974a92ed2675b7da/httptools-0.9.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db735a23ecb0f0450d2b24e0a05fb00a8a35c9db172919c4d3e023e7c7ee4c9b", size = 591295, upload-time = "2026-10-09T19:55:39.501Z" }, + { url = "https://files.pythonhosted.org/packages/3c/89/1ff2835b6adf5c08a477d3a199e72b71e7f26df55ceaaed7d7364d745a1d/httptools-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:995b52f7c260ac7023640221f27472303968753cb6fc6fce1ddfb0e9db59a398", size = 603709, upload-time = "2026-10-09T19:55:41.404Z" }, + { url = "https://files.pythonhosted.org/packages/24/40/4f59a0d9dca6d60002e7cb5dbf1441b558ced5a65b5b4131d57cbbd7c806/httptools-0.9.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3af4e45ff455fce5511fdf2653c1ce428ef09c56fe37a83eb4d924c2d474f31e", size = 607379, upload-time = "2026-10-09T19:55:43.119Z" }, + { url = "https://files.pythonhosted.org/packages/bf/19/381d444a3ba704cd5c67eb4617ae7a08e920a8239c688f23ba0de07a270b/httptools-0.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ce8e723b4637034b76f5382a30a6b725518c332273e8d62a6c7d46e90837c947", size = 530031, upload-time = "2026-10-09T19:55:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c5/c9ba7758bf266240f598934510af4a800edafd9c8eb1fcf15feac0427063/httptools-0.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:465bc1526debf53a3be92022a16ca0c38f891ea3b5c1587af4f52e44020f8a07", size = 575129, upload-time = "2026-10-09T19:55:46.536Z" }, + { url = "https://files.pythonhosted.org/packages/db/87/c17f3a53616a3849681f7c8e913ce966487b95038504bbb035c38f5f2fbe/httptools-0.9.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:8463b34ebde3f000627e9dbd8a545f995ad49fbf7ff9dd5abc0cd507da98a603", size = 582996, upload-time = "2026-10-09T19:55:48.545Z" }, + { url = "https://files.pythonhosted.org/packages/88/e3/cb33ba1348ddfa5853f96021f4c38674ac383b92c944492cf7638bd6bfd0/httptools-0.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f9489c1d87160c126f73b004742fe8654fa1ce37ed89e9e01330a1c10aaecde4", size = 526150, upload-time = "2026-10-09T19:55:50.261Z" }, + { url = "https://files.pythonhosted.org/packages/e9/00/af0e2f33ba5be60803a492ad377e798714d0c970e76015e313849b351ef7/httptools-0.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06bfe7fad972a417269d8a5fc53b87e4eca970354abf5e9e24336fd06d64292e", size = 571731, upload-time = "2026-10-09T19:55:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/b6/35/e67e9c9dd3da036ebfcbd273eec44bd39213f952d638858b09b9f3ecaf3f/httptools-0.9.0-cp314-cp314t-win32.whl", hash = "sha256:c42424213c28804f8d0e20f5692106cfb57bf72e1dbc4092b8481fb2f9e4c707", size = 94622, upload-time = "2026-10-09T19:55:53.982Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/af620c73de59b5f3d431ae778c7412d30bba7bf56ca8b4140107a8ac0e54/httptools-0.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:bb1533541c729ad422f870a780d8b4af924f9817d45b5f580390418cda72eaa2", size = 101934, upload-time = "2026-10-09T19:55:55.417Z" }, + { url = "https://files.pythonhosted.org/packages/90/90/fc6019b5179d13007c6c3039346ea2696cf2e94369d6ca96e57f23b01989/httptools-0.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6f9549ca354a1d6d6167c458a1f1b12147726b968f02dd64b6a5801dba91ae0f", size = 97211, upload-time = "2026-10-09T19:55:56.878Z" }, + { url = "https://files.pythonhosted.org/packages/d2/77/e226b16a2f291f2a4ce25a24a3297e98749d80b8a713b8f3b11d8a82e904/httptools-0.9.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:d3906b5c549ff2ad2473cb711e1fc65d76715c2726a402108fbf55eab6c6b49d", size = 117817, upload-time = "2026-10-09T19:55:58.295Z" }, + { url = "https://files.pythonhosted.org/packages/ff/08/050ad8985ec34064e4401e6e5aeca7238685bc218eaff20025f7c04b0723/httptools-0.9.0-cp315-cp315-macosx_11_0_x86_64.whl", hash = "sha256:cb2bb3ac0af7fdab2311b895c9eb95442b45deb14cc949b9e65545e74aa0be69", size = 113669, upload-time = "2026-10-09T19:55:59.915Z" }, + { url = "https://files.pythonhosted.org/packages/52/0f/af812488a4963ce59d97b73a00c72bba49f5eebca1a13ab6f114372b5e82/httptools-0.9.0-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:63d38e9a9a10a20fb57593742e63c6b1e78dd7f6ef5472de8e0b1e4cf4f3db26", size = 515633, upload-time = "2026-10-09T19:56:01.529Z" }, + { url = "https://files.pythonhosted.org/packages/50/6d/73c987b84e0d02fa6c4109c7ce6ea00518d0aa3005fb92b75553ffd5ddf8/httptools-0.9.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eae4e9c7a0785a1a715de0a74fb822ab40084c060f444f18f075d05e322aa7ef", size = 516049, upload-time = "2026-10-09T19:56:03.327Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f9/74cc01fba5a0ea05501eb39eddba4baa00c10e4d1caebdb78f23eaacafe5/httptools-0.9.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0adc974916efe1fbf89d0363a86dcb2c746727643e362ff398de1a4b50b6bc77", size = 534832, upload-time = "2026-10-09T19:56:05.068Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a2/a7bb90643c059e8136c2a5fdfb0d7e1a18b2c5c4f1a78f2de14b1303184d/httptools-0.9.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:050f84b7ec46a6efe0e5f521cf8729e3397c1cef4384f62ed8d5d68ca0045776", size = 466489, upload-time = "2026-10-09T19:56:06.757Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/bb3f18e05cbad9628e7f1254176c475e05ac79c72697ec7c144fc2cc877f/httptools-0.9.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:9b4da5789d7cf576c7e81f0088c632f6ee3786d87d17f08e90e703c22ce15633", size = 497146, upload-time = "2026-10-09T19:56:08.641Z" }, + { url = "https://files.pythonhosted.org/packages/25/e6/90e2433d7a947bec66a5ad22e948626a26672ff62aa3ebf949899f687a3e/httptools-0.9.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:f78f7ae1c2e5aabf29583fc0d302d8081a663776f84578025662eb6f5d63a921", size = 516153, upload-time = "2026-10-09T19:56:10.415Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c7/86373edd9d800eb723b8b68d3fce0e31d3e3211f9d7b0eaf8c3deadfada0/httptools-0.9.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:b2cc6991f16f6d666d48e4b57318104e7b29109e32e2f6b86e9d44c4e6a27f4e", size = 463141, upload-time = "2026-10-09T19:56:12.406Z" }, + { url = "https://files.pythonhosted.org/packages/65/46/8dc41d9ebf78fa56f609f251ed8ac5a9f66513b0ce712040bd7ada7b19cc/httptools-0.9.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:dbc9fd1521e573045d71b6afab7398439c5cc259e8cb9d416fe62d485c4899c6", size = 499125, upload-time = "2026-10-09T19:56:14.109Z" }, + { url = "https://files.pythonhosted.org/packages/7a/41/38db94fda8b266dcde50722a4fcef825b189380a220e02c682518bc1b430/httptools-0.9.0-cp315-cp315-win32.whl", hash = "sha256:34266cec8c1d4e3e91fcca7efe38971d6bdda64a7944f2a46ab576da15173680", size = 88370, upload-time = "2026-10-09T19:56:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cd/347f12eb16e20972dcdacbca907f2c52d72a36542199a5bf3ca342c92098/httptools-0.9.0-cp315-cp315-win_amd64.whl", hash = "sha256:b5a3f5f70967a1aa2bc47fec42a1e19d2fb38c61700e3ee62b63a4af4f4fd001", size = 94617, upload-time = "2026-10-09T19:56:17.257Z" }, + { url = "https://files.pythonhosted.org/packages/f3/08/086ba2f53989d504a05f4669b03673a04fc72554bc37d4696c3c6132be75/httptools-0.9.0-cp315-cp315-win_arm64.whl", hash = "sha256:e0acbd474d0af4afacc6e66c4273f8a19e25f8af4379fc816388095ea6b01371", size = 91358, upload-time = "2026-10-09T19:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/3e/3a/9ba59ec76d45bf8eb7ad3a18f2c6e9074fa4ce5cbbd3900fffb8d840f9e7/httptools-0.9.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:02bc5b3dcb6394b9d825fd62a7bfa0b2943063a3c89abc4492ad45e334a20eb5", size = 123063, upload-time = "2026-10-09T19:56:20.023Z" }, + { url = "https://files.pythonhosted.org/packages/18/2d/49eb389bda75a8ef0d04bf025dfb8412a3646637051c8a88bdeea700e343/httptools-0.9.0-cp315-cp315t-macosx_11_0_x86_64.whl", hash = "sha256:fc1a4f9d18d32a6e0a0a0a382986a60a2126f5144dd08715be7adb8df18e8a46", size = 117328, upload-time = "2026-10-09T19:56:21.439Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6b/2d6439378fd3d1f9c06272b35d61f4519e2d9bf9967611df069fa6c23044/httptools-0.9.0-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df3867518b205be3648e2fbd522bf380c851b5c2500588047505afdd786b6669", size = 588680, upload-time = "2026-10-09T19:56:23.056Z" }, + { url = "https://files.pythonhosted.org/packages/08/65/3fb50e861bbb6103ca58fd88b4127d346fc909eb9f06d250455033a3f698/httptools-0.9.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26e1d9629f3bf70d23f0d22238152aec51c837a7c9e384cb74f356fdccad7eb3", size = 600031, upload-time = "2026-10-09T19:56:25.216Z" }, + { url = "https://files.pythonhosted.org/packages/90/9b/40d33d4098fde007845804b1c923ddf5a27fd48aca1c8080bdbdac6c16fa/httptools-0.9.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:050f7ab098121873c8f13e35857f97ab60a76185c8302bde9a384939bb7c3b96", size = 604407, upload-time = "2026-10-09T19:56:27.04Z" }, + { url = "https://files.pythonhosted.org/packages/17/37/472afc9000aca3c7dd61a9b8ac6f3e2765900e3614f8d7f13e772c9c5438/httptools-0.9.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8d90d10e9b6594c28f27896a68fab97fd784c43804e9fe419dab8e8dcfcf4b02", size = 529459, upload-time = "2026-10-09T19:56:28.944Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/9956910fb1d181578249cd2cc966c0c46ad3c558b43ac2b79af50f94589f/httptools-0.9.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b928ab0ecaa664e8caecc529dcb8bc881b6b35bb2b74bf9a39ae25f982ee8812", size = 570845, upload-time = "2026-10-09T19:56:30.602Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/d1c160a3cc2c18e41a6f763c3aad979530dfb295039449312b8814e19753/httptools-0.9.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:2319858018eedd0c0b2f950a620413c0a9d1352607be4267eb28209eca8b1e3f", size = 579194, upload-time = "2026-10-09T19:56:32.353Z" }, + { url = "https://files.pythonhosted.org/packages/90/3c/3f7cc49925928a8c82f4141d504b8b8c2901c4b35cb88800211828312561/httptools-0.9.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:931f45f84e15daafec5f82cc92e6710569e1f50933f3253d206eab4132bec678", size = 524950, upload-time = "2026-10-09T19:56:34.103Z" }, + { url = "https://files.pythonhosted.org/packages/19/98/8e2154e99b8e8818fad3e6c5dd7cf21c050f6314b1bd8072e8dc29f49eb5/httptools-0.9.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f67db0ba2bedafec15b8e5330d40da1e1c7921559fa715af021252bfef81a6f8", size = 568603, upload-time = "2026-10-09T19:56:35.876Z" }, + { url = "https://files.pythonhosted.org/packages/79/a3/86fe9fef3a1bfab5db62262f8880c294cbf8a8d94cffe2a2aa8b4aeed40c/httptools-0.9.0-cp315-cp315t-win32.whl", hash = "sha256:2095207b75a83c9e947346da9c127fb7e4fb29f41589df2643764f06b750989c", size = 94042, upload-time = "2026-10-09T19:56:37.441Z" }, + { url = "https://files.pythonhosted.org/packages/54/4d/f2d88782251467325a62ec4ad704249bb1b09c21aacb997181a9f4421f30/httptools-0.9.0-cp315-cp315t-win_amd64.whl", hash = "sha256:bca180cbe84e4fba7807eb408a8655295f697928512324517e30a091ede522a8", size = 100837, upload-time = "2026-10-09T19:56:38.831Z" }, + { url = "https://files.pythonhosted.org/packages/00/4b/5e96c4e0d171f959a0064971c3fced9cea5a19e5fab7a8e7d57aceb80506/httptools-0.9.0-cp315-cp315t-win_arm64.whl", hash = "sha256:4a4d8c2c7e73ba5967be74d7c3a5ff81fde815ee1b48d9c5c0f14de8463a847b", size = 95947, upload-time = "2026-10-09T19:56:40.562Z" }, +] + +[[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 = "idna" +version = "3.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz", hash = "sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960", size = 21209, upload-time = "2026-10-06T22:48:38.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl", hash = "sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7", size = 7552, upload-time = "2026-10-06T22:48:36.959Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.45.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/02/6e0ae9cc61bd3169d401077b507b3ebc344745171e1051ab430be012dcd9/opentelemetry_api-1.45.1.tar.gz", hash = "sha256:aa38ed19bcc084ba42782a73255b3582283eced7ad6dddbd6695189e69adfb75", size = 72804, upload-time = "2026-10-06T17:32:58.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/41/f7dcf80b81ee8e71c1a2b59f14208bc723edbd89ed027a73b175abf6348e/opentelemetry_api-1.45.1-py3-none-any.whl", hash = "sha256:b31553efa588ae44bc306f863c785c5333a9ecc091248c6ee68b4b6c87fdedfb", size = 60256, upload-time = "2026-10-06T17:32:33.506Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pydantic" +version = "2.14.1" +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/7c/0b/8e10b2e693af8ec54346a14caf36221334775975a747c9ceaa3f8371d96d/pydantic-2.14.1.tar.gz", hash = "sha256:94f478203dd03404682a1ada216965651dd74b1d2d5ffd62e00e0837caab5c26", size = 900362, upload-time = "2026-10-11T18:37:55.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/ea/a56b9fe5066f3537b7882f77e9c5dfb26d8c2eefdaed9b5fc73d57b4dc22/pydantic-2.14.1-py3-none-any.whl", hash = "sha256:9195d967ec791692a04438115466764fb8b9a27b31f14a760437694f40d6b454", size = 488106, upload-time = "2026-10-11T18:37:53.437Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.50.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/24/af4ec4be49fbc810f35b0bdcacc3d433b56bbfa469fd3bfd4ae116cd9bf1/pydantic_core-2.50.1.tar.gz", hash = "sha256:e50d7b94baac6c7d09927fa5ca5800a0c7ee5015c7fcff65beb3a1931b5a6e09", size = 513515, upload-time = "2026-10-11T18:35:44.82Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/94/101b49a6c63f99586755690696eae14532772587d9e39e93f7b8d28a49da/pydantic_core-2.50.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:704075d10b74f2f3c6e15407c696d88701df35fc8953f434a431add0d0074db0", size = 2222428, upload-time = "2026-10-11T18:32:20.228Z" }, + { url = "https://files.pythonhosted.org/packages/db/a3/f8b1b39349c33037c73d7a1b794c9c29d8f07d5bd2b74399c1375a529cc6/pydantic_core-2.50.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e8e1d6ce820aa23317e8209a86bd65a540973c12dc7552b48a4f6c8e9926815e", size = 2025779, upload-time = "2026-10-11T18:32:21.723Z" }, + { url = "https://files.pythonhosted.org/packages/d2/2d/862a7d115305cc621358e51ba13f296e0ffdf4fbd984be9f63bc7862730b/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c18db21573bd2c6489f9a544b7499f0df2853958c568e5e783536ee1f690af41", size = 2048429, upload-time = "2026-10-11T18:32:23.3Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7d/fed95d18bf2b5abe2d5ab2bbec4184bfc22b6805994a33ccdae8edffd25a/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb57f304525a5e3c13333b772bf9a473f36326e9c821b2e8e1b2fd36f80ae2c3", size = 2173274, upload-time = "2026-10-11T18:32:24.697Z" }, + { url = "https://files.pythonhosted.org/packages/93/1e/c6f22ceac65dc3d291ff79bea0eb74cbd1de8b128f01fee48af03bcea1e1/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a27c09d86600f1bf2fe3f37e1ae697faf3143931c09322cd799da94deee923b5", size = 2360403, upload-time = "2026-10-11T18:32:26.281Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/190b5b6bfe4c72f265feb657913eb30749193927a5ad7b83cfa7866a25a2/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46b3301d3b5c886f77de7546e47274a5842c622ea2020b8c6524c6b66913b4a6", size = 2439799, upload-time = "2026-10-11T18:32:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/90/24/48cd98388e4ac2c08d0800af36d15413db15e20387f1038123a2c86cb2f6/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ba4e9d8210d941c200431a56b2c0400b131865947903937ed3ec5404307d2e", size = 2160157, upload-time = "2026-10-11T18:32:29.553Z" }, + { url = "https://files.pythonhosted.org/packages/00/86/d909133d0b9979ed14c20f110f21124a0e346caf071bd66ac5af3009062b/pydantic_core-2.50.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:e5faeaee74a57d32b3ab3aebad2e348f06d3ba946fc5d28c1728455f00a3d13a", size = 2229523, upload-time = "2026-10-11T18:32:31.027Z" }, + { url = "https://files.pythonhosted.org/packages/90/31/4b43f08131b2098e73a852fd932063385f3103b33839fd9d1abdb89e673d/pydantic_core-2.50.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3cda0e538208e5d722bbf3698b24f19c0a7d05bc8d5f8a7f9b121ea7fa243d9", size = 2242700, upload-time = "2026-10-11T18:32:32.622Z" }, + { url = "https://files.pythonhosted.org/packages/88/77/de39658569dc7a4c293d110a89629f61145e7538f00d1e4280c28debefd3/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57f51b31ff826e2859120cf4737c5a758a48d96f3e97da40ccee1796d58078ff", size = 2278452, upload-time = "2026-10-11T18:32:34.165Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/1eeb9e4e791e81210ef9096f58080b32ba15b5b13c108d50aaa3f8ce9f73/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8daa7ee75245d43ad7d747e5c9ecc1b1d06552f72b14887e9276f787d57375f4", size = 2450098, upload-time = "2026-10-11T18:32:35.547Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/b2accfdff17e5a88d6358536702146de00f9339adaa4d5bbe1ee93cb4832/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:acbf31f37c53a5ac0c34706c80b4f5107ba20b05fdd3816124bf236ef0c57dd2", size = 2476839, upload-time = "2026-10-11T18:32:37.119Z" }, + { url = "https://files.pythonhosted.org/packages/3b/7e/c8a83eb5d2cd42c2e13507150fb777b1edea5a018adc9cbf2858a1d08285/pydantic_core-2.50.1-cp312-cp312-win32.whl", hash = "sha256:45b11cac094aa25725581d9304eee93c9028516b9ea80dd9e175e13a5a2c840e", size = 2101425, upload-time = "2026-10-11T18:32:38.593Z" }, + { url = "https://files.pythonhosted.org/packages/c5/17/8bbd530b8659e9d963f5b16f6cb8e159f4cd174b4d6304e48969ab12dba8/pydantic_core-2.50.1-cp312-cp312-win_amd64.whl", hash = "sha256:132529c83901437ff642f585216831bf5fd7a91df66829907e155192ead62498", size = 2172522, upload-time = "2026-10-11T18:32:40.112Z" }, + { url = "https://files.pythonhosted.org/packages/af/9f/a79d690b127e4e3cff143d031538ab9aa715f6b2fbeecbd07cd6f2bf9fb7/pydantic_core-2.50.1-cp312-cp312-win_arm64.whl", hash = "sha256:4e834f6a8e4ff772dcc34f58ef5504147a3ea5b0f4eeb13b0f8eb2ca75ac57f1", size = 2161366, upload-time = "2026-10-11T18:32:41.606Z" }, + { url = "https://files.pythonhosted.org/packages/ae/57/0e237d7091d2cd44a35d243b7344227f90440166860469cd036afc23a04d/pydantic_core-2.50.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d5e062c01286d861fd6a1c4ff6e063547b3e713067f2df033c0ff97ac2ca006b", size = 2222774, upload-time = "2026-10-11T18:32:43.103Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b9/c720e56858d4e1539503297ed37063e0c08e0f3541c41b777f6a800f75fa/pydantic_core-2.50.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c003c3b7f49debb893d2d85ae099ac5959c9839e2f330fadb1fcdf7a6594482", size = 2024738, upload-time = "2026-10-11T18:32:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b8/fbfc25875219cc060e613170ff10e850c6d8924beb4910da57c2ee3ba1d2/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:409e0ea40ec30d9158f33574fd758e689f6045a0f2596701828c27816ca9687d", size = 2047049, upload-time = "2026-10-11T18:32:46.164Z" }, + { url = "https://files.pythonhosted.org/packages/d7/43/34210124d504c553688f2f04b48500b131237528ac545b445e0d6d30e0d5/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:131059670f1d2444269b8585cb888963994871932447c08b39ac6a51fcfef658", size = 2173415, upload-time = "2026-10-11T18:32:47.722Z" }, + { url = "https://files.pythonhosted.org/packages/65/cf/6e178e8fdc11da5965bef980983bf46326a42f436871dd51ba0a57f39df1/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dbcbee53bf17196a7f745aa9bf5a9603953a1e365b1f020be3207c676a3e7c4", size = 2361719, upload-time = "2026-10-11T18:32:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/11/14/bd5169d356aa91bf777e28ba0b281c192d286d03c2812c9c9db023a2f00e/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:325c23f3e35cfbf0fe3486fa5f7260d1e45885173002d30a28ca019994124255", size = 2439803, upload-time = "2026-10-11T18:32:51.025Z" }, + { url = "https://files.pythonhosted.org/packages/1c/bc/d79d000e5203ebef39af839f2ce77a777fcad6e08ad26af9a2fcd114ffc8/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17e722e156d0444ecaefbe640bdb60928752bf2013e2b7a11cdb099aaae19bec", size = 2158402, upload-time = "2026-10-11T18:32:52.714Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/4902cb5fd599422c130bd3124ab31ee8b771199bd56662702eed07d3fec7/pydantic_core-2.50.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:aa8224f10880d9bf1b5993988ba153d42a8b4f3f4f511f93b1f09c93ff613c72", size = 2229755, upload-time = "2026-10-11T18:32:54.126Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f5/c1481f8669f6060d89110c9b1374173fc8767ca276b84f4870bd8acd5e3f/pydantic_core-2.50.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41bc8237121bd8dc8d888dfd6279fc166ffc88c1f1bf3a8bf00869680533ca4c", size = 2242303, upload-time = "2026-10-11T18:32:55.641Z" }, + { url = "https://files.pythonhosted.org/packages/04/f9/77fc3c7653ba9b6e42049e17e96b25388187d4a7c274ab1cb07f58ac8419/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:45c6266d071c241f2a168d45bf8c54344f0effce35e7e6b73afdec11f3687568", size = 2278345, upload-time = "2026-10-11T18:32:57.38Z" }, + { url = "https://files.pythonhosted.org/packages/95/9b/0579c5d12e7f2b16b27e6782427987341fcce07b0725e02ddb0b74add0c4/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:1deeacb112d14d3f4fcb16b165f7dbaf76c70ba6e82f37ba042bdab51970a0b8", size = 2449947, upload-time = "2026-10-11T18:32:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ac/1b677db91eba54cc5922f4de6edc46ba45c2bd712dfdc0130382d158e214/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c96fd793b73d1b92e65570132505498fe7b21eaef73cdf74e67e5dfba7ac9e4", size = 2476889, upload-time = "2026-10-11T18:33:00.665Z" }, + { url = "https://files.pythonhosted.org/packages/4d/2a/3a9f6624ee3ea9ccba5249dde11418bb4c35780a7a92608f8768bd3fea39/pydantic_core-2.50.1-cp313-cp313-win32.whl", hash = "sha256:06ead20d39ffd6f2f6f2a8f8a6de67ff8bb1b4f14a8a30e058502514ee2ac685", size = 2101118, upload-time = "2026-10-11T18:33:02.329Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1f/323f78ddd9d9938aac420c1abb4e8ba799fc8bdab0acc67c0593b837c979/pydantic_core-2.50.1-cp313-cp313-win_amd64.whl", hash = "sha256:7816e98acc08119dc0f340ab167048ecc54126316330c1f0caf7c6756c88e28f", size = 2170840, upload-time = "2026-10-11T18:33:03.919Z" }, + { url = "https://files.pythonhosted.org/packages/cb/09/8497c52a739ae425c3ac2f7f56414cbc711c67d374346174f40fe2062644/pydantic_core-2.50.1-cp313-cp313-win_arm64.whl", hash = "sha256:c17799a62c142d61b8a3c51752a7cbc87fe2ad4ccfab10e628a77b405075c662", size = 2161633, upload-time = "2026-10-11T18:33:05.518Z" }, + { url = "https://files.pythonhosted.org/packages/49/33/28b96e81677153715e3eafb9f26663a80841e859fde282a380359b0d3fa1/pydantic_core-2.50.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1cf41f1ae3fa155cf167a72689ad044bcc1e3c97e064123677149bdfb5dafc4a", size = 2224428, upload-time = "2026-10-11T18:33:07.153Z" }, + { url = "https://files.pythonhosted.org/packages/94/40/15c06410c9b7b8da5805d27b64e09bd3f900e986728106db2689dbc51513/pydantic_core-2.50.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4df197990c15b5a37c5a277d131d9f2c67de6133f2e5dafd80d9bba4b99f46f9", size = 2023740, upload-time = "2026-10-11T18:33:08.763Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4e/5eb629f6efc2a27e421d789dd4bfacbb5f6d09c80c28b13d1e87d73163d5/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0036473f5583e6a60e50b8b21651511564277a3f05cc5dab8cf579f552cd5f6c", size = 2049435, upload-time = "2026-10-11T18:33:10.366Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8e/f195aebec49ad12318876ac2368c197a7939f5d52f8e156d2238ef8a4588/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:992c3514ec891fa7858099183e4d64e6bd5a5d4ff452fae29df22faa77a006bb", size = 2172975, upload-time = "2026-10-11T18:33:12.368Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f5/7ad9fb83010cd5ea0948409db105676ed779c4e709e2d3d89b9fe2558794/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:739dc730e6be3bd5ec2f4ab5cfc7eb047cc45fc1497b3bafec74ff2ed07df597", size = 2364197, upload-time = "2026-10-11T18:33:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/ca/fb/bf0aab3e78301d202b82a0322ec968cd703b11fc0623fde9a28708936f62/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fad3a91e51b6d2039c572db04a5a873260b399f6bd62c3552671fa7a4a2899", size = 2444259, upload-time = "2026-10-11T18:33:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/45/35/38f6d6564fae57d9b12e5676dfa947e0e7d5c46dbeaa7eb3352261d6d299/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42b54c2c90ad348b5e3a85e03e715d572c1fde357ef104cdfe3b03b697a404ea", size = 2159857, upload-time = "2026-10-11T18:33:17.51Z" }, + { url = "https://files.pythonhosted.org/packages/65/a0/fb0a3ca10f139dcf765b2d312d10cf0f65c57c59993229d00ad12b14ceff/pydantic_core-2.50.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:2df1ff41884de2bc4b307bafd7c40a691094fad2ff8e767e5b45a319257bcf4e", size = 2233954, upload-time = "2026-10-11T18:33:19.591Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6a/e63842252702aa4ec6e6b7178ca85e541a77459076592c23ebe2d9840b33/pydantic_core-2.50.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe90228920fd8ff2be62622b6bb8a2b11acd65046d50c6b130614b5879605a20", size = 2243876, upload-time = "2026-10-11T18:33:21.393Z" }, + { url = "https://files.pythonhosted.org/packages/39/25/5991cf8318b37e0dfab47b87541619a1df8501a793cba0d978846cba37a7/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:844b869f118e22a41a091bdcedda8a71bc1b0f62c38d1a0c3211cece47e1d8fc", size = 2277908, upload-time = "2026-10-11T18:33:23.324Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3e/3ee8baaa6cc25a6961c69168cf9ff0f002d56f4e0d541ad6724c18fb61f3/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:2eb75304506894a281d346220a4f7481a1b8729577c5ed2a05395991966a8396", size = 2449285, upload-time = "2026-10-11T18:33:24.942Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/acbec6deac13fe697a80c275a9b6661db62c4d323bac8a47347b1f39c7cd/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6b20a4bffabdad0db2927ac034ae3b8a681b1f7a0182f3e60b479ad2fde21ebb", size = 2479013, upload-time = "2026-10-11T18:33:26.925Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/21a3f237b264389f6219d053ee78fc1b5c2fd402c1b1cb2b6cb8b85f9834/pydantic_core-2.50.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:99ba9bc2b8062ea0c326a990f7f00e6530c23579de66dd246e72c4cafef950a5", size = 1484400, upload-time = "2026-10-11T18:33:28.693Z" }, + { url = "https://files.pythonhosted.org/packages/09/ce/077a6d262d12ef09108377ac0717f029f420d773ace63cafd6143af75568/pydantic_core-2.50.1-cp314-cp314-win32.whl", hash = "sha256:cf356f70551d40374eaffb1aa63f1eb6d2006681cbd7a9faea173ce0f4dd7cd2", size = 2103222, upload-time = "2026-10-11T18:33:30.326Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/350a2415209c43d670eb71d3c040f332c04a30583d39e311b05c7ac15762/pydantic_core-2.50.1-cp314-cp314-win_amd64.whl", hash = "sha256:d32f3acc081cc3923386d88f422cde8892335e95f034e0104bb4cf9310d9915f", size = 2171586, upload-time = "2026-10-11T18:33:32.139Z" }, + { url = "https://files.pythonhosted.org/packages/bf/92/9bea6ca96580a0902fed366f064f0829e404f41889b34543279a1162b888/pydantic_core-2.50.1-cp314-cp314-win_arm64.whl", hash = "sha256:bed5163e03b98bc1fa2eb05d74c63d9c5c95d8ed6254985481640fbf5e237dea", size = 2155773, upload-time = "2026-10-11T18:33:33.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/8c/f121f073cf32bdd5cba7e6230b1ce0ac845b0cf43e44dd597d95af272db2/pydantic_core-2.50.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:9572c1369e9c9da2d64a7b7992c786d90ff295abc93964cfe3125e4290768070", size = 2234017, upload-time = "2026-10-11T18:33:35.588Z" }, + { url = "https://files.pythonhosted.org/packages/a4/69/2bb2bcd6146cffe98d760a46c42ae71efd5151d9b2f9c9bf6619a3b32083/pydantic_core-2.50.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2005207aafe1231315718bf6ed5d064a7300fb4772754af35ee72fc68159492e", size = 2001016, upload-time = "2026-10-11T18:33:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/20/b3/fbf854c7d07ec114260c26e9e2071a4381740f9ae09641dbfcbdf2a18c45/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f6047f62a6c5ae08d0a6afb035667aa2d97c3d20d69762e034c5ea144d92a5", size = 2023015, upload-time = "2026-10-11T18:33:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/20/6de55b2f92cdb614b745c6e9ced639fc4fd7e1e77604825a88bdece6fcbd/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ef800dd7d85bcdadf4c3076e4c94e43939493558a3b69a1ea830c706d4617bb", size = 2192543, upload-time = "2026-10-11T18:33:41.381Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d9/19e91c94bd5c405945ce2f15526808aea37e162c253160de8ed7bf70b406/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0135bcdcaa0f23573f286e4cb5e0fd2962700964ed13df085b85f2b97aeab9e", size = 2388704, upload-time = "2026-10-11T18:33:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/b6/bc/2e24c8415eae1a25ee5a5484946a917123bad2e9d01689a759236928175a/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b3a6f334c6a2345ca15318ff894502a90012536404b37c844a976c76c846e0b", size = 2464118, upload-time = "2026-10-11T18:33:44.856Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1f/945b8053cb061c64e102bcaf7bfb9ed740c0bd4349f9bb978a7d4ddff4ab/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06e01fbbfdb9be777b316a71b6c49efaf4a08b615d0a98d678cda3023f79d019", size = 2150142, upload-time = "2026-10-11T18:33:46.661Z" }, + { url = "https://files.pythonhosted.org/packages/2b/78/96a3e50bf0d64aaae781107eb9335b7529d05a85793ed6e7241c4cd1d931/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:a29a061fec0b4e2d714f277e70a3a18125ecff803f2fea6eade2f2e53711d112", size = 2245577, upload-time = "2026-10-11T18:33:48.574Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5d/a6038a0322232758a6ebfa709f4ca14a60bf5b93940cd0b345056a557da4/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5187624823423e1d1b82b1072ac41dc837389e18d3d0572cc19bbee46cd550a", size = 2263728, upload-time = "2026-10-11T18:33:50.527Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/76ded3333a457a9344c4f2d63f2d82d0101654b05178fa4ddfe7d3627674/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3e46a9eb0a0901dd6275e6b06ac3a464885ef350ec4121fe486869de8053e4bb", size = 2293630, upload-time = "2026-10-11T18:33:52.362Z" }, + { url = "https://files.pythonhosted.org/packages/a9/00/9eca378335c9c1b72bc779bf6e4c2a82ce784f14ec48a0e87102c9870e05/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:756d669f04e62ec4148ecfe22be6a4484d9b1181a6ef32e205ebfd200540858b", size = 2468048, upload-time = "2026-10-11T18:33:54.118Z" }, + { url = "https://files.pythonhosted.org/packages/35/ca/e3832e9cf93651251de43c8c5c029ed680a3c1a0a1b17ee26c81bed08cbd/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:c516cc5367ca3448995d42cb994bf3f4c9002d2a7c22eac9622551269ad1b807", size = 2512159, upload-time = "2026-10-11T18:33:55.99Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f2/773469b5a10a39116a2cb17edaf6d722f017dd8da07161b371465311c542/pydantic_core-2.50.1-cp314-cp314t-win32.whl", hash = "sha256:9d1bed94af6a63835461f3cf7502058eb166c58c4778e11d0f433cfb1bd69e19", size = 2098406, upload-time = "2026-10-11T18:33:58.043Z" }, + { url = "https://files.pythonhosted.org/packages/ee/42/0bb74f8f25204b259b11ab7c12dc7f180893b6bd706118b385147fb6efd5/pydantic_core-2.50.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c8dce1f1e0e5358b682a6ad3fa5e31b31d4560997b8e61417e9217c8d60f8a0c", size = 2148481, upload-time = "2026-10-11T18:33:59.913Z" }, + { url = "https://files.pythonhosted.org/packages/47/0d/d801646c9679a4e630e15cf521d4108b93854b42a6e6e02391bd4c6b1095/pydantic_core-2.50.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ceff0acc940be2715bd6ad17b24c0e5304abf44f6efd0f81ee8499e640f9dc86", size = 2174972, upload-time = "2026-10-11T18:34:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/b2/84/23984b763d8862a02a13d27a44b6e8169428fd85ecfed88f54c29108604d/pydantic_core-2.50.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:8a6791afa2245e6c6b180122d105941644f5bd410bb18623b408808cc41a3102", size = 2224599, upload-time = "2026-10-11T18:34:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/4d/90/a63cf8586abc1d1a3f6d9b18f0224789ebf003851f092ebda3c7c863fd32/pydantic_core-2.50.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:84f34323a61a365b4e9295de6028474754829aaddd59c7bf1a040e7487ef8f3c", size = 2024191, upload-time = "2026-10-11T18:34:05.901Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6a/f34bff9808ffb4907fbf5f5040457d253cacf2da7fce9efbc99ca1b1a44d/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23edad659e8dbd8ca7e4e877fe6c81573abbdf215bd25a68b53e1272f58b80c7", size = 2048252, upload-time = "2026-10-11T18:34:07.757Z" }, + { url = "https://files.pythonhosted.org/packages/b2/54/13f419bf1eb59852003818e25935aaf175687d978f4c4bca70e08fe40a3b/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a5fce22f1e87d181e924e12da7d81cfe031fb3881a5ddf26ad28f141756ca43", size = 2173376, upload-time = "2026-10-11T18:34:09.592Z" }, + { url = "https://files.pythonhosted.org/packages/6d/6c/b5a34d24cd0c81669d8f8339d74e6815abcf2f8fb48ab4b49b84c09be1d5/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c73622ef819328873b53109ee4f77ceb598bffedd02daf916102be3228866b78", size = 2364559, upload-time = "2026-10-11T18:34:11.534Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/d64d6216a8df365082665927ff923f183056f9049fee08e9777c9ac05296/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce8c25ca38cc0e3d7753ba180808de2c0c8cb24eae0df64491e40921454e9831", size = 2444697, upload-time = "2026-10-11T18:34:13.535Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0d/1b1149f60a00ea21ba5f70e28acbd40feb4598af414f80f53c921fac07c9/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7689580e72a642ab5ec64d5f55b2e33636fa43b4ebe63c0c2c965ef307c7d1aa", size = 2159961, upload-time = "2026-10-11T18:34:15.56Z" }, + { url = "https://files.pythonhosted.org/packages/1e/35/f236549299dcc78e71e945495d7ec67e78d20844d0999c60601685003031/pydantic_core-2.50.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:d5c0e32fdbce7f1e8ef4d11f655694bf5f4175c757a9f1dc2be09b8864e5bcf5", size = 2234581, upload-time = "2026-10-11T18:34:17.502Z" }, + { url = "https://files.pythonhosted.org/packages/6a/85/26901a490522b7f75ef9bb9a7afb73e5bb550f0e1cb5b99a0069183e2eb9/pydantic_core-2.50.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40f523349960fa30f3ea51404308ff50f9997a90df639590f47a057c1f32b415", size = 2244090, upload-time = "2026-10-11T18:34:19.402Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2c/481bcfc70ceeb77a778ca6e5b705fe592cb64735c108157f81b7dd9c280e/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:d4193206b6587047437f6f11d7e776df23e1c1e23af2a54d9347275614791e10", size = 2277948, upload-time = "2026-10-11T18:34:21.317Z" }, + { url = "https://files.pythonhosted.org/packages/24/eb/f1e09333faa7ba447cde967310f758430cc7c5e987bdab5228816c70030d/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:84bc765b282a9d5b7fe0348b8648904f25a6a04b2139da52b1dd30c8ac3a2c8f", size = 2449688, upload-time = "2026-10-11T18:34:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b3/036bde636db8f76d92996e81aefc75678ab5cec4a07eea1ad0c72a893fc3/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:ed1e728b39a383c81035b2459cfcb35d99dfb01f7d6ebe3a913bc1cc5b81e459", size = 2479286, upload-time = "2026-10-11T18:34:25.214Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/07f018294ee18d144afeb6df1a47d9e92960f014be45c5ed13519fa5af95/pydantic_core-2.50.1-cp315-cp315-win32.whl", hash = "sha256:bc94f474417604bd383d2cd445d071b07dd55fedceed3ce33407bf1fcc107290", size = 2103683, upload-time = "2026-10-11T18:34:27.42Z" }, + { url = "https://files.pythonhosted.org/packages/5f/98/f9bd7e1f9b6709f155acb9ef826d9c3884fe925f811fd8e55b9b52280bad/pydantic_core-2.50.1-cp315-cp315-win_amd64.whl", hash = "sha256:983a662de2571cb2502fc8ff47b6770b03d025d2eb314c92f77b3f07c74720ed", size = 2171681, upload-time = "2026-10-11T18:34:29.508Z" }, + { url = "https://files.pythonhosted.org/packages/10/87/4bb3e1e7f385c076ab5af4d6dd0571b22042cd8207eb810d5b9fef15ae31/pydantic_core-2.50.1-cp315-cp315-win_arm64.whl", hash = "sha256:94845ff54dc5193f228cab81b2662a04bfbb892e95bdc15edf7399000ce57d54", size = 2156251, upload-time = "2026-10-11T18:34:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/83643225b08f2aef6c8cc4bbe6e3f79c5e139c4364a6e450d0f399d87774/pydantic_core-2.50.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:4a53d13cdfbedbfa87f08b83c1a0a5efcc767d785a4b41934fa9cb672670493a", size = 2234363, upload-time = "2026-10-11T18:34:33.65Z" }, + { url = "https://files.pythonhosted.org/packages/5e/66/127ca649ba2f2462039dc1e694c6c01e00a3689f023a617364d3507e6d97/pydantic_core-2.50.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:efbecf43d321f7b9281441f1f213f7c21c66988b0e06c2730ba13ed47a46bb08", size = 2000972, upload-time = "2026-10-11T18:34:36.037Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e421e0a5d653b1203b090b2e48745976988d7338a647940704b5b9c2b399/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1f08f68dac9f9e83845a8039880aba2ab553eb9b2259c3243a313182c253fe", size = 2022925, upload-time = "2026-10-11T18:34:37.972Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/ea5568e2491e1a71100f15ae8c2d01ef52db42a184a2d4e716bc79e5eb8f/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5dfe41f232befddb9c4377f6cfc702b51595e2d78ed082672adf8758d2c4619f", size = 2192867, upload-time = "2026-10-11T18:34:39.921Z" }, + { url = "https://files.pythonhosted.org/packages/ae/5e/3b8c3a35acbe219909ada5defad5d7d9fed845fb2b37bd5ec518f453c119/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adc06d218a1cadfd2ec4628424d7d79ce4eba69c2965e7e7b55106f0da5208c8", size = 2388687, upload-time = "2026-10-11T18:34:42.184Z" }, + { url = "https://files.pythonhosted.org/packages/b6/aa/7889b4e515f91a2e8c0ae6b5081fec0feb30c4398d1434e14793c60f173a/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cf91809d0721ab81592ba67bea7694821679c10b1a2e3c3460082b286c1918a", size = 2464415, upload-time = "2026-10-11T18:34:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/08/78/93449e628eb8a6fdcce3eff9043081179d1bc7ce6f1bff32dc5006f41e00/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23923ab9292c40da026330b1ecf4dc2618c8e86e0422e5d1fbf50d94d64ca4f8", size = 2150823, upload-time = "2026-10-11T18:34:46.392Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f1/72c5bc129fceb0d00f05dc1e67f518c1728de1928c55f81fc13d7690de39/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:f3377c8c2b3ce898423c5e5dd94c7982e30aa7717a7e6ab2470b9de364963709", size = 2245806, upload-time = "2026-10-11T18:34:48.805Z" }, + { url = "https://files.pythonhosted.org/packages/28/2a/922a0e78f3aa6ab837b59f88190233fb8dad546c17995fde9bb3ed3b9b49/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:455a773617b5913bf5c20d0692e5787b119e52c4d40ea644ca31f5758fd31be2", size = 2264160, upload-time = "2026-10-11T18:34:50.876Z" }, + { url = "https://files.pythonhosted.org/packages/52/a8/0f1449e3e1b20941c9372faa18e7b6a092e30cdfa841902473f7989532ac/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:1a9006395dece0e32e704c315eff8a00bede494f6108546cfc5539c89fef4f9a", size = 2294031, upload-time = "2026-10-11T18:34:52.876Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d0/1031f492857de70355fb16524bbb03efce5fd34c93ed4a1ec60be07e0d4b/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:d2d82aa62521c55ddfb000ae70f88cdd8de974078f6024e821dfe5addd0c818f", size = 2468423, upload-time = "2026-10-11T18:34:54.995Z" }, + { url = "https://files.pythonhosted.org/packages/46/52/269ffffa645b8e47906395a39cf9db1151ae9fa4bcd7f47b960bc31baf37/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:009634b83993777ddcd69cad0ffcace43dabde692109528e35f0fde91e386a8b", size = 2512598, upload-time = "2026-10-11T18:34:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/e47e28281f20326ff6f3c31d626f0a83e615d2d94ba41bb0ad6ec237184a/pydantic_core-2.50.1-cp315-cp315t-win32.whl", hash = "sha256:3fde4fdc6487a58d944ca87cf5adc95d5f266e872c19599f5f4c0a8a1b1f9f9f", size = 2098535, upload-time = "2026-10-11T18:34:59.313Z" }, + { url = "https://files.pythonhosted.org/packages/03/ad/759e181e69c1b472c60b2049e5f61d5da1deefdd5ce1df4bb2ebcf771f25/pydantic_core-2.50.1-cp315-cp315t-win_amd64.whl", hash = "sha256:1c8632d4ac04e6f91128fca584b3a8a507d81604c24eeaaad00d4be42765c32b", size = 2148645, upload-time = "2026-10-11T18:35:01.571Z" }, + { url = "https://files.pythonhosted.org/packages/6d/56/8a702c27e5be9f47e5f19d8669227424290e4c024e7c370279cbaf244b4e/pydantic_core-2.50.1-cp315-cp315t-win_arm64.whl", hash = "sha256:c3ede305158e75510be50869b319550ab072008c13d64d4ab1e094fb286b6f44", size = 2175297, upload-time = "2026-10-11T18:35:04.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/1bcf160f3cd6333e2a76982fae5963e5032de0bcaaba38464223dc266bfe/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:76e2e83fa6ec8cdc972d438dafc2522b3a47bee4ec0ae668b29cfb1977ab5242", size = 2217070, upload-time = "2026-10-11T18:35:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/3d/81/f02de95eec7794dfc7a5bc69a834f0e834b31b3009014ce6de903855f775/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:a51eee75939cf811ac09b278745a6cee7dc873ccfbc8b9af3cc88fe4b7ce25b5", size = 2039027, upload-time = "2026-10-11T18:35:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/4d/16/227746ed3771d9bf2304568b55134849ece34e13b38b1d76de763015c77f/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae28183297fb0d2b8dc46a1f01d51f5e45825fc5afe76a835a6cb7fb34821295", size = 2109009, upload-time = "2026-10-11T18:35:20.218Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b9/7664d1592a0e5a74903f357cd5b28ceb7336f3473256c5a4e8c8432f1881/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88e492e8b9d0312e7dc13667c30222abf284dc3b79b5302b3607b41a5784ce61", size = 2269883, upload-time = "2026-10-11T18:35:22.48Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/26/2fbeedb218a787a5eea551c7532cac4e009f83d689dd2faa0d0353473f86/python_dotenv-1.2.4.tar.gz", hash = "sha256:f0d53e69935a851c0dcc78f3ab7aaccd8cabef0b92382b576b824212902873c0", size = 60824, upload-time = "2026-10-01T05:36:10Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/d1/38f3a3405989a89ac18390803e70c6ad7c7760da4f9b83cbeca0c44a0c72/python_dotenv-1.2.4-py3-none-any.whl", hash = "sha256:42269a8a5b3fd54ffa6f3d84b18abed50064717576b4ecf03dc4a55d8aa04fdc", size = 23266, upload-time = "2026-10-01T05:36:08.633Z" }, +] + +[[package]] +name = "python-ulid" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/41/65079023c81491a21799c0120bce5925366b6913596bf797806f19973290/python_ulid-4.0.1.tar.gz", hash = "sha256:bbeec02556190bb9dc3401faa7268696acbfbe7b6db9908c155dc3548629f20c", size = 101683, upload-time = "2026-07-20T15:21:41.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/15/8b39b36f55b6618ec4ca9b55134dcfd9c04cecbc72709f5d8e6bdebed9cd/python_ulid-4.0.1-py3-none-any.whl", hash = "sha256:6f1d69ceb97e99fe542df8476ebcd7a668284bf53ee14b3106bcc6a341a95ed9", size = 14609, upload-time = "2026-07-20T15:21:40.214Z" }, +] + +[[package]] +name = "pytz" +version = "2026.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/21/d83d6ef28c4c912c4bb4d1dcf591f7b8c6bde87b9c66f9f454677314e16d/pytz-2026.5.tar.gz", hash = "sha256:fa23724b9c486543b9ff54a327ee7569ac83ade54bb9afd0fc18676620401c86", size = 318572, upload-time = "2026-10-04T02:37:58.719Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/ef/c66110d46fb800dda0bf33164182dfadabe26a90e4476844d502a23dca8e/pytz-2026.5-py2.py3-none-any.whl", hash = "sha256:e658af3757f9e26a9d25dd2aff38335acd92bc9104f890a894b2c1ba28311b03", size = 506342, upload-time = "2026-10-04T02:37:56.814Z" }, +] + +[[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/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { 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 = "starlette" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/0c/6efb252d091ecccd7d62048ae11f0ea35cd75a4fbaeea5e30f9c3bf91d10/starlette-1.8.0.tar.gz", hash = "sha256:1565dc0b35d5737a271ed1e0e04e949f4e81198799f216d2667b0a0fb9cf9522", size = 2730457, upload-time = "2026-10-13T07:54:39.53Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b0/5742e4ac7af5eb58ec3470a537a49d7aa507e5539413e504b3a65ef50ba8/starlette-1.8.0-py3-none-any.whl", hash = "sha256:dfdd6b29c26483288088d990eee59631dedadd66ce20d203402a7ca8e3c4656f", size = 79612, upload-time = "2026-10-13T07:54:38.019Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.54.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/34/30e9280707135d2cfc589dfff3cb796bd07a3aeb1a3e415ba09dd89d7bb4/uvicorn-0.54.0.tar.gz", hash = "sha256:a2e33cbfaa0306f8e6b0c13e0cb89d7d7a2da3e62b90c66e18c33d9807b28620", size = 112283, upload-time = "2026-09-25T06:52:37.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", hash = "sha256:505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf", size = 87427, upload-time = "2026-09-25T06:52:35.829Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/42/02c739ce85fb2ee8d99212c61417da8140c6b87e9d97c430bea520d76044/uvloop-0.23.0.tar.gz", hash = "sha256:28d160f51ab4da3b187063652e643dea6831072add4adc1e6d62afbe73b6be27", size = 2559185, upload-time = "2026-10-01T03:17:04.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/98/04e766a6de99e6f7f955ecb7829e8d5a557de3427cb85be2236de54dda0c/uvloop-0.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:93935ab27b6eaef4c3e5489aebc84284f0644592f7ab516df60ee1b27eaf5eb3", size = 1393055, upload-time = "2026-10-01T03:15:42.526Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/499e7b863a848ede009539bce39806b66205da5f8779354228e785601144/uvloop-0.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4448e9124537620f9c25d004c227bb5104440b58955c19bbd312d910af919a63", size = 768909, upload-time = "2026-10-01T03:15:43.974Z" }, + { url = "https://files.pythonhosted.org/packages/3d/95/a880f8ce3b87ac5b307c354e8ee480be4658d24bf01f87921d57e3530b4a/uvloop-0.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7548ede3ee908cfabc0d068106e303a9a2d811af959cdf6ab85676344cedcda", size = 4419106, upload-time = "2026-10-01T03:15:45.551Z" }, + { url = "https://files.pythonhosted.org/packages/51/27/c1d2f9fa977f8f42ea294604166df10e0027e6dc6cd17f85ede386c9bf36/uvloop-0.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:090865d8ce7a03986755a3ce711b7dd0d4b44eb14ab74368b717f3fad1180208", size = 4532597, upload-time = "2026-10-01T03:15:47.258Z" }, + { url = "https://files.pythonhosted.org/packages/42/dd/2cb6a2c8a30ca55c07a882dd4ae4ceae0fa7d8c15b25b3b7cb9a4b6cf4ca/uvloop-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd6f2f81c7b9da99d301c0b16b82044e76fe887086e42e1590ecf520b94dbdac", size = 4230048, upload-time = "2026-10-01T03:15:49.119Z" }, + { url = "https://files.pythonhosted.org/packages/f4/52/29989cbaa4022dc4ef35c1dd60a4ab989e4c2065f341ed483ae71d2bd950/uvloop-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a6ac96da66c35bf789bdcde78a88dc7d56b7907d8379648c54adc1c61594575d", size = 4394152, upload-time = "2026-10-01T03:15:50.829Z" }, + { url = "https://files.pythonhosted.org/packages/5f/83/eb980d64e6dd5da46d4dc35755fa6afd6b5b47141437cf89615f1117c5a6/uvloop-0.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2dcff2d69be43e6559e5dad2c5a7a2dbfb60e05a77311b6c4b7a4a8123d86c65", size = 1412726, upload-time = "2026-10-01T03:15:52.49Z" }, + { url = "https://files.pythonhosted.org/packages/04/c1/02a725e7698134c647904bdee6589e2be14a0e7fc9942c74f86e2b90d48b/uvloop-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:19c64108b507cd0bc140e400e3396bacebd9d504956aa7726272bf6de7d9aabb", size = 779071, upload-time = "2026-10-01T03:15:54.02Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1d/cde53c79e8c01884ad1cdca8e407e086d523362cfe4139e2c2a8dde27304/uvloop-0.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1748321e3c59a14a75404b1ae8d5a8d81c4e201803ea0e14c1b6fd84421024b5", size = 4395323, upload-time = "2026-10-01T03:15:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/98/54/b12915bebbf99d7ae0796211e7f5977b95f069830dca45dc1a346d84125d/uvloop-0.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2cba180d6451822763eda8364f342435a873bcfb3849cbd82fdeca248ca65eb", size = 4480449, upload-time = "2026-10-01T03:15:57.362Z" }, + { url = "https://files.pythonhosted.org/packages/f7/8e/da6de68c31549a052a105fc76f5a9a204f6df22cb0909440aa4dbb06f9a2/uvloop-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dc61e4f9e37b507069dc7e659ae28bca7adcb04c993c3508214315d12c63f848", size = 4219177, upload-time = "2026-10-01T03:15:59.351Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c3/1b53c6a89dc9c9d5cb75eb9a0b891ad69b32e1421ad3aa01617a9cbdcc78/uvloop-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7337b06a9f9ed9ea3049f04b76f65819db9b19bb832ee598e97b388eadf25e5f", size = 4346132, upload-time = "2026-10-01T03:16:01.064Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a4/00e85345871c59c834a23c136c1771205856028ecc8ba940b3951178e59b/uvloop-0.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b90397a50ad6332ed3e459c648ac20d182cce24a557354363ad85fc9ea4a17cd", size = 1421363, upload-time = "2026-10-01T03:16:02.599Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a9/e5f0f3cfde30af3ec32eba8ec07bccdba2b5116afbd1ecc53edfeb0a0790/uvloop-0.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:be53e1d5f83de43dc175c87612ecc128d444b38e5c56cb3f807f5a73d6887476", size = 785177, upload-time = "2026-10-01T03:16:04.018Z" }, + { url = "https://files.pythonhosted.org/packages/9e/79/9ddf78f8cd75a15c14a09a57f59c587b8cd9d82802c5c8368b9c3ebefa0b/uvloop-0.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b3cbc4f96ddfa1fb88a78a69dd851369825b7816d9702eee8c4461505ba172e", size = 4381060, upload-time = "2026-10-01T03:16:05.642Z" }, + { url = "https://files.pythonhosted.org/packages/1e/20/57d63c44d32326878fcad5c63854afc9deb394ed95673c1b1a429178c79d/uvloop-0.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31e0cf90bc8fd88784f6802cdba968a51fb1aec1cc3feec74d862b2d371d1330", size = 4418891, upload-time = "2026-10-01T03:16:07.326Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/0795abecda2cc3dfe41033f880a32a9ff103be4e6b177ac736833c153a0e/uvloop-0.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa8ed556fcc87a4091cf61587ef172fa104323dc89ecc085a618ba7ff8629a8f", size = 4214811, upload-time = "2026-10-01T03:16:09.13Z" }, + { url = "https://files.pythonhosted.org/packages/20/18/9010dacd5221eec1bd79a4a83ac68f3db6a42d7bb657f7b640c4838ca6b6/uvloop-0.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f3fbfe82829d8e381426a289b87e59e585278728361db9ce975b88b51f64f410", size = 4294876, upload-time = "2026-10-01T03:16:10.875Z" }, + { url = "https://files.pythonhosted.org/packages/b1/08/f6384a03c771d00067cba4f542a69b2fc1a982e9fd78b357c2f788678d72/uvloop-0.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:7e35c9bc977760981693e1a7a51493b58ee5a501f9ebb1e547565ee40b6c6208", size = 1494811, upload-time = "2026-10-01T03:16:12.399Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/756a4fb24a449f313cf4a153eb0c6210b49cfe5539255ec9fb1e17d2c4ef/uvloop-0.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5bb9be71d9ee39b4359b832f9569518ec9bc08704194034e79e4958e6bc4d46d", size = 819396, upload-time = "2026-10-01T03:16:14.094Z" }, + { url = "https://files.pythonhosted.org/packages/3e/45/e314b0c600b14f53dad3a3c2d7a922a249a88225fd727652b53e1854b9dd/uvloop-0.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e84575f11873c109cf3962ad0bdf679094466184125f4cadcc41a73febff41f", size = 4734966, upload-time = "2026-10-01T03:16:15.815Z" }, + { url = "https://files.pythonhosted.org/packages/66/0d/8686a7f0b1b2d55ebd770ba21f8e0e4ffa0cde5ab738f43ffb8264499052/uvloop-0.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbbdb8fcd5e7062e546eec1ac78c28bb21ae7df54c18f8e4b06e15a18d661a49", size = 4584963, upload-time = "2026-10-01T03:16:18.198Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/034a2d47e435ac02357c42956246887167bdc0357bdd6ad31c5f6d94497b/uvloop-0.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76345f51367fb1f23e08605c6efb18374f669be5b223658fbab6b17627950507", size = 4421388, upload-time = "2026-10-01T03:16:19.953Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/131f4b583e6b4b715c404a66b51c812d701db20f25c9018b188a2b00062c/uvloop-0.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7ef4701a96553514b2688e342ef1bf2beae6cfd172d89a76c768292aabf405", size = 4402414, upload-time = "2026-10-01T03:16:21.716Z" }, + { url = "https://files.pythonhosted.org/packages/58/3d/ee11f4718ea1280595c67ed25c83d4c92115dc100bbdfd192d3ed9339168/uvloop-0.23.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:f1341c6abcee1c31277cfe28d34e46196f2143ec3d755e6efe7452126e1f626d", size = 1418095, upload-time = "2026-10-01T03:16:23.241Z" }, + { url = "https://files.pythonhosted.org/packages/f8/0c/7ca516a0671418517d79a09d3ff2ccbb44af94c75711afa6e4cf58aa6f65/uvloop-0.23.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e095f9e105af76593b4c183bb0bcbdae64bd913a59ec595732dc108b48730ab5", size = 784837, upload-time = "2026-10-01T03:16:24.666Z" }, + { url = "https://files.pythonhosted.org/packages/35/95/75d4e28e596d505b7ae11de517646b4ca3d369fb8537ba755410380da11a/uvloop-0.23.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f673d835bdb1a60229cc3609a113fd2c9ce3f4a3c75ad4eaed111180c00199d2", size = 4380276, upload-time = "2026-10-01T03:16:26.389Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/68daf827ad62efaf4667d1f3fda127046d42161178396bdd93aab3684082/uvloop-0.23.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3f23f403a273900d57de6ee5ca0614c650f7f58563065dad1a4744498960e53", size = 4451496, upload-time = "2026-10-01T03:16:28.364Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/f67e696ee688f426a96f99099bae26fec14a1d0fa75dccdd6518ee267c0c/uvloop-0.23.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:cbe8d03d4efcccdb7fcedecbaa1e1fa02913eaf3a74cb933634a6bc6d2ea9e2a", size = 4212541, upload-time = "2026-10-01T03:16:30.014Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6a/c8c436a9d7453297b4be70bdf6a9f9fc9400da45e0059ddf7b28ab63f4c7/uvloop-0.23.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:4f1798f56c6f4ba5ac11fa2869e5717926e4470d97a1dd42b4f59219d43b5027", size = 4319377, upload-time = "2026-10-01T03:16:31.705Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2c/8fc15a03489299aab8a6212dfe0f137dc39836f915c87f7fd9d9ddd814de/uvloop-0.23.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:098a85e1393ef5202767b7e5fb41a32cd8bd81e6ee4af364c179801c4aa3f6d4", size = 1493428, upload-time = "2026-10-01T03:16:33.859Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7c/05e4a210790229607f71460fcb2ed4a2c7bc72668d8a928ce577c22e38f8/uvloop-0.23.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:5a2bbad3a63007f7e9524d4903ba04fee252557c2acd86f9a3d4f91786695254", size = 818115, upload-time = "2026-10-01T03:16:35.45Z" }, + { url = "https://files.pythonhosted.org/packages/65/14/a40b11c6c024213803b13955664a15754c72f64c873a33d986b26ec9ff5b/uvloop-0.23.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a08875543bbd4519faf30497506c9cda8a48470467ffdf967c7313c7a5981a8", size = 4734149, upload-time = "2026-10-01T03:16:37.025Z" }, + { url = "https://files.pythonhosted.org/packages/9f/83/f421a077712c1e87603bfec62744c3cd3a2f4b47378025db3d740df9af0d/uvloop-0.23.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12634f15e6625f78b3f2922f91404c4d7173487eba11746764153f556e9852dc", size = 4661763, upload-time = "2026-10-01T03:16:38.719Z" }, + { url = "https://files.pythonhosted.org/packages/f5/62/25dcaa6b7e7b48f82ce633854ce96597ab768f9650931f4f86c572de392c/uvloop-0.23.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:378188efbb1524f2219d05246a3e1e5907217848d2882144dff59585f1b81d55", size = 4421324, upload-time = "2026-10-01T03:16:40.488Z" }, + { url = "https://files.pythonhosted.org/packages/05/46/04628239b43dcef703af314202a3307d6060918e2d76aa86c5b1188f5551/uvloop-0.23.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4b8e207c67d207a8608fec57e116511030af3495dc0109b8c333cf9cb412b16f", size = 4462501, upload-time = "2026-10-01T03:16:42.359Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/68/e6aa0b77d217b31f8f486ec0cdfe5e00e6e38dc0be657e7d85819b9faf0a/watchfiles-1.3.0.tar.gz", hash = "sha256:99aee4a07847c06820765fd7b1b49ceac4f3f711ccb7d104655a33231de1c207", size = 108119, upload-time = "2026-09-21T09:08:55.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/fa/c0b840d5d8bafe640925408ce11095948c8945bb61be1e67d0ab629b872a/watchfiles-1.3.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:000b9688fc8133037a8b075c8ebf98f32844ff8964dda61e85c1db547dafc441", size = 399703, upload-time = "2026-09-21T09:08:13.518Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/894799b485fe9473ad10422a0d9668e53fb78e3a2b5cc6061159572844ad/watchfiles-1.3.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:bbc1198edfdc90fda0600f825aa94150f428dfcbf8138746f55998e0e660d64c", size = 397647, upload-time = "2026-09-21T09:08:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/5a/61/f277cd5ead05f5d37b98b41fbdd0c943ee0c04d49738f62e902cb291cf43/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af9c464d410e8c44b58ddf1cbec7c3a02c1cb2c6c80df9c74659ba2fbda0ab5", size = 454994, upload-time = "2026-09-21T09:08:16.587Z" }, + { url = "https://files.pythonhosted.org/packages/46/66/ea4c01382975e53b1ac1b0a0ea1b353416b8127fb6e04f5c1c313119aab6/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb94e40b9a0db19636b5e3fed0a9803452ecc7381df13b385272abb779ee83ca", size = 460105, upload-time = "2026-09-21T09:08:17.961Z" }, + { url = "https://files.pythonhosted.org/packages/31/c3/1a501b597817096c9831c255f6270c124ce0e2faeb74124be24dcc93b86d/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7398930a2b76b9dc67a4e6b8bfc7baf30946892a86f417a3920c07bdd6febc30", size = 493761, upload-time = "2026-09-21T09:08:19.327Z" }, + { url = "https://files.pythonhosted.org/packages/5a/16/77352d05e152c7786a016e9f1decdb4507e8aa5bcf3343c72142a0413d14/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:025b108f2d5cc2799cb941f79380df3e8b22bfb589c218e801767fe78d598c95", size = 577500, upload-time = "2026-09-21T09:08:20.723Z" }, + { url = "https://files.pythonhosted.org/packages/95/fe/81001c55b24466fe9911135e50269fd3a29f43e446627a92adfab54553b6/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be9ef3cd403d756a304a0a08a112163c63da7ec72c8c9d083c98818291ff8f29", size = 469209, upload-time = "2026-09-21T09:08:22.346Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cf/e3ad894ed5909a7c44b0707e89bc25d19a3d78b3a7aec846119443b6ae56/watchfiles-1.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5768b49e426fd5b550b012c866db347cdf15c398ef98dc557b6e6b72fa74cd1", size = 458353, upload-time = "2026-09-21T09:08:23.7Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f5/2f106829e6e2bc91ad74614730f6df484202b9a4d20d927dbf2f08d37d44/watchfiles-1.3.0-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:d36c72fcdc08f143d87316a4c4c3b064e340da2c7383d39803950740ed418935", size = 468707, upload-time = "2026-09-21T09:08:25.167Z" }, + { url = "https://files.pythonhosted.org/packages/15/37/2741ab776b978669c1f3bba1e573f1a184f727ab8b4d3a6d9c61090800ed/watchfiles-1.3.0-cp310-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f0c9865240e065a2247f4b5248528ae3d01e0e8ae071462c250c884dc16e3ee3", size = 632510, upload-time = "2026-09-21T09:08:26.532Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/db4a4684275fe9b696ee5118c194705c1423b3d42181c3f8ee70194d5c73/watchfiles-1.3.0-cp310-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:380f513d26cc2e598266b88d66456e07d67ef4be8f0f435a1154d9c44b43d509", size = 661723, upload-time = "2026-09-21T09:08:28.004Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/95ddb24f6a2f595c031c24432ab7b8aa7d6d1ada0c6d63a552166e06e8d1/watchfiles-1.3.0-cp310-abi3-win32.whl", hash = "sha256:509d9f74d2bec5c1f4cd868ddcfe0c9601f7ea53066dfcb19d8ede742c4de661", size = 277761, upload-time = "2026-09-21T09:08:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/48/a1/1c4a1b3c8030cd03206232612be8a6e8799093490c220b0fcb935d02b75a/watchfiles-1.3.0-cp310-abi3-win_amd64.whl", hash = "sha256:1acabde19b67e673274e89a04d613b7fb1f122e2c4b8ec9a581e59c149264b61", size = 290643, upload-time = "2026-09-21T09:08:30.45Z" }, + { url = "https://files.pythonhosted.org/packages/82/e0/d2db577c632d26d08078c4390dd870b8555c4e558df25d22270f0166c71f/watchfiles-1.3.0-cp310-abi3-win_arm64.whl", hash = "sha256:d978cc1dd7ba44f5590d7de74f7a9c8be7262d9e469c2c0efb8bbfc2574321dc", size = 285510, upload-time = "2026-09-21T09:08:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/a122743607939429ab6a7272672f49303aa02bbd34c3f06676765a3861de/watchfiles-1.3.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e0204f90677b7fb8d3a824279a71a01166bea9f6e53923b8056592d87b33b0b6", size = 395978, upload-time = "2026-09-21T09:08:32.747Z" }, + { url = "https://files.pythonhosted.org/packages/3e/9d/0ee1b0ea42acfe72afa2484f0222e2386dd09992e9034a81e63cc3cdab0a/watchfiles-1.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7c1125e99f84934a92996ae343501285617373acd66f16b59fd5654b27ad8d80", size = 387997, upload-time = "2026-09-21T09:08:33.953Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/4319c6b683e8bd28465dfc53c750617a2a07f072eb2e3ab0182ccf812229/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a85e243c87109d9f48a2e0d10d6abdee8768cc114848b32281ec83d7f81d86ef", size = 448067, upload-time = "2026-09-21T09:08:35.104Z" }, + { url = "https://files.pythonhosted.org/packages/b7/71/9f37ac192a51a24de3a2d7fe9aac1e99b2b2668300674ff7a9f85d95beb1/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd538c71766c59c732e2c5cedc39323c99c11897b99f93eac773438e54af206a", size = 452881, upload-time = "2026-09-21T09:08:36.238Z" }, + { url = "https://files.pythonhosted.org/packages/34/07/1224667c32a4a96876ddd642da69733cbfe6a15897db0865aec5a882cebc/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da213822ec9082b62cadf3008e07a8c690ec7a3c89f6dc5e55a8cf07b56a1b26", size = 484802, upload-time = "2026-09-21T09:08:37.717Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4d/7f29cd87e1f826df86fc0418d0b8f370ca0311c29c618406dc492aad9951/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4593392e87669836670f87d62fc754059eaeb0e6157af44060a46558cebe5a3", size = 567522, upload-time = "2026-09-21T09:08:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ac/3aa1f84abd4dbbfbae99a817dd931f77b439261c911189cad4c30fdfd470/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26b81bc515a0f03f66a69a6fea86eea54c8eca4173c46dd7222569f79dd2f977", size = 461997, upload-time = "2026-09-21T09:08:40.142Z" }, + { url = "https://files.pythonhosted.org/packages/82/1c/27c66764d5b0dbb70a36770a32eca217eba739c28b24e8583a035087a3d7/watchfiles-1.3.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca39661934749df580d89f3dde266f2af7c6968f4c21c72ce2dc387d299e6aa7", size = 451856, upload-time = "2026-09-21T09:08:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b3/a45827084d953c1d0dd3d75abf85dcac26a0f5d115ad2fe0b7e9e931573b/watchfiles-1.3.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04c5500faa725d69a99b0f63750e80795e455bb951849e9c98a811b4324997c4", size = 459889, upload-time = "2026-09-21T09:08:42.58Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3d/07740d23ce2bb23419bb24055c435a9abe5fe03efdaea1ba0720b831aab6/watchfiles-1.3.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:ec3cd4bb181a7b6329134204c2277c7144ab5f62cce9c5335d6f901ee7ce8d6a", size = 624482, upload-time = "2026-09-21T09:08:44.064Z" }, + { url = "https://files.pythonhosted.org/packages/91/46/9540f8123eaec86df989f26d7704cad0448d9fb7271763a4f8f9fe23617d/watchfiles-1.3.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:e5871d4a7f788a9f64fb06f5793389d29d171e5c32d37c3ebfd520b017cc7694", size = 653724, upload-time = "2026-09-21T09:08:45.257Z" }, + { url = "https://files.pythonhosted.org/packages/25/9d/b9deb52f1e4528ffe44338c5ebab95c32ed79203082da661de50288e130a/watchfiles-1.3.0-cp314-cp314t-win32.whl", hash = "sha256:81c989d7267bfb7b676cd32c83bec97914e396870983cbf493e29415037bff5e", size = 270863, upload-time = "2026-09-21T09:08:46.518Z" }, + { url = "https://files.pythonhosted.org/packages/59/59/8b1881afccbafda06248be4185e28034dd73c80c85e4da24f2cb0c1321eb/watchfiles-1.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d754e049006e81a9be49dc78ba7802081cee426e968cbc63ee19e164fa2d0e39", size = 286879, upload-time = "2026-09-21T09:08:47.874Z" }, + { url = "https://files.pythonhosted.org/packages/46/dd/41c12ae9745d5d72f709333287679d71cbba68ad7678fed872207bba94f4/watchfiles-1.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a5b631db08fd3032db57ec6a92d1777cd60f88803287e4e941a4858c53aab1e0", size = 276924, upload-time = "2026-09-21T09:08:48.976Z" }, +] + +[[package]] +name = "websockets" +version = "17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/89/3f825ab71c242fffb62ea8fe638741c290f62f8d7aadf8125ff897747af3/websockets-17.2.tar.gz", hash = "sha256:36c2fb94c990cc2545143b12690e2de6c16300f9dbe5b4f33fa300cf57dc8792", size = 188355, upload-time = "2026-10-03T14:56:53.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/de/87854af9b38fe4738fd85f7f21c5b49558ae20aec898880894e435f33375/websockets-17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:916ebdfd82e7fc68041d36b2b5f60361b9abce1e087454da15f8bd004839e090", size = 217757, upload-time = "2026-10-03T14:53:23.029Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2e/1e80b5efa41544f626d56bd15ccb53dbfc56bf28bf80ab9cd6f82c4b1d20/websockets-17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3621f3686397708b8eeabfd0a9d75267c1f29a7537d2fe31e65d099e71587fa4", size = 215439, upload-time = "2026-10-03T14:53:24.531Z" }, + { url = "https://files.pythonhosted.org/packages/3b/6e/82c78b595aee05be76a7ee78539323da1593c1848e4fef51c704c696568f/websockets-17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a81e19710d48da88653473b6b9c366d47e99fe4f58e37ce415be47966748f31f", size = 215703, upload-time = "2026-10-03T14:53:26.226Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c4/905ef6aa80423c03dba99e1e26fc0acf63a2a9a6a2d9e8c0e6a63caaf952/websockets-17.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f2731f9067976c8c4127212c0d2f2ada42d497d935e470419e029802365b12bb", size = 225023, upload-time = "2026-10-03T14:53:27.744Z" }, + { url = "https://files.pythonhosted.org/packages/03/c0/a6d8be9c43e4456fb9597fdf8b5e0ce1f0a5df41503acce6d869536e4e23/websockets-17.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6627b913b8586b1c06db9516b31dd0dfbc621de3bb9312616d92a7e44f268a5b", size = 225299, upload-time = "2026-10-03T14:53:29.171Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d4/976d34b5491258b0a86c2ce9b9aabb9fdd68919ffd7fe65999c14a502a98/websockets-17.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0198c4ec6a3406a2f7557c032967de426474c2c995c81076585e09d29a9f407b", size = 226540, upload-time = "2026-10-03T14:53:31.635Z" }, + { url = "https://files.pythonhosted.org/packages/83/2f/c4cfd42f53c697a8ed123fd82b8f85fcd13b6360d47f9f1d1d45d6ec6627/websockets-17.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:88c6a42c2632ff469e84155e44f6ed92cb15ccb047bf5fcb59225ae5a12fd33d", size = 229371, upload-time = "2026-10-03T14:53:33.061Z" }, + { url = "https://files.pythonhosted.org/packages/e7/55/9a221b29c6232ff9282eecb2fc102402cb9e42a3479264db0e5fc4fe6835/websockets-17.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:eb0023e6cdb4b8ece0b33875188dd16104ad8c335361d396a98394f99e30ff7a", size = 227173, upload-time = "2026-10-03T14:53:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/8f/07/125e6d010c56c253d3d2b93cabaea0f96d33898151a16b49066a594acecf/websockets-17.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c1c09d5d4646eb96bda2cfb97493bcea21a0956a981de116e6b1f4a9de07f3fd", size = 225929, upload-time = "2026-10-03T14:53:36.071Z" }, + { url = "https://files.pythonhosted.org/packages/23/a8/aad3bd902aee84e1b261ad6ab83b405e4a564af43101b8ad1dc0293ff4f4/websockets-17.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0360c4dc13ac569cc245e0efa2f4d4b1e4733d24c47b8ab3f3747227b1356348", size = 223167, upload-time = "2026-10-03T14:53:37.528Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f4/ec8ab9be1a5310b4fea829f088c7aa2b7a58b61d34bce1b2a9338635ff12/websockets-17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76693a16dead737946b651375ee3109d7db7ad9569a1c55c60aaed3ef85cfcc6", size = 225974, upload-time = "2026-10-03T14:53:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/65/45/ba6503f8257d3f98b0f07ebaad0fd099c9023eae744fd5b775416743597e/websockets-17.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:77a42cc507993ec5471b5283f7eef869239173b6000031543e3938a86d1af0fd", size = 224581, upload-time = "2026-10-03T14:53:40.496Z" }, + { url = "https://files.pythonhosted.org/packages/d0/45/05cca59a876c6776727d96fc7ba59e0b6f9aa496afbf13e7e04ad0b63678/websockets-17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3bbc5543e39ee025d524077c5c15c2d67bc11c9f6676afe5b531839e24d701f6", size = 225347, upload-time = "2026-10-03T14:53:42.061Z" }, + { url = "https://files.pythonhosted.org/packages/1c/00/cf0e43292ae949b13f67535be84317102891d69fd1986ec2bf2ead42747b/websockets-17.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8da58558bfb0ca6ccac2419773521f1111e40654038b1afabdfc69c02cb82614", size = 226457, upload-time = "2026-10-03T14:53:43.575Z" }, + { url = "https://files.pythonhosted.org/packages/79/0d/9a5c61a18f0cc9876d94c70ccb3daf7614a9fee56abbb37c0e64e757fb96/websockets-17.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:01420cb1cb47433e8e7075d32cb8017ad3ffed0654bd1e48c0251b865920dec3", size = 224011, upload-time = "2026-10-03T14:53:45.077Z" }, + { url = "https://files.pythonhosted.org/packages/34/ed/991c1ab80ab2ce40e1c939fef6fa8f971c3ef3b21caf988a7a107e0ad27d/websockets-17.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c49c9edd47d0e44d360299e2d8865e2950d2fcf1b4098782c9d7dcd070919e5a", size = 224990, upload-time = "2026-10-03T14:53:46.8Z" }, + { url = "https://files.pythonhosted.org/packages/e7/7a/363c835d17923e967fb66376188e67b9a261c85d826a0cd5e4dd3471221d/websockets-17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96f6c8d0fe21930d1f982bfce2382789d2e8d005d2ab63d21280660f95ef8fe1", size = 225265, upload-time = "2026-10-03T14:53:48.382Z" }, + { url = "https://files.pythonhosted.org/packages/c8/90/6c51f6d78636bd1cd6781fae8ea5ea7bf1d5b4059354f3c1f5f8de793338/websockets-17.2-cp312-cp312-win32.whl", hash = "sha256:b25659ab2d655d742701487d5591e3f98e8f8b329fc999e05e3d59691ab344a1", size = 218228, upload-time = "2026-10-03T14:53:49.867Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/90008411c652dcfae34345a2169f4becd066a4ba71eebfa8dd801e0445e1/websockets-17.2-cp312-cp312-win_amd64.whl", hash = "sha256:faa763b677e96f1beccc6b4d7e8c079dfeed2f249f57a19debc321b519ee64ec", size = 218528, upload-time = "2026-10-03T14:53:51.486Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a1/b8ad6c17f8e75ba2215422fffe0d7f0c4b690dcff1c47c0473db0d253d51/websockets-17.2-cp312-cp312-win_arm64.whl", hash = "sha256:63499fc49efe48bccc2fca40723bc7adb198866cbe159093dd979905316994b6", size = 218457, upload-time = "2026-10-03T14:53:52.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/54/a935a32dbc2e7365b1b59eb74b5ab7515456f02370fdca4c4efc3574e96f/websockets-17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b24b83fbb34b2d8de06cf0f0d4bd7737344ef854482a614826d4356c0c3f0c12", size = 217752, upload-time = "2026-10-03T14:53:54.59Z" }, + { url = "https://files.pythonhosted.org/packages/cd/95/cb8881851abe2662730e6c61cc521b4c96513fdf9103a44f169afce2eba8/websockets-17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8a829db795e3f87053904493d184b185c8eb1f497c852f434168ec856aa6f997", size = 215436, upload-time = "2026-10-03T14:53:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1e/621bb93f35ab7d337be98f1958294437527e2a1797089b5e734ddc5eec5f/websockets-17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf8811d285acc91216368df7fb55cc8c9bf6fcd90eea42429c7186c7385a12b9", size = 215690, upload-time = "2026-10-03T14:53:57.587Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/49d0c983c082676d5d413b28e6ba5ae1d174c00268467bf78d9fe986a2d2/websockets-17.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89c4898da776193577279173dcf9860487590611d7320d379435a145881b048d", size = 225080, upload-time = "2026-10-03T14:53:59.081Z" }, + { url = "https://files.pythonhosted.org/packages/04/13/95a45eb410019772002d8f53d81396dad4120f7df39ca9962f86f5d7cd01/websockets-17.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d87091c4347daadbcc0833b65812ff38d7350c67339625d4e4a512cf38e3e8ef", size = 225361, upload-time = "2026-10-03T14:54:00.61Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fe/0f0eda80bb441f54becdaf793eb20ee080926f8d2356388377cf262187e5/websockets-17.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1110fbfd530c447380e6e6db88b7e43ffe33d54178f5b0ff0aaa5a280301e668", size = 226602, upload-time = "2026-10-03T14:54:02.098Z" }, + { url = "https://files.pythonhosted.org/packages/5c/36/067fc09d8e6f154abde7c2f747c52cc442a02c5eb14816f5c39cb9f8bcc6/websockets-17.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:83abd8beab056aa77a116364811f8fc262dffbcc7abea48de0c85ccbfc6f1428", size = 228035, upload-time = "2026-10-03T14:54:03.545Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a2/939bade7a396b4c381aebbf3941969f124d0f98d56753f81cd256f3fc4d6/websockets-17.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:876da8ca5520d65b5d0f2ca6b4e7a00d35bb90ccda35cb2ce3cda4b6c711e84a", size = 227227, upload-time = "2026-10-03T14:54:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/e5/8a/37b1033e21709dd7fa39239ea4d9cd7f348ad5bcba94eb47253878576f8a/websockets-17.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8462395df8f224d2daa3d80db3ae4450d9d4b7243c8483ac79a82862f1599dd6", size = 225985, upload-time = "2026-10-03T14:54:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3a/0d89539900b06d86366facb7558198046de125ab8c371d9248d6262da70d/websockets-17.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6e9a04e69456015e6ae5e0d486d995137fd435794442122b00ce5f9526ea3ba8", size = 223226, upload-time = "2026-10-03T14:54:08.583Z" }, + { url = "https://files.pythonhosted.org/packages/31/9a/bfc5633e3d538d0a71cfbe7a5fee56c712e16c2dbd0ce17c83196a2a96a9/websockets-17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a2321bcb73758c44c8076509024d02c15ee484fe77ce04edea4bf4d257492cc", size = 226042, upload-time = "2026-10-03T14:54:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/cbaf1786d8e3aeafe9d76951fc01139ec353b92555580336f23669382a55/websockets-17.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8be4a87b3baca380ec3c7b1643b2dd268ac9d42c5097c0e8dc9a49342faf4774", size = 224639, upload-time = "2026-10-03T14:54:11.911Z" }, + { url = "https://files.pythonhosted.org/packages/80/49/175faa5bd169486f835602ac0ae6303318aa65693b79cdc72c5ee53b148d/websockets-17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:eb7b737ce8d18c8a08beb68f751572b7bf6a18093ecd1406ca1256b50592552e", size = 225407, upload-time = "2026-10-03T14:54:13.489Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d1/3662f612456cfb2dcc128c8e596f0a55fb7b695025e2ebe8ba2abb355c3b/websockets-17.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d6605630c2808b33f362d6d08582e79821f77ed2bd3f49f9d467ea70defea06d", size = 226513, upload-time = "2026-10-03T14:54:15.046Z" }, + { url = "https://files.pythonhosted.org/packages/73/6b/07af5177a49e30156b0922556fa93624a920a2b17d3e63bf4ad94668112c/websockets-17.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:dd9252828073fd0d69e7667af4275a1b17c18d0833b1ab7f59db272f194a6b9a", size = 224072, upload-time = "2026-10-03T14:54:16.574Z" }, + { url = "https://files.pythonhosted.org/packages/eb/34/d18054ff4d8314524164f8b8efec2cb17627287e099f122c28ed6fa598e0/websockets-17.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:06c7386128a9d85de4e1960114604f3031c084d2f4eee8db382637f1634cbab1", size = 225022, upload-time = "2026-10-03T14:54:18.143Z" }, + { url = "https://files.pythonhosted.org/packages/e9/12/75433caa3e9fa3e51d7751dc6bad24a86addf76cbfb51e52b11d037ba7fd/websockets-17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:98f2d03df74977fd252831c997c388cd6c3f691a8a9d022b266d3cbd9849838f", size = 225303, upload-time = "2026-10-03T14:54:19.679Z" }, + { url = "https://files.pythonhosted.org/packages/6f/de/23e21c002aa2786ac9807c0876faa3b2576493b29ca3386287b0db46f021/websockets-17.2-cp313-cp313-win32.whl", hash = "sha256:5b43a1f7e4853ce08c3f6d3bf69799ee5b46548bfb71792a8158f7e45d66b547", size = 218219, upload-time = "2026-10-03T14:54:21.232Z" }, + { url = "https://files.pythonhosted.org/packages/13/eb/960411c0c574535d629c16e96a2b4e5353dbe4109df8ecea859e1b5245ee/websockets-17.2-cp313-cp313-win_amd64.whl", hash = "sha256:27c7a59b5352a8f741b422820adfe89dfe47c8f2d84fb32111e76111edaa0e83", size = 218531, upload-time = "2026-10-03T14:54:23.025Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/3ac07bb52378952eff1d52d04a7ee6e82ce84e3da319a52a4739cd9c78f5/websockets-17.2-cp313-cp313-win_arm64.whl", hash = "sha256:533b7c82bb1eafbeb921dfe131c9f88e55451ddc328d84bde1c9340ba72d2808", size = 218466, upload-time = "2026-10-03T14:54:24.857Z" }, + { url = "https://files.pythonhosted.org/packages/8b/74/6bc991a28ac983600e65de408ebd1b1413d554ed0468ae5c831bc52dded6/websockets-17.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ecb748910e9ba4624ebe2057791df51dcbffb48c37108ab94a3c593472023c9e", size = 217791, upload-time = "2026-10-03T14:54:26.381Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2f/158e99426be6e71d09520bae53f29294fbb614b2fc5fbf8867b1d08395a7/websockets-17.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2ab9af5cb7265899e659f079eb71691375a1025b6d5fbd3caa495dd08f70833a", size = 215486, upload-time = "2026-10-03T14:54:27.962Z" }, + { url = "https://files.pythonhosted.org/packages/5c/09/1abf942723c0001d9c2fca1551907dade6304517b982b0bf10bba107fa81/websockets-17.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:06e46da092bca3a52e98f0458c66b247993ce501a07cd09c858be3296511ab7d", size = 215699, upload-time = "2026-10-03T14:54:29.523Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/1ade03963ef497c47e6bad79e24370827b2fe6145fa8f58070ff2b7dcbac/websockets-17.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fcce735ffd72ac4056db05325d9f0232382b74826f0196eb6a15ca903abdaa0f", size = 225081, upload-time = "2026-10-03T14:54:31.278Z" }, + { url = "https://files.pythonhosted.org/packages/9f/fd/47b8a0361c49da939b976a07b27a72a9f893d01dfcf4d2a28b53419ce1ef/websockets-17.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:42cbca10f82a8b2fb1536e8a0830ca6ceeb6bb3d8d64b766e0795369135654a8", size = 225430, upload-time = "2026-10-03T14:54:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/f0/26/f4d4c76264ee037c5556ab5f50fcba302746dabf7528955534e4dda9965e/websockets-17.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63ff5a21f26bd0e6a8464b53fadbe174825c8718ac14180df45665eaacdb6af", size = 226676, upload-time = "2026-10-03T14:54:34.833Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/c8b1c981322a050c4babfd327ffc9880f9c3834f5b15d2574e37eeb8768c/websockets-17.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:63f543463601c1558b755f8dd7618b6ec3dd0934dda051d3b7030d8c76e54de2", size = 228048, upload-time = "2026-10-03T14:54:36.424Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5a/1cb29ddb23e6bc27ffd1c5316cd3616360d1ba0c3854eaa134ee3207bd28/websockets-17.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4c32eb565ad9ce8a6444248e5b7a19dbb86a81c811fe5fcc2fba7a735aed5163", size = 227281, upload-time = "2026-10-03T14:54:38.01Z" }, + { url = "https://files.pythonhosted.org/packages/ba/64/135274572dc0c845fc1111e2b932c807c395daac75d6eae6cfa148d8a208/websockets-17.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d459bbb6c22f26dcebea56924a362aba50d453b9867912862c970434fcf0d94", size = 226025, upload-time = "2026-10-03T14:54:39.613Z" }, + { url = "https://files.pythonhosted.org/packages/58/75/f1e386aec3124489411caf5138cdd5a2bc43d3fd4a681c69adcf5f6272a5/websockets-17.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f19ca1a21871f024e38faf4107b433047df27558dff1b72a1dac31481e2c1fe5", size = 223277, upload-time = "2026-10-03T14:54:41.165Z" }, + { url = "https://files.pythonhosted.org/packages/60/eb/24733a0f568c2eb99e60f9faa620a98fb228c06a01e7e2f348b33290ed9c/websockets-17.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c76b4bcbf0f713194591673fc86a42820e14da6bbd1bb445d3d002cc4d1e4521", size = 226148, upload-time = "2026-10-03T14:54:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/55/6d/ea66a30af74f5983cae31ebb9ef78b178b366a12856a414e1472225c4a34/websockets-17.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:30201a7f69833b015556c72feb69ea501b645986fd0b90dab13f589e995ff428", size = 224615, upload-time = "2026-10-03T14:54:44.41Z" }, + { url = "https://files.pythonhosted.org/packages/87/80/c6f2228ad89774429d270179375ebddb657119215f52d1df7c680d65cad7/websockets-17.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0c8600aec354cc259f1691b0b42816f04a9886a953f82cb227246df76057f97a", size = 225398, upload-time = "2026-10-03T14:54:46.063Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4a/3d8da19732ad468d4be7f1e3ac298078b60bdda55edde6589bef84a5eb7e/websockets-17.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:307fc22ea496be8542d67b82ae8c867a978dfd19ac35573d4f15943fd9277dfe", size = 226571, upload-time = "2026-10-03T14:54:47.672Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/1231657122d9cc24791bb90af13cc2f4e84cf0d3a454cb37e3abfdcb2fd9/websockets-17.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:9c88697fa943bd4ef67cc919a17d81de6581846f52bfa8c6f64a916098986556", size = 224125, upload-time = "2026-10-03T14:54:49.537Z" }, + { url = "https://files.pythonhosted.org/packages/1a/04/350ca2445da758bc42cdb4218b44d4ce0d5a9c1d5e4cc4a58d64348ad9da/websockets-17.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7eac84d4969da82166d5e90d9c38d2f416fe24f9708a7013569b193745b9a31", size = 225081, upload-time = "2026-10-03T14:54:51.075Z" }, + { url = "https://files.pythonhosted.org/packages/da/c4/dec952b0df3a5d918ed2a545abb0c25ae519c3bc2d9aba3b7c46abae8f05/websockets-17.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:313f6703023d53baabab6d6c5c37cf637b2c4fee255acf2ed5e92ad69e28f1b7", size = 225376, upload-time = "2026-10-03T14:54:52.675Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b4/198a260afbcc086ff4979774e51834ed7fb5b95f9ef305e0c4924630b857/websockets-17.2-cp314-cp314-win32.whl", hash = "sha256:08d90cf344bdb971ba3a826b78d4da9bfd56cc6a97a604d9b88cbd40bfa6c735", size = 217760, upload-time = "2026-10-03T14:54:54.247Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9e/0523f8bc2f7aaddf39562d4fa01b4d38fa61b23d980917a16d2dd19c8dac/websockets-17.2-cp314-cp314-win_amd64.whl", hash = "sha256:dac93bf7a9beb215be3282b8441173cd50806c41c007b8be9bb24e03c60ad563", size = 218104, upload-time = "2026-10-03T14:54:55.845Z" }, + { url = "https://files.pythonhosted.org/packages/55/17/7b8bb4cb64a199e7082f1f9be784d657842fefc327ac777d6c1493504804/websockets-17.2-cp314-cp314-win_arm64.whl", hash = "sha256:2ab742249f953d148a9ba696c8b9944361e8cb92e8bc61ba2dd53a178403afd3", size = 217989, upload-time = "2026-10-03T14:54:57.376Z" }, + { url = "https://files.pythonhosted.org/packages/ee/76/f54ed054b6e860f1e0bbc7019542a048352d41231fdff6d904b379f881c7/websockets-17.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a69ce25be5f1330ee1c74eb6fabbbceaa96b384beedd2627cecded7546490c40", size = 218125, upload-time = "2026-10-03T14:54:58.943Z" }, + { url = "https://files.pythonhosted.org/packages/e6/4c/0f3375cea66a125ae01d21fb9c537aae955ef499bfe7e2b2376a34362f2a/websockets-17.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8e24b878cf54843a63985d90480f163ca7f692689fbcbe9cdbd8165521083a8b", size = 215658, upload-time = "2026-10-03T14:55:00.674Z" }, + { url = "https://files.pythonhosted.org/packages/0c/05/7c871a67bfb4b61adc1fe13583db97803f87dfeca644fe6ef51df7bb276d/websockets-17.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f33c7908a6885dcae9f462a4a8347b637053b4ff2b96beb4c23fba1cf7818e5f", size = 215858, upload-time = "2026-10-03T14:55:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/41/8e/59df4d9cd357e902d1c74b13c3c0c3841c8df6e4b1b3d131bf26a23fdcb1/websockets-17.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c796a1bb3e4015249639849f30e8e680df8a431b45d417ba8acf843d2451d95f", size = 225443, upload-time = "2026-10-03T14:55:03.966Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/5e486a3a44e041203c62eccf1fc89c7f8824e21104a7b82b182e5b21c228/websockets-17.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:983bcdc898662f6ba9d6a025c30d29946ff0986d9ad60d400af0da3671f7cbf3", size = 225726, upload-time = "2026-10-03T14:55:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/f0/98/b6eb53121c91fbe8b6897aba06861ce60f9ab58faffc6bca5750cbc21681/websockets-17.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35e0f088ddfd9d9bc5019e27ff3767411779e92b59db5bb1507f2731a5b61158", size = 226895, upload-time = "2026-10-03T14:55:07.626Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/8c091321b99c91eb3eaec9acbd940e69308b4e465b5605c430af0cf7d3a5/websockets-17.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:19e2511412ad3393191de652513bc7a0ca3c93af143b32d96d46e59fbbddf1d4", size = 229040, upload-time = "2026-10-03T14:55:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/1a/96/3a92f944305b7de42fcb7530b9fa69607b4b4ce993c36a9f2330dbc318ba/websockets-17.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb5e2bf969ac99a6ae3c71208a5eb05cfde973192540ffa6e1068b57fb78c4f8", size = 227469, upload-time = "2026-10-03T14:55:10.935Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a9/624f6d75ba326c22d03698b34c0ada984f1d76196322a62f6c22903b831d/websockets-17.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:691780fca2be3dec512cb603cb91060271968cb4af86b51d07c57445c5754a37", size = 226202, upload-time = "2026-10-03T14:55:12.536Z" }, + { url = "https://files.pythonhosted.org/packages/47/af/1e6e8c625aeb268830af2c4227fe05e8db59f4f4debe1dadfd0ada214895/websockets-17.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2d39c19b1ba6a6791050383fd69efdd3b63533e2254693d0263879cd5f5921ba", size = 223743, upload-time = "2026-10-03T14:55:14.164Z" }, + { url = "https://files.pythonhosted.org/packages/dd/81/33c5280f4f6f81637c93ae065c6a594dfe35935622af135a5f7c3768bf22/websockets-17.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e48ac2b302986c6f55cf61e8e36b4dd97d0132c5078a713a697a940934ba422e", size = 226492, upload-time = "2026-10-03T14:55:15.796Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f3/7aa9fc36e67caccbcfee2c48f4ada41e9da512d41523c024d039f0f22ba3/websockets-17.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e136197f1262620ef2e507afc3ea759c1ae7d221886da20eec5f4c9f2618c2aa", size = 224940, upload-time = "2026-10-03T14:55:17.661Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/457aff7081a63d1261608bb4d7b0b0f9dfe780697a2a334671745742850b/websockets-17.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3eb44019a2b0b3b91bac95998f1e4e5589730421170e060fe654a2b7be727dc7", size = 225835, upload-time = "2026-10-03T14:55:19.607Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c3/7a13a3b3050db2c36772ded49f8d48f99eb080948e9f6f762e7529925ab5/websockets-17.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e5855e574804398859c5fbaf4fc7882b96278b7f6572a3d889627e6eb6cfca59", size = 226848, upload-time = "2026-10-03T14:55:21.274Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3e/d5b2c1e473b1031a4a0ec0e10de69df5b981ab4a10aa482bb45c18dd43f5/websockets-17.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5dc29815520c329f5662f6eb3ebadecf0d4f8c82dfa416d4d6efbf8f39245559", size = 224541, upload-time = "2026-10-03T14:55:22.874Z" }, + { url = "https://files.pythonhosted.org/packages/79/5d/bb81976cc1aa546afb51395ce42913521e9dea062bb34a61308cfff30726/websockets-17.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d1a4f9462da6496b6cb79bbb09c60d17f7e63e8a1df136797b3afabec9560e4d", size = 225315, upload-time = "2026-10-03T14:55:24.443Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/314962d5440c61b4c107914599c13ceeecc6bdb6e2e73a5f7e566a7d1f26/websockets-17.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9496bff5541086478264678bac73c0a75b2fde94fdf6568893bca1f7c6d50d18", size = 225747, upload-time = "2026-10-03T14:55:26.033Z" }, + { url = "https://files.pythonhosted.org/packages/98/fc/9eb64b34a3a4458eb08f3f24bde01508f72a00790330723c158ebb965048/websockets-17.2-cp314-cp314t-win32.whl", hash = "sha256:e1e3bc8090a7eae79fdf634b63bdbfa3c93999991023c37c6fd3b469fc8ff5dc", size = 217891, upload-time = "2026-10-03T14:55:27.681Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/3a4e2a09b0822d6e525cbc6e44a4885669bad5b22ab9c64fa2444bc15325/websockets-17.2-cp314-cp314t-win_amd64.whl", hash = "sha256:65a89a5bde227bfe908016f35b5bd347970cd1e5b0360f389502eba1c7fde6e0", size = 218229, upload-time = "2026-10-03T14:55:29.314Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/cffb75ee746dd060984c3c3e2eac7f875a866225a30dfa53e2cd18232565/websockets-17.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1c27339934109dfaca83f18ab2c23db06714e9d5deca2c8e37e8f492ab90d20b", size = 218146, upload-time = "2026-10-03T14:55:31.001Z" }, + { url = "https://files.pythonhosted.org/packages/12/e9/10a9b1633b63594054c87b97af048628cea2b21b5089a52a9fc1e0af60a3/websockets-17.2-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:a7c4bb26de6ef496d24822aee4f6a305d97cd33d21a2b85f290292d69ba1c25e", size = 217719, upload-time = "2026-10-03T14:55:32.674Z" }, + { url = "https://files.pythonhosted.org/packages/0c/00/ff4020fe0886dac7199a16ce2805c7afd7b981bd2e81d3fa18dff5d9863a/websockets-17.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:c08da1f15040bd1e1a6074bd4518a6ef20e67b1594ecfb0aa75e5b45f87e6d6d", size = 215448, upload-time = "2026-10-03T14:55:34.338Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/bc7b944f81514378b2c2ab96c17df19e871cd33b9be0f1f6dfc975457e5e/websockets-17.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:3117abfd32b183bdb6194df9317766d32c6517f3d1c0aa8c62d5c6ccfda0b4a8", size = 215674, upload-time = "2026-10-03T14:55:35.918Z" }, + { url = "https://files.pythonhosted.org/packages/a8/da/2b2b76faa2f10c4813e3872c9577fd13a798f5918b1785b86ff7d635eb2a/websockets-17.2-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a046227daa7f191e843d26b911c1146233e9a33d249e0c954dcb3ac7c398710e", size = 225119, upload-time = "2026-10-03T14:55:37.777Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d4/22cbe288c0d5cef7620503be92c0098d82220353fc7e188034a19c517240/websockets-17.2-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2901bdf24f20bc884124b3e88c61f7ece260c20c81e610f2196007395264a4aa", size = 225549, upload-time = "2026-10-03T14:55:39.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0a/504b0d3063679f2c60430c3539482d42a4cb8bd1a76646baf742030a93cc/websockets-17.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f60e39adfecf998488166aca8ff24ab1ac406c9ecbecbcf9b3bcfc43cb1ec9a1", size = 226717, upload-time = "2026-10-03T14:55:40.942Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ea/5da9309cc55c2665a6eebc22c369d9918c0d77258c61e92058e6b08d5ff1/websockets-17.2-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d4df62fd8448a85c752bbea1803cb3a2785e6fc8352009ab64ad7447af079b3c", size = 228413, upload-time = "2026-10-03T14:55:42.54Z" }, + { url = "https://files.pythonhosted.org/packages/a6/74/5a24df72aa5500f311105687af864c27f1f9da910e968e97818c6149e6b0/websockets-17.2-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8eea55fdfa9ba65c6981eea38bd20c800bce2f092a2803d82de764ecf0f071a", size = 227196, upload-time = "2026-10-03T14:55:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ee/ca32cc1ed892dc4ac30a922e8f648048233fbdb8b0bce7048860ec4c60ec/websockets-17.2-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3f0def1279644acaa9bc861d4234af3f82ea9cee7e460dffac5cb63e691501e9", size = 226092, upload-time = "2026-10-03T14:55:45.842Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/12d4a73324aa9798d5165d20c088f9dba66c75c871960e5d921ec66694e4/websockets-17.2-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fb78fb4158c12f77a934a003006784108a27a6553cfc0c6f10483c9c02e94f48", size = 223486, upload-time = "2026-10-03T14:55:47.45Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a4/7fe15da5abb8f0f61e6a357593f7f2ed55724825b7db0ffe72b5c5fad68d/websockets-17.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:f8969ad228115ad8869b5fed801f899e52ab8ad376fdb165ba4760a277c8258a", size = 226200, upload-time = "2026-10-03T14:55:49.126Z" }, + { url = "https://files.pythonhosted.org/packages/08/b9/4cd3a311f96a2eea0ed458bc01fe2cce42f9cd50aa9e64315dfc855d63a9/websockets-17.2-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:4a49ca342efc0800e6ae94ed5c9cbdcb319308f75e73c21181e4c24d6710e8dd", size = 224862, upload-time = "2026-10-03T14:55:50.674Z" }, + { url = "https://files.pythonhosted.org/packages/41/b5/22caa3460f75e42bfcc74028870b556d22847ea9a9034aa03986f07f16a9/websockets-17.2-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:06fa3ce9c3154826c33d4395b225b2994aa64f1f3bcd8be8ed932019175d9268", size = 225391, upload-time = "2026-10-03T14:55:52.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/be/8d28f92092076abf1ddfb3206b0ce956120a22e7c3105f6a3029d727deae/websockets-17.2-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:50644d8715be7e0ec0682f9d7744b63008e199c5e1618a48fa153756a332235f", size = 226545, upload-time = "2026-10-03T14:55:54.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/ff943fa383e540fe17f066cc10a3eeedef26e50fd45aae2bdc6746d6f95a/websockets-17.2-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:60deca33e584c09e91f70f8b55a0b1de7d671d6a63f051d154920f48bed717c7", size = 224352, upload-time = "2026-10-03T14:55:55.856Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/1e6c3e06c473c9fd833a5c1620b15e2c3b37647b91b7d41871d20bc098de/websockets-17.2-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:b5f79366a8d8dbb981d53ba800bb54a95454595ab8a4548c2b95501b32a08326", size = 225255, upload-time = "2026-10-03T14:55:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/f8/d8a4f988f7cbb568d8bd69da4632c5b6010aa9cd9366f285e23b73b678d9/websockets-17.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:f2bbf3f28d0b63157577c8b774b9136f076afa6797e1a52a2ecd477f23cad3a8", size = 225513, upload-time = "2026-10-03T14:55:59.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e0/920357165b2797a2530fc9e271d79a9b5fee2b750b154c990c740f767af3/websockets-17.2-cp315-cp315-win32.whl", hash = "sha256:74836317b7010b579522bb52426f1e225608b042c9e78cbe2493522bebb8a318", size = 217722, upload-time = "2026-10-03T14:56:01.307Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/25bdca25bbc329ffb330ef33993397d6556a871e40a0d196e757699ea3f7/websockets-17.2-cp315-cp315-win_amd64.whl", hash = "sha256:aaead3d926e9ab4124ada727d20cd62d396649917822df4f771d1f07f1079b40", size = 218017, upload-time = "2026-10-03T14:56:02.914Z" }, + { url = "https://files.pythonhosted.org/packages/fa/cb/ea30a552bbcd1c75f0d14bfce6c884ee36187030b85b74a242aacc02406e/websockets-17.2-cp315-cp315-win_arm64.whl", hash = "sha256:40960554e60eb60c3eec4ff9e42a80f84f8cd3ca9bc80a5481a61f1e64d807c9", size = 217929, upload-time = "2026-10-03T14:56:04.604Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/477664c619af8aa3c908d482e2a95e13ceed9d78f21d15902013c3bc6c28/websockets-17.2-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:9a2a60a7f0ea5f239efb6391d2b28630a640d82dad63e3bee47cf2c623c4495d", size = 218029, upload-time = "2026-10-03T14:56:06.336Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a9/b0be62ff1c0e2bc966da56b36d3d820c7e2ad3c0c4a4ac414fc7335b214f/websockets-17.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:cca2fcb72c007103740fa4fc3df19fdb1a318c641c69f3b0cc47ed63a889336e", size = 215607, upload-time = "2026-10-03T14:56:08.035Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2b/a6738530de0437a31c1b168e4096ecf790aafaf561f33a009886c7d8042e/websockets-17.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:b789356bc4e2e6c20ba52817f92c3fed74e24657654237ecd536c54843b80c6c", size = 215817, upload-time = "2026-10-03T14:56:09.852Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/2fc44ddc419cbb09ee1708af3e78d8a4b018db01fc7e4f91bd730e2f8d9e/websockets-17.2-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:222fb626fa15701a850eccc778be17312142b2f6a0e16aea80770b7459adb784", size = 225979, upload-time = "2026-10-03T14:56:11.85Z" }, + { url = "https://files.pythonhosted.org/packages/2e/91/a215b14caa7ea65bc36db81609108899c259503300d1560dae9c70a135e7/websockets-17.2-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4497e87c34a2d21cbec1227858fec3af8e514dd70c47625557a122fcebc081dc", size = 226250, upload-time = "2026-10-03T14:56:13.548Z" }, + { url = "https://files.pythonhosted.org/packages/65/b9/9406a18e9edf558ed504d2a7679371d0f8107e4ef526c80b154ea4ec9752/websockets-17.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6281c171557ce0e408e19d9a223f22d915117ac38a5a7f32ed83809e7492316c", size = 227579, upload-time = "2026-10-03T14:56:15.143Z" }, + { url = "https://files.pythonhosted.org/packages/fe/45/a73af119244f46f5130005d7ab63f1c75890c890141a0ca2adc9d97d4671/websockets-17.2-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:08d97098644728bd1895caa7ecf3090b8e563d70809870d2adb33a107bd061d0", size = 229205, upload-time = "2026-10-03T14:56:17.086Z" }, + { url = "https://files.pythonhosted.org/packages/c1/92/ccd8e2e921d134a56f1ed4642d276500d9e33b3dc4d6deb63d614b3e53a6/websockets-17.2-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1fdb8d5a1660307dc6d36d0b7fc725213cbd7f80800904dc4896aa3208b89121", size = 228011, upload-time = "2026-10-03T14:56:18.716Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ef/7d71105d19a7aaab5ff87b9c712f6c1dda44e72ea56aa0e7b777f2fc274b/websockets-17.2-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:18b0a46e5e9b315e2b54ce8c3bafdeef0e1388ca363114fa868e6aab2dc58512", size = 226892, upload-time = "2026-10-03T14:56:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/56/f7/87012d628b21e66e699440f39bfa7cc55fae7f52b2c532ab62184a589624/websockets-17.2-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f115d5d804a2163dd89245710049078b0e726a58c1f44a1f86c2c6e79055d76", size = 224241, upload-time = "2026-10-03T14:56:22.257Z" }, + { url = "https://files.pythonhosted.org/packages/55/f5/495371068b27ee5f7c435187f9dafd62402f195e2c76063bdd4653da1565/websockets-17.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:1d829946a2e7630f92f9d7b45b62f3abe9f393cc2dea6a35edb3988f865e75f2", size = 227076, upload-time = "2026-10-03T14:56:23.909Z" }, + { url = "https://files.pythonhosted.org/packages/18/18/3dce3cc6099be5e044e0fd5d0e0c9931c8e3387511cdec8014a345f619e5/websockets-17.2-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:6c274fc1572edf7c197094a0eb1887d45fdc95254bc80597dc7599550486c06a", size = 225727, upload-time = "2026-10-03T14:56:25.689Z" }, + { url = "https://files.pythonhosted.org/packages/47/30/57d0c7aaf8d4473926fa8829b8136483f561388d1e747ae71c9f2a83d5fd/websockets-17.2-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:4173a4b8a025ae44313d9d9b4ecf31e886c7b7faf45386d51a8ca4ff2dcf3f2a", size = 226225, upload-time = "2026-10-03T14:56:27.246Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9f/9dce1203756756c00b407b9a6b13a7500fcd38f2634d4daa3f65575814ec/websockets-17.2-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:d8cfe9522ad69b6abb26b413ed1deca43cb915cefc588433d557cb3ae1c783e2", size = 227333, upload-time = "2026-10-03T14:56:28.811Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2f/d3b6b876678ebb03017b7afd7111fe44d54b93f036a80ebb4b481dd1ab74/websockets-17.2-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:908d81d88bb16141613a6275059b5114656d5c2f0b5400b421d54fe6f1943507", size = 225082, upload-time = "2026-10-03T14:56:30.578Z" }, + { url = "https://files.pythonhosted.org/packages/32/b0/a69b573a5e56d2e7a5dcbb447466f442380cf81515e1cb1220cd626c8042/websockets-17.2-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:c6590e1eb624ff6b15b872421bc9a10bc6d2057635d69c6cd244ac3f928f85c6", size = 225945, upload-time = "2026-10-03T14:56:32.32Z" }, + { url = "https://files.pythonhosted.org/packages/70/be/a72911dc8e33f74c196012366ce4d99b1a803894a377a1ed0c8e66df9caa/websockets-17.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:61040f6f7da5a279d2f77496c69d51132aba75f701c52bded400d4c639277b18", size = 226241, upload-time = "2026-10-03T14:56:34.142Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a9/02a68c1d8e5572918e0962d3aad881078f73ede43abd9b1336e4efaa8909/websockets-17.2-cp315-cp315t-win32.whl", hash = "sha256:f90bad2839c185a1edf8ee22a257cfc8a39e0e337a0490ab185dfa76ef04d1bd", size = 217847, upload-time = "2026-10-03T14:56:36.204Z" }, + { url = "https://files.pythonhosted.org/packages/2b/bf/3d7c33b8d5e7712a60e0149c017ed50394ec5e8cf72e5cb6a1ffaf11a42d/websockets-17.2-cp315-cp315t-win_amd64.whl", hash = "sha256:315551f4ccedbbf9fd4f7e8bf037a5948c976ade0e919ba5d8f581d465f6f725", size = 218169, upload-time = "2026-10-03T14:56:37.79Z" }, + { url = "https://files.pythonhosted.org/packages/27/57/ab34cc6460c5322e6932750fa5c6c64be89e6ee4e2707d13c4e9d3312b25/websockets-17.2-cp315-cp315t-win_arm64.whl", hash = "sha256:0a6220bdf8d5f11af71251a599092d89ac1d6bfac691c7f5951c5b07953947a0", size = 218089, upload-time = "2026-10-03T14:56:39.427Z" }, + { url = "https://files.pythonhosted.org/packages/8a/58/835cd51934d6780fa586f275b5d9901eead6d81569b4343b3767cdbaae4c/websockets-17.2-py3-none-any.whl", hash = "sha256:6aa59f0ef92e796b2db6f5f26550c4713c0e4036899fadf02f55e2ed4db0b7ae", size = 211883, upload-time = "2026-10-03T14:56:51.898Z" }, +] diff --git a/projects/mila/AGENTS.md b/projects/mila/AGENTS.md new file mode 100644 index 0000000..a1ff2e3 --- /dev/null +++ b/projects/mila/AGENTS.md @@ -0,0 +1,9 @@ +# AGENTS.md — Mila Tracking App + +## Development +```bash +cd projects/mila +npm install +npm run dev +npm run build +``` diff --git a/projects/mila/Dockerfile b/projects/mila/Dockerfile new file mode 100644 index 0000000..e0562cb --- /dev/null +++ b/projects/mila/Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine AS build +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist/ /usr/share/nginx/html/ +RUN mkdir -p /usr/share/nginx/html/tracking && ln -s /usr/share/nginx/html /usr/share/nginx/html/tracking/mila +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/projects/mila/README.md b/projects/mila/README.md new file mode 100644 index 0000000..0d1700f --- /dev/null +++ b/projects/mila/README.md @@ -0,0 +1,13 @@ +# Mila Tracking App + +Mobile-first PWA dashboard for baby sleep, feeding, diaper changes, and WHO growth milestones. +Built with Vue 3 (Composition API), Vite, TypeScript, and Tailwind CSS. + +## Features +- **Live State & Timers**: Active sleep duration or wake window updated in real time. +- **Sleep & Routine Tracking**: Today's naps and night sleep with running indicators. +- **Nutritional Logging**: Bottles (ml, Pre/Muttermilch) and solids (Brei g, kcal). +- **Diapers**: Instant 1-tap logging for wet and dirty changes. +- **WHO Growth Standards**: Automatic LMS percentile and z-score calculations (Girls 0-24 Months). +- **Git Sync Awareness**: Real-time warning banner if git background sync reports merge conflicts. +- **Backend**: Backed by FastAPI DuckDB backend at `/duckdb-api/v1`. diff --git a/projects/mila/index.html b/projects/mila/index.html new file mode 100644 index 0000000..4ab35cd --- /dev/null +++ b/projects/mila/index.html @@ -0,0 +1,37 @@ + + + + + + Mila — Schlaf & Entwicklung + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/projects/mila/nginx.conf b/projects/mila/nginx.conf new file mode 100644 index 0000000..8a38046 --- /dev/null +++ b/projects/mila/nginx.conf @@ -0,0 +1,57 @@ +server { + listen 80; + server_name _; + absolute_redirect off; + port_in_redirect off; + + root /usr/share/nginx/html; + index index.html; + + include /etc/nginx/mime.types; + types { + application/manifest+json webmanifest; + } + + location = / { + return 301 /tracking/mila/; + } + + location = /tracking/mila { + return 301 /tracking/mila/; + } + + location /tracking/mila/ { + try_files $uri $uri/ /tracking/mila/index.html /index.html; + } + + location / { + try_files $uri $uri/ /index.html; + } + + # Service worker + location ~* /sw\.js$ { + default_type application/javascript; + expires -1; + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Service-Worker-Allowed "/tracking/mila/"; + } + + # Webmanifest and manifest.json + location ~* /(?:mila\.webmanifest|manifest\.webmanifest|manifest\.json)$ { + default_type application/manifest+json; + expires -1; + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + } + + # Static assets cache + location ~* \.(?:css|js|jpg|jpeg|gif|png|ico|svg|woff|woff2|ttf)$ { + expires 1y; + add_header Cache-Control "public"; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} + diff --git a/projects/mila/package-lock.json b/projects/mila/package-lock.json new file mode 100644 index 0000000..a980258 --- /dev/null +++ b/projects/mila/package-lock.json @@ -0,0 +1,2251 @@ +{ + "name": "mila-tracking", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mila-tracking", + "version": "1.0.0", + "dependencies": { + "lucide-vue-next": "^0.468.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.9", + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.0.9", + "typescript": "^5.7.2", + "vite": "^6.2.0", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.6.tgz", + "integrity": "sha512-FkO19Fowv/OQeJZPVfdetJaI3/VpbZmBsnmAlR/rQ+b3QwfiGQiOpVegpSRH331kelvHTVw9hXYG3DwjAaRzyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.6.tgz", + "integrity": "sha512-si5/Etm6MphPc2xYHnk455Shls/hoMjTy3mhXge4OPmvCw7TwC4KP4fKokAlKLV4XaQvLvgSHfafPcblLMYYdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.6.tgz", + "integrity": "sha512-PQCl3q7b0BgvVt72i2xrWM6I5KliwwVe4GpWW5QDGyUQawDS9aPZss/aGyFqBmxdRxlE8wDc9CaxiQ5DHRSp/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.6.tgz", + "integrity": "sha512-l9DFl1Itb1YYdSrP1K3U8ih44AOHa/p+Q4WMMDfGvH5qVWp+ajfgS1DlYo4yCRh8wJ2ZJv0Fqccf+ULAmMFjmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.6.tgz", + "integrity": "sha512-bR4GR3205N9+od0+l5Dd9/iZTDpJkIe6d6Ydp2qbcQZJLmKBdYQQRp8gbWpbMt92twKJY66o1vK4NkoKQODIrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.6.tgz", + "integrity": "sha512-XTVNaDzcFl2TeBglvxdGgsCv9JGtAGRAoJENmGBR/XvDH2mA2K0IXc2aMfP0dR8mexSXSKifJ85FixoXX1wfTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.6.tgz", + "integrity": "sha512-qWc6qbc+25ugG9vqPR9P422KJBbVfZ05mjcMggoq8tsfWP+eRfC+/tiDdIlRF5VL2pDVZWN9zAhWsmu7R1+7Dw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.6.tgz", + "integrity": "sha512-V4Nwkp8844X/Xnww3PI1LYS0YPei8XQEVG70R+5MPZGO7AhYoun4hCN7Svs4U3wbQLZbwiz+9xRFhUZZdRl8Ww==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.6.tgz", + "integrity": "sha512-xb72A1aPaaIsp+a88VtRae/ovIEXislbUMyp7b9AQQU7ZkP2m/+ik6DW9TQcJyw5R8/RIailF9zExYwkjR++UA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.6.tgz", + "integrity": "sha512-pbcs1BVBwC43hZkjhjlF8Rx8m5G0KnhLZs9Azy/gqccP6UsNSzJr0hKGIAVPqzAH1O/NdPxxC9GVGb4msQg/aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.6.tgz", + "integrity": "sha512-EKOC8os6Vsg487ZLKUqzLF99Jsmnq6tu7O7mAELakNpcA+8KadktFf/JYdRuHe/DzCUXmN38pUKu4XBcKlqGbQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.6.tgz", + "integrity": "sha512-v/SQ68GnSlr/HyjB79sNXesGDwkOPu9JjbHfmWaymCiM+nZsQ9TstG1KfA4MuEvTr2d3PoY8PhFxj9bt0e32JA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.6.tgz", + "integrity": "sha512-G3pmliMQ7r15zFFNwBlaT/xTdSLi4lfgI7CUrQueyKYheNVhrd8JrWCE6Ll8xf4AA1RZFqq+mNJYntiElsVOyA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.6.tgz", + "integrity": "sha512-XQTB/IPoB/wG6x/wu9uomAt8YH61IAr5iZTubMiad/lu88sotq2ocz9hJd556+Jz2kIkF7ZQZIsUuWE3OWqtcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.6.tgz", + "integrity": "sha512-O5mpokth6+ydMuwiGtY8fIjvOBfH7u6SzmDNmZ3k6GK5C6iEAC2q2ZN/T5L9jYILx0IcCT0KnfMDihQ5yQFSBw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.6.tgz", + "integrity": "sha512-aIFxbAD9v3TvIaEDsKmukjcDg1JS4/tFXw8SHyQQgzOwzWCQ4cyDK7Ju1pQKqUXDFkEu/BZCFDCDATsKhQcB/Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.6.tgz", + "integrity": "sha512-fuNo1UwBc6BxnHDOxxguQL/InhheMN3RJcJMb0b4xP8r5Q3CNCrJbVg0eCIFuJ4e/zAfjR2gYbOfbzO/G7CIyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.6.tgz", + "integrity": "sha512-05v6wFKDKJPZs9xlytVrrRu6IbRuoSvlH9xNwEOafXsKyjBFZPvAcZz2VIAB/M+lblYeKa9iOYC4RDVdfcAAaw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.6.tgz", + "integrity": "sha512-wJXKcdMjvkc/FaavZXNP1yW4i0pfOmhZAIWRSLG2yJ0PB0TWi7dkLErhX0u0vptDcXKKO/m1Y/YTeuyvb2MXwg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.6.tgz", + "integrity": "sha512-cwg7/h0ThvJwy8CBkmACdiHAxRWpbsCmIsjOt+Zzx0hTnIcSUmKYEV03bGg+hD827OnwUsbKh1ZZDW754xWyBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.6.tgz", + "integrity": "sha512-T0RkYIJbdYXJEQFw+tMBO09KDFdgmNxkHsof3wWAABrvnx15Yh8RytmrgYy9+q9cBeBNZF66MMQZC+5nzEz6vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.6.tgz", + "integrity": "sha512-KlfpmF1AAIdAWxt8QQNClbpLFlAUfYOzqIuJ7IXEStMHpFRuH78RG6FjqPb3Rqhh0K89F5npvG+/i3Fjl6IveQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.6.tgz", + "integrity": "sha512-MrTLjd7Jlt9/ZavJZYG61KQv9Iy9bzbY+yXy73Xvwoa2uP66wvDShkyBr5Chz/yrE6lbD/zHMuTmKQVNQqBApg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.6.tgz", + "integrity": "sha512-8fWDH1CkPI8GdBKAxzHDza7UmgficsKo2+MVbvUgOGhB0629w5sHMg3Qu5y7TZsrYKHHWpz8fla4KvoT7WsO3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.6.tgz", + "integrity": "sha512-9/c9PWdr5GCIHkkxiHM1HjNBQMVdftP4O8QTcoUAaRza2FSqJ4axbf8QAnBuE6BIGQDl71SaRPeDdDYid5ecTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.44.tgz", + "integrity": "sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.9", + "@vue/shared": "3.5.44", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.44.tgz", + "integrity": "sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.44.tgz", + "integrity": "sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.9", + "@vue/compiler-core": "3.5.44", + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-ssr": "3.5.44", + "@vue/shared": "3.5.44", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.29", + "source-map-js": "^1.2.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.44.tgz", + "integrity": "sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.44.tgz", + "integrity": "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.44.tgz", + "integrity": "sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.44.tgz", + "integrity": "sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.44", + "@vue/runtime-core": "3.5.44", + "@vue/shared": "3.5.44", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.44.tgz", + "integrity": "sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.44.tgz", + "integrity": "sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-vue-next": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.468.0.tgz", + "integrity": "sha512-quV/6T8YB1XK0VOEnebg3Byd8Rsan5/m95cvjnuHV4vcS3qEnLAybkrSh0hk3ppavx+V7R1PjNW+mGDvcBdz4A==", + "deprecated": "Package deprecated. Please use @lucide/vue instead.", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz", + "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.6.tgz", + "integrity": "sha512-fX1Vy+UNKdXn+xKDnu/HBXbHVr1AY8cSdQj9BU4kLv5aFCMqGpvrVbyUMmjN3DdzWhSAuTbcX8PCNEVaumthYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.64.6", + "@rollup/rollup-android-arm64": "4.64.6", + "@rollup/rollup-darwin-arm64": "4.64.6", + "@rollup/rollup-darwin-x64": "4.64.6", + "@rollup/rollup-freebsd-arm64": "4.64.6", + "@rollup/rollup-freebsd-x64": "4.64.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.64.6", + "@rollup/rollup-linux-arm-musleabihf": "4.64.6", + "@rollup/rollup-linux-arm64-gnu": "4.64.6", + "@rollup/rollup-linux-arm64-musl": "4.64.6", + "@rollup/rollup-linux-loong64-gnu": "4.64.6", + "@rollup/rollup-linux-loong64-musl": "4.64.6", + "@rollup/rollup-linux-ppc64-gnu": "4.64.6", + "@rollup/rollup-linux-ppc64-musl": "4.64.6", + "@rollup/rollup-linux-riscv64-gnu": "4.64.6", + "@rollup/rollup-linux-riscv64-musl": "4.64.6", + "@rollup/rollup-linux-s390x-gnu": "4.64.6", + "@rollup/rollup-linux-x64-gnu": "4.64.6", + "@rollup/rollup-linux-x64-musl": "4.64.6", + "@rollup/rollup-openbsd-x64": "4.64.6", + "@rollup/rollup-openharmony-arm64": "4.64.6", + "@rollup/rollup-win32-arm64-msvc": "4.64.6", + "@rollup/rollup-win32-ia32-msvc": "4.64.6", + "@rollup/rollup-win32-x64-gnu": "4.64.6", + "@rollup/rollup-win32-x64-msvc": "4.64.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz", + "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.44.tgz", + "integrity": "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-sfc": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/server-renderer": "3.5.44", + "@vue/shared": "3.5.44" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/projects/mila/package.json b/projects/mila/package.json new file mode 100644 index 0000000..602a013 --- /dev/null +++ b/projects/mila/package.json @@ -0,0 +1,25 @@ +{ + "name": "mila-tracking", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "typecheck": "vue-tsc --noEmit" + }, + "dependencies": { + "lucide-vue-next": "^0.468.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.9", + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.0.9", + "typescript": "^5.7.2", + "vite": "^6.2.0", + "vue-tsc": "^2.2.0" + } +} diff --git a/projects/mila/public/favicon.ico b/projects/mila/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b5ca0ad6fd54f2b99be5eef3c62b5348bf4cf0fa GIT binary patch literal 9007 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 B9|QmZ literal 0 HcmV?d00001 diff --git a/projects/mila/public/manifest.json b/projects/mila/public/manifest.json new file mode 100644 index 0000000..950832d --- /dev/null +++ b/projects/mila/public/manifest.json @@ -0,0 +1,48 @@ +{ + "id": "/tracking/mila/", + "name": "Mila — Schlaf & Entwicklung", + "short_name": "Mila", + "description": "Schlaf-, Trink- und Windeltagebuch für Mila Graf", + "start_url": "/tracking/mila/", + "scope": "/tracking/mila/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#090A0F", + "theme_color": "#090A0F", + "icons": [ + { + "src": "/tracking/mila/mila-icon-192-v3.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/mila/mila-icon-192-v3.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/mila/mila-icon-512-v3.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/mila/mila-icon-512-v3.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/mila/mila-apple-touch-icon-v3.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/tracking/mila/mila-icon.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ] +} diff --git a/projects/mila/public/mila-apple-touch-icon-v3.png b/projects/mila/public/mila-apple-touch-icon-v3.png new file mode 100644 index 0000000000000000000000000000000000000000..9671ff8630715d7003447592ca6dcde971df0211 GIT binary patch literal 23318 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�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�s*UsOZ=V+yI^f*8_cjSH#V^h2e}ohtKK=7kIP#+& zl(2*e+@?=Pnd%mF(xSwOvX0XChJ#7PnBQ^LqzJ|uVYJz}9P3Jo=pD2je0ctC;@zl` zwMtYehHTs))(&{vyi;f4f8hKy{GV?d5|i3#cIynb1FJ-Nk5{{Qn=DZVblNm^|007t zwp3{dMNE)QF&9(;IV(VJ#0xMUCu3E2t)YtRUv9J3dsT$uRH~hC<)Gg8FZRrU?1%{` ze=CteYN+)z%kX5^8$5l_`0qKI`*U|AbxUyHyEH97WoC47q#LdZ)hWxEfwp4t%2Uy34sv(gB4L3$r;0(GZ}#e6E?fGU z|Kjt&a@7wi7-g$u43VO~^u(Bvb&RDtj#LS@viv6Y^r+}O<6>&rbF8;eXK~Ee0Bclli0iY-;+@od#hKmY=w}~xNgCWy<;gs|$7pvdsXZFRF zO{%FYh~1;JBj7#=`~DFTlwrIBX#C0)-LOB*Fx6D-I`nKl-aB2;0Bb#W*-6BqK>?&mh2Q_R$8phup4_paVshbO_QI&2eT9+S_D_!D@8)LMZe zHNBU!jb;0#6reZ+B|waYb)YNbTXoM`&e{RS&iDI`E6tF6qtB1)=GtR;;IzeM;a9IK zoQSvnv|dMs9&{Zwe3FA>MDySM?1~CLd2v*m$X06YKm@|yz+nv|pNZe4Is3YC{qu8V zx#H>eLsGk$bKm_vYVZR77iRq-Ik@Yln&qqRpwqB1%-KgzKOTct9M)mwdL3tk6$cgYF#>(=#sMR?9xqZ1;}XhA$$UWB7wdUjnH0 zszQcUKr^2~ncZn1ObDN=*28FH(0=%4iEZTIAj%cIwMj;8kV97@d#2axUcaSvQk*6P zJS%|zxUs!8<2PLDz2**On%0c9G!!>(3*+obZd~;1$ zBu!)vwKIKYGX6E~0X4o4^M8h7n8QH)Sr$d|;(TmhY=5T0a3iULMR9HeL+)W>iR)kt zN|-se*@AhX{}L;8@w*Ri+>~@F8wYqli-o%#ra6EAJ!LE*`;$!!@Re^|)zRx7 zHMNzYB}4e#_i^bI`=!8qYK>bp2&J_MP0T@v9s5WMh9xKu*R{q%vP;EXm|lsU=RAcp z%*E!{wzbChWaH8IkM8VNu_{eMo>2je+DII8T2SRZI*vOMnmh(+6lur`_Ti8hpY9CG zt&^Gmu70Ro|3exo{O;H5f(n(t)*{`mR#KY`5-m9)Cf&|P2Lhg1>Tgmkg~Csnh?qKN znM6-n*Z*5FH$@r`3di!q@<9TQ{Vt50x91-5Ipd3#DH;vFmc_{z`aPI+{p|HC|2-oj zD9qG%XLs|R`PZK^|0k@qNBOl8uC88oQIw~f*-q;lcb{=E#d>qN16>#6)Y?K1DSz+f zYT2p}>}YP*CVlj%T~)5p1Ajy|rV1#&Gt=Y?k*J~zkKy-rqL{#^5Mv!i-rre6Z}y(@ znLeF3s$h#J6Ho?BmNAS!xKm9wDn`wyNMydyhi^}^qEej}EJ#HOFj-BI3&r*g?MJ3U zTs2zc{GB(8&y-QE;jZf#BC=%H2Br`FQ#!Il**WRFG#OlN{qZW?<&;+^eEUv=eK!~{ zUeN2;AbQigpUk{=zi)qP-#)Z8F~4#laPM0Tyy5R#o$~fJ>oT4uI3jMEGd32$=Ok>` zs6=c0ct4yHd~v}X`g?p!&;Z1#y<{jrh!CV&ph_3EBF9h51ZkiaD9H-7cAus=Z{TbG zpk%AI#D`A@^7wb*#3C(rPIsvxVkZpQ@1#S7vNb3Bjz(hHKJs(;^L6*u-c}By!nS54 zORzq66%8qKie40BORYRA3~ZoQa|+5U@V7V@sCK1InewcatC2v(v3aYXC( z&v?i3zX=a7{Y_F<`rI=k(TIF61}M>;%<_KKlL|wP^iWsZ9EV+=-v?)$98{lgOW$aT zJ3XN1JI8pZPl;i3<*0>iBx=!rdZtP@JQNTvmc$OlAUCC<1<)q4XUu(m{N3vHhP~Pc zwgGpxPLWn5Oc)LgxMuRdp$+0nM_f&@${O-+xCCX8QN?bkN6^`DAB=ndSsuM|W)2+6 zR-GpFEQ)Wn6zSML%oL90ZtCe*74i)Cr?Qsuk_8fAQv6q8^51~mtRvg#a6@z?&z%%? zn+0Vx$b0Oq9xJoHI3-8^p~9WX?vC_MmeTC=tlCm*vkp{GGFuwjk8wC}rCsLGFSthl zn_ZUDd5{*!0*6-fnR!z1WdELcaJifrP8W9yk6wQa5)KQ#FIKKJ3)mWll}B|7S42{D zyxHk2dQsydpBqa>#w)fnj??wI_2u2_O<$+s*q#gxOkO_v{r3X$veVpcF<^AH_;W&-G7Ut9{b*_0tqp56cozxMu=B7VG(YmwFY$C zo3HJ>tnIB&64w(cUk&E%x(Q6uL9FC=&6F+_qw-OaicUQ7@vY5TDFqN1b-vTgi}&Y-dGckqXjL+_$Bk?; zaQet6YH<0LKd-6Drkj*0tg%Oc7HeCZY=0?ssoDIWoEp}u3+_FL0cWo!{7Z{$lPcNU zAGT-9EY>jk(-WiTCL2mfOjwG&Q6WQ^cHy)!>VjZAAL-FwocJVx&|e$mAiB=2DVPM|povW!jD6 zzVayi$T__-lqS_l6zWUNbtD3TL;rr-S^a+abi~!CQ0eF*r=?Z7?W?R*E~LrHJQJ?T z@YmUS0gVUqlg7u?gO^3zj^s_uhG`j|$=)xE-xsKTu8dLRk5!3xcI^Wtm+>t{3meO2QzmG@Gi!ZzJn(ZhBTOQ1@S1$9iO4Q>nX~cnaEjt**l!C3dbV{dqbF9nZt@-74Wo;e> z=6~FLb~WNRLrkv}3wzh;=)qwOtM5r(vBsE?OU7b4ATf6dr~gCLa+qYCiA6u9H-yM^ zZ!n7k%crh&5SSgjI3eDsCe~mAnC&>&LhKfJaKXw350S6zi(NqRvaFyt; zOzfAQQs?Brr9YS|eB9q;0=(j*!>;beY`18qLFum4>PRkq0>|)D(z&-bL~`m>Xw#F& z)ryO})vhr6SMMI@J{7dPLE)QXL)~dQ^uW1`#f!RWJjh%Lbj5Gkx$XCL>lupO%(wu0 zps*5aRq|uU_3odSs;#$N^jDl8bIx;e zR?|n~5$NF@$G*`i%gH`F-`Q@R??0M{3x)IiL2~v75pRBBVQ`bm|5X8moisfpbg zgnS~;R8cv5y5B!`{r+@t;oL0EsUv~)TVN;fxEb@d;2GIh2Spd=uIYDYIHt6WPj02R z1`E<%Z2_?Q4-9F05qs%=BSuiGWvBinr}m#ZmYq4OoSv6v&lb1-YW6>CeE$P45W^v9 zJ3})*Krr}Vcjz&5Xu{iF4@bVP|T1 zAX9$^36H{_=o5x%G!7jslp;z}@){pJ@ZitS_TNf~e;%IA28-4%z4aM4X6(gy=3L44t z>=K-C86j_bnjpoSb;-BN%J+t{Bb&n3}7$i>rG5x zv8FkcHuho5^sAu|K5+pO>cR5VJc{0qW+H213OQE#C%Jqd&yvJ&BEU5x!R6W@>kin3 z@cOT%;Yr9>0@a+K?8`@;)8rx(8(A$m>BO0OvZfSo43@0Vq1a^%EIB?@jJAqkiG7E! znHv2SU`G%&9!1+lg}<@n^Ra0{KTpNY*LkiExK0&&X#?8?WD1Ew5SyS?R1|4P-x*kQ`SMArE`m*b%qRV+lj3)gAby?E$WEMPMk8&D(%YzrEAYt+|0c!&=ny zKwAVKodYm7)zOz|bPy21Qj&!sL(GRyW|W5a6DUDWGAPP!nj>miiZ4BbS*38eR2#@{ zO=KbJ)m1-QoSCuDqWItV-h4_H86!j?98uj)esx zi1yprCx0+}It=Pbu9ht!CS1#H=U`ox+=7gVHi{j;$!1mT_{cjHHHyVxVku7qv^po` zmdKz82PR?NbzO%&MU{UJ+VLy>l-U!Hlf);Fr6qrWu(5GtT1!a9X5$?nDdV!rh(z?a zX)L)AA#lz{bz<{JIML}!vfyl$2$ft8p~|$}HVwI!1d1LTYV*pg+P0p4a@*8|5nSXH zu{S+Yc$Mf)XI9jQ9`naq=N$?`tf{kh0y{OS04dh82aI;oD$Tq6-~O#;sS1<{Z&aKA z=zz-jbi$mlqiJPfM!sjkcVjfy$)Xe@Ju}&Cvgj{WO+_z^>N(_1uDI}`3`js!3iwJG zA5^e#su5Rrs$DuH~ujQg-)?Kp3flHPU}lZ#zE2p63W^++qC2Qc|@IW-r6?rQVL*E3@Hx zxzb`)LEAwy91k#3%x5isyCFt{(_c)*fr)3K4H+xG+TPP@2>FwAMEKG@>tRXn+c723 zYFfdiaXFC8Ng;YlxR}aQ6rYfS8%g=aUT+vQu#q@ph z*lJG}#<|cW&!Aj;1RZ(axg1z|_=CVoYPaL#i&_kwLZigKKSLky4iD&SojIMlUZYRf z2yGFLAjkK$_FvilHFzOPC_7$7UgbJhHMw|Ehk=i_liXeeb4|0V?Q9_vb$xMg!+?$N zK8~v#d5fOcQ#Mlp=^1V0_3BzURruWonh9v_PIF%k5e_M;05M+Os)zsnn zOWQ-1PFJ6nR@oEk^+NpE`G+mLmQE5$n!9a))(bp<$tGYwAxBcH&*NYzxN`lZeq~Q9 zq}pp=$DWcdA}Iod&T(N;RncMc$t_?gt$=h`KEndUsZOQW&a(&3*M)F)JTQv*69=*8 z5}9v=IWr+7%4}9CGkDe;UR|-hz8LjubxNldDkW%|+&wpyUGvIz-IWlw(({8QKrKdT zf?T_;;pg$N8^RJBJTT;jsx4zlkdb>Bwu8TkQ-^X~{p(8Br ze`bY{Ru2jA1X9Nh5?nyUaf}ngkw8;utDL3Xkia*FYt7}X`JYnm1v}XIc})R%6H7$t z3dqQq-=*Zz~BYA)k|J9Ce8Nz<|Pt$)|Hgp{`JVfY8l{s}) zzlyIR9ZtB_fVGD3r`_FMx7+uXeUXWxf^bj4c^*xHFom`OtZdK_o!sBaE_ z`RNO1O_B%0mYv0!vM2rRXPvgJJz74qho>atr_=l0u$Qb-7b0~K{A2h0IKSz{fw77_ zm5+-#YD>y+;H&A(pRWcZ1tDx4HsHUV6Ok@p31d>3Nui?4qwjKWXb6-+m_;=&ToS#w z5py8eS9td1UvE2xFs9cvl=NZP3^+gpb|@-}Z zvP-5EImAr0o9>sGjBJUB_w#?g7v{+6hF*2@mm2!L_f_FFSKCzE2{^l9_%UbB9HKXK=q+XdAnKinuAUec15#2T zAc)BD{{S*q8nP_FOKhn=PI^ZD^n z_?o)_Vz4D*)%xq%&9OWXIe|Vrs5d^m_;K%`mcDjb)I1i{mL!;slH;E1m>EuuDG$6(TV3rHumE2XR**!Y4jT%n&9|ap}HwaxG)3>fC19{Gph0- zOzuW2hfhwA3=~pBlPhZB{V;x&E}S|FCjR$0CRmzFQTzV&BwTO3UlzQg$YnoOGq&M{ zvjaQB3E?)Hwpw)iPLq)uYl%>*;yzsVor8)~&OP1^+xf!H5oiC{ASuPhfJk<@%F@+$ zZzSKv<*n7=CFsSz+)OH6_YzVn&D_i)^`@1B0@}a;#DFcN&7KQmy0g^E2p}EJL<|tf fpuwI8(f;ord42$N&h^Zx00000NkvXXu0mjffj<+* literal 0 HcmV?d00001 diff --git a/projects/mila/public/mila-icon-16.png b/projects/mila/public/mila-icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf8af797629b7b05f7a3d38ed9d8376458a84d3 GIT binary patch literal 593 zcmV-X0zE2{^l9_%UbB9HKXK=q+XdAnKinuAUec15#2T zAc)BD{{S*q8nP_FOKhn=PI^ZD^n z_?o)_Vz4D*)%xq%&9OWXIe|Vrs5d^m_;K%`mcDjb)I1i{mL!;slH;E1m>EuuDG$6(TV3rHumE2XR**!Y4jT%n&9|ap}HwaxG)3>fC19{Gph0- zOzuW2hfhwA3=~pBlPhZB{V;x&E}S|FCjR$0CRmzFQTzV&BwTO3UlzQg$YnoOGq&M{ zvjaQB3E?)Hwpw)iPLq)uYl%>*;yzsVor8)~&OP1^+xf!H5oiC{ASuPhfJk<@%F@+$ zZzSKv<*n7=CFsSz+)OH6_YzVn&D_i)^`@1B0@}a;#DFcN&7KQmy0g^E2p}EJL<|tf fpuwI8(f;ord42$N&h^Zx00000NkvXXu0mjffj<+* literal 0 HcmV?d00001 diff --git a/projects/mila/public/mila-icon-192-v3.png b/projects/mila/public/mila-icon-192-v3.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1971bf7a77581d276faa3c1cfdf21d161ca472 GIT binary patch literal 26162 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 JPDHLkV1g1#e-Xq0 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 -NIrqvX&q#XhzV6)Qtn?XUH1V;6 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≺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 -NIrqvX&q#XhzV6)Qtn?XUH1V;6 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≺v5Ex{G-HrS$WXJkWo#>h^+bA+S&Oo*d9pr9H)gsMaXaIhG4&L* z1uf!PW&uP+g2ZA$M4`(@5nwDtNreQ~eQ>r?qy+%1NEtMh$N4VeEx}kuM5R?V-M-`o z6`Cdxk<4UDYiACS3f{R&H_Oi{LI~na5=6@N{ZcVPFq=nVP@B!8cB^Hqbp}ACwY8Qr zyVmKA$CFmG)t`*kdu#JJ_B}6-qM#9`SrRzx8bV~!aWW&KTHw#;vwE#Ik0W1u79=xP zNUR8JoM*9D_om4_48kl+5D2u2;&EiN)Weh6u)f}Vd4AH}**xo?huzk6JhY0nr_LsW z=6d(V*=e)axfl-ouok6>CM6)5wS)*P&W^6M0%l)pV>s|bMu^h{2!)-+gwiY{rL0&7 zL(ea5p+@rp-y-JnEF^Ik4W-0!3zQ}bKq4-DB2u2Vu3y&$;7v?`3k|*NJ`gP@Oyz|@ zL=-N;(F*uO&a272td@OJFpo7L1%5)3LOw(V7Lyqdl>$X#wB?Y&&J&XvukH;dBS5bE zK})m}siXhF=4Q{YOJWtGEk>*i0(q1GD#=ABgyf`?N=VrpMCK@9jBi|d; z)MY~t>cMG4oi+7E%^%dL@2iQX*u$BYl!Q^Iq%ssH(ayf+w3sLas8}=tAzI6V09J%; z-gqKp5KACdkP(#v6pIW%UPw%c0-m+LV9h{15wzkt_b;I^04M|2vh@j3+=zuR@AR)Q=Fpv*kjQ~6v;ya;t%g~$u+n-(T8M}) zEFm8cizuy`St*snLIBI9-;IX2h?!(Ix;iZYMpS8LEO6k5HR{INcDpl~PTQUKESlGXT9&4@dd*~MP5ai^OeD71IG&5I<1}6Gw9+I^EQ6;l zQIe%92vW{w$y^2gbUtgg8%Y#v0)rIR{XsPLYoVW+mzT%u`#aw}`FZE=tp`tk-n(_< z#p!Xa)11fCX&iMo)_*#Bv2*jrv%{CoPJ1+&gpGQZX2L>>j4{6F*~|n%m?Uv4tY>NF zh5mdV)fyeJCe0E>l(E&Ga{68@09kpPKR=X$Ld=Y1MN6_CMi$a{^1Mc7cax0`odto4rmlnE|!fa)oJwE^La5WH5BN0EO&u zZXg*!qA1Z4`8W;KF!Y8sJ*j)A4ezX}FPh$YO<#s;6jDSg@+el65n9TT>{ghNl}HUy zk@Y}4!^&hR%t=y5v`LyJQN321Cvh&0RbYhC_s9=3PYGy7ZNSR}Q(+61L9u8-vf7&y zk7_^`JyC&Cbt?^1>qfFMH+%DRXOB3uGN%N z)|bO=;j%?jv}bV9AjARs?PX zQ4DFAnUpdjp6`1EQ8ZuQS|3h^%~pFf9yJ<`%gf7Ncb%DywMwZtN$d6cY&!3Dx^Wx_ zK@i1p5cu;n(Y`lJ?aZ1~VLYGjZ0(GOgSFn;bTak)Adcr==x1!1t=3+@f3dc;c6M>T zy|X>I7;bEAjc3DpJshXecrxAD+Wq|T!@YaAKmY!lyYIjI;PJ!#ySIzIpb=*&h}~&*c^)gj#Zc%b5kWu!2#Z3+D48}ah(sAcrh!RC8fHF?d_AnuDAePc zcUjXHb^pAfhc$gs$5E&zK1H5R6&WNZ03t&IV9BsXRK%e*wK(?Ud3CSt#!Mq)s;p|0zXrp(S9Ui z5iZ$dM(aXdqw290PLnj%Aw@~j zs@27?lK?R=B3NcxxS^pO2v?m%i+@EXm6s4$o|e0*30G}&m6)-T5mHWx9rKcl2<8l| z(ke|;-w)<-;s=4XEFxi}Ii1hzt=3upqPMYec6ze0vB8P;w6@G9Ndx62Y1(MEM)PU2 z)f$b5VOSf)j`BYir3Ep|Y;SAh@a*OO-tP00m)ko#ua1t_H`XV~O!=M=OeWLT_S)ga z$&H&go<4tZ`^N33htF@`zIoigh>3&E-uJJb-G1-AzyJEP4?p?E7vFyM_D3Il_xQ*5 zT6dJrhqJi1v-$Jk^Me~Vp1n9++gR@phheRjWtq#NG{ywJpTtQm2(viuw%U`?*bBob z&AN^HEQwNKFZ8EzgY%?>i5 zVK&(;nNPFW2Ebx#f*i$h6!#3?toQb?)AQ?O@^WNJoHUV9859&uNhiKakmkM``ZTQR z%Q_7jUO!alHR{*>VW37K4LqELD$>emWQ0ti(L|_)C{v;`2}QKnCa{`KR6I*w9ZjA- zGv^nR!+-#}I~C3su;t zuWfo8-S+Mt1pdbMcIG#@-b}ThAx8))ic!dlAW&l;&qDjGqaUVbb7nTTg1vFJb}`#I z8yrOTMxfg%)R1hPHk<9(m{4nLnb`nA5~sfBSrNj*x+Mr#+6L81;5^JlN)ImU4xyTw zgNVi$C;2ZY4(`?%U7U*Fic==c3FjMIz}!baop=w$!K!B5Yh z-F@fY_m3alxN+m~>};*qn`N014tnb^&yNmn-TmR`pWb=rod-Yt{NDZdetz;~V`n>x z#uq1N@7%fjyYIjL^{2o7`!E0St6%^6_g{a$b7%j>#VOQ06^5@)PIh*8U%WWn+1Wlm zKd(0%Ns>TebyiBnaU6Jlk|eFLmPT>A-8vr)wdcoK>M2Env)Nn)ew4;S2!(aVal&(` zABZ4WlZvsVJ*xBtz*zrG6pH6w7j*%!)ht(9ykb{T^r z=m_Nnte2J``NjO$X;cINL<B?{)AHwg4FRO8S;t?ToKI-8@BOX2_Z0HrlPJA@_bxZvy0`A{Y^JqZhGC>Ac33w>g6LWCnFDLP zk==~!-X!Y1?B5+{TbJXvV%Sb4h_kh@1*s9k0N@cJgC@l+C{(n7mN-rhVo|2HiCAVf zmObBB4r}V*Yr-hGlR0l!7o6+``vI3I)*_M_<9nWnSdvK^In9cPO6wYkII1cW%;I^i z5e`R_TC<+SajVgs#R)2-jd{cJR(dW}MV8b$SX z_i{Mg+}}C6INiLlcXn~Hv9URw&XuRp)6?m^-Rm45z1rE?Iz4{1yS4q|>GK;m_Z~le zvbNTZhqii}CBaPb0<>mUu=Bv|_TD?Ax zW94g?BLswOt=3ws?KE5S;bdoX^I|wmNepx7`JSR#6oFQmFe;U?QBL#YE+q;IC=^hV zS!{gr>DvGLe>(I1OcA?CfGde|OSyZvluL1a1h_5$Z)gadH-CYo93JLp{5W| z#KHgk)~Bse@>d(T_hRpDuO}JD3Royr73MD4Kr#P4fKd#j6*0KmBC=*3GZ~`tQtSYFpvm|MUMvc5cnbqiEa@ zNW-|_O_J=@tD~QPnhggCXn~8^69KV+1lmW^)M$pA+l}4b=AE~s+r{2`tb-|#L9&QO z30d~6Xv?ikwqsbo9N+9u4xXLfyqv#J_3(1O+3TeJ@w(q45fO_-o{$3K!mI}@jvFea zSvpH% z?fV+A9)`lm!iH@ICJ_rLVA=NqA%&WZ$rvOthCw{-B^is>nY9^;1?0d>d=NjFdo-?5 zLW%<~_EqK)Yl<~m&r5;H^HO2)6ce#nBC^aL5~j9>M5)n&O4vm6whrukYT{%*9s5Y* z%L_z4x;#zE98b<7n;4JJY~**_{mDetg2`;Ee2-n8j?z}FLIf+G@1<$dYjx(sNxReO z&nJu+C?&?G$Ob_aT4RY21r#a~F~W?Z0DK1HLuS?b|M1WCzx?NYAs}sXo%3@3*Yd-~ zAd6(W>jH4y0(!HF0I-BUUZkLu!>jVnWRQGrRdt7nEFyn#fnIaJDq&BohcG%nSKUsy zv8Dt=)X8i(91lT>XCO@Qc4xcC{<;_7+%{{yu~L(oH}SoRN5h)F484mQUDWkOO`q54 zvhGbZPCc0VDpF(=Fp2@Ogpi+A7=?*JfLQ<;2?R3J61xT*zkF32jgS8Lck`oj41(Ra z-_p&--tD)VLHPLi)%Hgp&uWb%itT)S`taw?t$nk%=fC~l;K9S>a`fPDe^-0(L)4!N zs@+dNj`z1mp_iV_(kR_}>qayf+RNeb58vT@g3RQ3HgkSx1OQYTQGhcN=3##}9L}CT zJ^S(tuift4yp5gS-rINMPG?$cOj0rArGzo5NZX+=^=A8Ut9E;*dvrN_`uOOh=GxKa z=-r*}<#6m7A|tJ!!3@?g0_4~vN3kws=1U>IZ5ZQc5aDj66!THkwj}837YzU`2yPu#~%; zJs{2Ci6{mSkQfz12m_MMOj)4>-~OzZ)1Bf8G=@9O=d-FWsL!)thH)E@6Lzx3;=9d z#8^;`c6)!n4`8uG`IUzHLV2Z>RAP3PL9Ey7|8)U)lda%7oi#lI0?Lorn$yMV@hbq3G->8s73?}C?KQ&(FKYi ziUC$OT}STq`_u2fJ^uP@9u6r8*WP)%_p47kH*con=;=@2b+Y8yx8Dzk!=3j(^gQZ6 zev&+Ya(sBy>->*FLprFOHsr=g)rJ4sYJs_~_I2+U8i}7{w?= z(g{)wI91-r500AQTN|y@XXibbJRP6>Vzb>DnOYIwJ=@P+9ODalnx| zz~#dbSdlWM%ZY^$05Q!{5+EW)s8C7OeGGz%EHiqP8squFU^))!jWmk8oo*VZeh?;U z489siNg}4zsE@{zjg9T;eBP`#2a~aC)?SWA&}neHH46i8f9EirN1Hc}I2kq92O8%= zcTPMH)RZJcN);I*0kQ-c0xGl!gj$50v0GROkO>5V7!)BgAcz91SOTL%i=KtRV3^sk zTWe&zwzXMHY;R|+5oc>@ayOa`FVFjzCy$>0JerLzl9@F1OyVH$GO(Elq4JbUqA2V% zUk=Y(opw5(BT^=ungo?%VJdb%B5ZT+AP|V4BPvuRTG^x2F5{MXU*C#u=l`t+mV7r*sxy*2W~KAZLR zrm8iceEH?wci)Y|@bv3%G|KLWA8y@$cXT-kQ0dgZ8V-cO7>kO;nE7OMd336GZ!l64 zc!;b`+G&P2-o58{>$PY$cy)T~?%l)ZPitW~kD@$%!77*5<>*Gvh=&Ls5*jmq_H6#* zRrL6I^Uhn1J9oRcZjL+}VJPGyq9MEtapLQXI&IZ=Zr|)Z`280@zk2zbpnIp&iYIX+ zO&ZDzkWz8M0#vpVa$u*Ukpd84lqRH?)95@3ri{;)vl6L|m{2&|1vMqWrD9!O0fokwh~B1Ng)sdqWC6YbIM zo3B2;{dm3pvaV-=Ki6umL_in;5V^>uM+TKM6rH0U3>DEQ=<*g3go#ZcX)l=vmzTrO zKcD~fQ*`#SckAX`fAv4Wy?dvv?kQ2mv#}kRJ0JYT)6u-s>CB=T#fBBU_~Y;2ee0Ip*qaE1Hf;?q`rm%lw%oS-<9A<6 z6cMwvHjZP+?NK@5nR6PnI3FF0u!yp(0oa=4)syJ(XZ>ZTapU;n1HeK4toL#;FI zgJ7mq?5T0!4eP=Fzy7P~pT56*bo6Uod&^gQM4TBVnp7U}i%g0DQ8{E@5kMt?;44oQ zG71PPPqATAiiMRT&?F2<3W2S)zV`FbI0Qj7)(}z@M`0Ld)+*1R&gUxd&(1G)w>AgE zVW-Rf#_sOp7l(J=dH2i54{yBp-p`Uw@4b7tR)5vdFI(P= zy6!ivL?iwIj3YsDfePtZfwU;`1&mW0I`GzQazn6)rxX__QjYf{P>1C;MSl;?o} zDNSAoK_H%=DGf?7s+7Ty7@&c|p`ZZ@7{j&>P1wk6D-OC*ZN1mqynXkt(!b35qqCD| z$EPoz96g(%8pn|dc(V}>$CFmQVdB&PfTx(*U35??m+=4!5u><7YXPy$Vu6&e{Sbu+ z2+#^!DFZ8tbw3~FuTp?S&pcF3=Cv7?47< zOhPC~Bp{~uE~T?qbi|9(1*wm=G;RzH!pbrVSg|1|YtdAG{Ne0(zlY09 z6V29l*ScFfC*!Q~_I*CsP2akk)Vsb${Q0Nebg%_@w8rRr1QB+ zVgv@Zq&+Dnst$^YsLF{+o*G7ZB70uZ#3%q^HsoQmy?+10^}qP_bZ2*nfq}p(LIM&{ z!rEpxSZ%*NKX^Ib`T6|)jBX~}o2Oe|C{a?Qz(?|c6e&POC$govP$4RV}Hpqf>(eJm~-P6m9gT4L!<;D6&@9^}vyS;XF zcHHf)O`{p2@@loq>16YryN_l=eS7z%l8deO(}sH7^Uvyf;On{X8w3%t$YM+lY+bAp ztKvCLrW8dy9nUY%F^bJ(YNFW8XLcU3%}~Ik*4RvuMordQ0C5r3q&yKJtx!`?t6{C~ zw^}-^H8(e~QKx#-)N0V_7~fCOPYf7FU?GOUVk5;cv)zn0BfFibEikn>!rA2V_{FQE zXQvm(uSREC9cN@SMb=lDSOCcKVLMu3!kml5BI1maEX1Tl-TNQ^RrXK*@$*LA5<(ue zoYTBZ;eU>1a@ls|nz0VrN+9O?1aN%BQWGW$?V`@YuM^U+na}9{P5n) zyyJV3g>F!@G1mn$V;ZD{0TIBuw?Ygk0Jcb=2Na{kG6Okau>{Q;iv_}rg+MZ!kdl}^O7WEk|>MY>%GZnwzIp}AB{TeYmbj!boMsCfBAH0XXk7*R-vzhV2lXw-u=3v z&fmWEr0c!xhR42lS@(v4iWR0x0gARJ1Y5Hbn1qId=BC_*t$2|;Vp0oCfY&CT|~L2Z4rwYCnemI>+; zO%o+EjlQT;rWakWlVLAWYni{9Hr94GKm6dsk1mJfvywpC$8Q6o-LIHClxX zpxMnJ@>Dm4dG4~HC}52~SPYZ~F@W0Pp&6JL{_4CV$GI}drOSy3D1~`C-1Yi@T>##U z4}cI>^SeO^loX^lCu7D+PHx4qvdRP%K_Va|P%cK12@tF%B(Kh3l=l5JYlsTK%;u9& zX^4yt^+e2My?1$Q^Lfjg`krg!7Of?~ob>OcrG=@oK-3j^gLzUfp#YnJPOlK-lZ58@IN0ww31S;Un*SOd2+~QD0vC z{QZx2|MkBL_V=jOnUCUmFdof^jiA@`8{a*8WXG4D=-GD<#{}f(af`y%kv6ds@mgFf zF3_D=x~rx%B3v$rSN);!xM+ngp_VIyXvNqay*ViAo3E0iLnS{uqa((H+dC?qA~0cvJX zG=eArG#Mx*C{~OIBEYD192*iOt&=F)=ye8@Nwe8Fx;X3ZZ-4XT$L-q(hl765Z0c4k zsn$$ZxlFd(Ge8 z-~8yqwe`)o){MkV6^@ApppI=ASZWy4iL=d_UJt{q&5d{7dFTG1e|~)Y^!VwE^A{)M z5%^#NWFjCzE0!%2DnMc-B7#;#wC}arttqo6kKN%FxO7wE@^p@fK+sx?imF))*RSgW z@P<%8F0heMSaQfuK_1SzwXzT7@E z{lr+wY?`$jjoq!iA6^~RKK=C7TJzNRSZSzCl5;L`?xxB8N{cu}r&D4i5Q88dYm>Iq zXni_4{_B4~{q9>z#*BsqkcZe1MNG@4ptAdPF!Vt2ghWaU zDiD|`iR#`|o86D^T=u7j7vrtrwEOhvy?U?{%NlwCXhfB1oOv|!aqdy%smQ|wU9TUV z{9iNp!XC3{IWShu;tr@DdtPj2!{JWYP_w8W1heUwJUvaKEH&HRjf?T1*6zHzJa6vw zzJC6&dwb_m|I}Msi#9e!Ypt`5)|0mXwCx==y>Tswf?BGH$pV@VNy}t%e3U+aHhBCq z&&Kh|DWn;QAp)scU?J-=Qrzg@b^FBSUy6VL=eaYEL6qOYMRtWFsTI>I%ri7O*V!vU zLS)FXs1uF&({p@#y8@i)W|L&+Rk{P=WZ0GO-y7DwStqdTMIo-KwArSzB7y%6e1RPk# zG}Rg{uvLVHJtHkk6eojG->}`;*aGEGYmM~}KR6-}bb$FYod?*0ly(?EK$n=Flhm<@ zqse! zUX-P+7JA<7_-Op#d!X2+>4Pu7W>1(CIeK~a@(`4QMpN%@g!?x&dN2R@2j6hL(bHrH z=?H|i<$UF404O%8d0Zw|NIUFK1-|xJ*jSraT;}50&vmtsQ}_tj@6N6MR_}7N^R%U(b^PPHHw<;`Yoo!cxUQgQverC_UpyN; zc{F+S&|F+lmI453O^#y0BBIKBi>x332^j(x00F|3_syAEP!X~qsl{cMQX&Rr-i-h# z&}j1mB#W>BqDO=PtOc_ES$}v6-+gnwwbi)ucKf|wY~Q*)4)qwpc#5@71h}TORj({P z$#iR;ZDh^$IN00X_|5yDesp?#`0DA;&wf6e^e2;vAAsj$ra=fmqPn0Nx-C)J4(eK~Xt#-boXw8b4Rv@u<@ zbwrYaPvEk&tP*8xJF}a!`Ptw9&G3hBl*!Q3lv!XnIX>Ii-%X+0qEe9kl9cnq(}u{_>yD z&h}WT`o{L&zxZF;S=645FMs-JG?{1CdgAP#TwoQPq_(QB@G;1t1_{5+#5cWaH!C{q4Np-~N~XQf+MY0YoVQ5hAg~TBQgX*-5*3-fGqMHhxai zz=8lVV2Tuzqy&)yi@<=E#Ja8y<3vkzdwXSuUJXKmx{PKw~)!5)mul^zSkB^?54NoF4sYb3712PdPEHj() zXNsB1C@@^W_ZGR&`I(pCIuGEw0KB;u12DRzE&v2_@=3W8E=Wbg2#ckkD~Z*m7}SM- zBLM+h5+cFLeE#&Mx3M1kDhq4%R>xxufCrQQU^?_`wML_v4yL_(_g-q1DrCyFZ-BY# zw9*k}fI>pU0xE9{BUp#9Z}=tX({PoILrtv9m_E54vmZnOJXqv-$C_H&MU({ok`qGGhRA`|W#;4?Y^0%*>MU zdaZTyAba}wVle0rhHNq-vVh23hL$-jQYFqF%5)Y0Kt+@31dvc^H&6#a$+cBwhOrV5 z0k%$j3l82&D0cM2*UZ_$zy4p$+UAf&ixwcGm_d{v6U}{`17hG4c&-)+yAC*5mtyP= zQ?igB5s>?U6Y!9E#&)W~Mp>=S&oJrkYdW9YdT-;a;pkwy*O_xWTQiAOiH(zlTD761 zw6pn=%%D?$sp&jW)6h$mPLM#XZkJNrWx7GHrd3xT!(9C!)yNbzN({(Kg9)1dCd zjgQ~of9tKc=f924PEL+qygE8Oo}SMzO}xAqA)o~UmoNkNv-z}9b;36&p+|Aa?F2n*9iUrsqPa&5)Wss|`MJf8U2uPgA&U)J8G$T*> z_0TAv88oAB`EYoe+O*Z#I2sMr-2;1TZ$c;v7;FKt6vBLyS7eyv5hX4yvEbLa_78`~ zZl=lU-~E@tH(x5@+=l}q3Nw^>6dgW)ZpDD-daYmu*VfjjKmR=Lw063i=iRWe)ip_? zk_-Sh?%kWTn~h)pqk9Lp)ALvTpB~CQy8l;yHEy<&;Y8^g5vk$u=(EozKYZh8_$UG( z#+uwjy*z2DdVE~=77L?NxmM5#go^%K^^E0af$ndi09XP-KqiFAPY;f2&F%l`UqZ7p zLt;`SLMX_>z(m?%eJmj99N{g3MZ#y1sO-L%0HPrQ2DB&^SOY7>EK7ZbS(>Rpoy?}4 zjr!-qetX?}kj#4RhNlDaYM3!7HMN-y!wK*#P-7*LMuVgU44{B*K)Pi!`}oP}S6_~Q z{+ZImQ^HCCqb%h7Ypi5)BD(__2_eaBIQ;zgvsW+o{@Fj@efPZ!vKje|ikV0N z#0oQdG&3e``tvAmG#khBsNs8SU4MP6z4_idyZwpnUmTqsKIxy#tmj!k%czNgfPokR zk7QA^u#1R4{3}==bxCV(mTn{sAI^Qj4U_E5@m^hgl*P@&jAthOPkk zU6+Z$9cqtWJpX_HZ(Fm;`mcUbVdp@-e;9Pefsqmzso3VcGu|OcJQlDFKe|-`2fg@1%W^<2Vzw5rH-4zGX(&afr!~=Sz2BhCt1qd z3m$o%BEv$p1MZB7*;5F%Pa1%OD*0z`uO zNQb3dPGpg8~cHtPsYCIrD+EB=ByS(VK~z| z(OybqJYWRXfu8!4m64n4#QcH-W^172J?kqiD zBDvA=dH`^J0(fIBpvBG-SwIj83OzCvW>F*}Sjq^KD?o{=I>@yd1jGPREs%PBHk~<* z38O)+F2|$98oyRc>ox!2An9}>Ae-OlMfg1AdjB#7yL3qA%b`UUK`^07gUie5ci%-v zhXiQYSzhxhB(6#otYc=zyjue#z*A8xn)(GS1- zK2e(3dY(t;7hYmy*td$pdV4NtihMaOzC_hth1u@28Ednb+v8)`W zPPoRX(-h}X=ml&o7$ZsSS&oLoMi9iqVYs$F<&=F&-69B(*Ih*xiIEj>&17rQbn?eP z_W$m0X*N_OpcM!J60!mkWM}1be}sT2Y@5wSx7T}h_>#)*5V}-F*TmwSs|NW9vt;i#zqzREF&ic&3bTYg zA~8m3k1bnYvj7=DPg#Yi(5GOowOC-o6h$2 zElvQ}et_!}z#AI^5Ecr{Md}by;RDEnL~>Ck7VYBKty!4Qk|7V6LJ~m(m;z|e6CxH+ z*6w7`JRQ9H;d|=??Cy1b^P9_Fd#Z@Fa?Mv_r|7_f`vX-XsjCt$s0M%)o5p-zKff4# z@mV^&MAs;W1>{1ihZ-m(;yLDCkQ7-_0Mp5k(?p@B%%G>35EPKu`1I)XPoGcD2lxNc zUqk{s@7!zLxEc3);r4E4Z+||XC}V7v0Nb4#x9{A$e|mDHwdypQX_ghn2!w(Vkhgi< z*aD?oXt44sPWdY)JH*m2z;0Hn^7Dm4iDHx4?wz+H-?!+Z+ld#NaY9}ITU{U(2$Kj2 zdtx=Sha4hnlhl9%n|W#MrKx61)`GP@ibRpjW&tTPpVu1U$fUf!p4Mutd`6XLN~5PR zAXI|3Zj;?On*5i)zWn>Y^OBh&u!u}5Zz-xAinOR|MdwRcOlGVxr3|LxIxIfM{7{F4 zIWaODBS4^5Uo&)@!|W_I*YY5mMS( zCZY^Pw8IvXC}p*Bm)hH3MOlPqvC99~Mq~E;eS@ zFzD+7@TQA^J6Ad}=%O9%)^seAU|lELvEC}cLL$ohst&>odCLI=5fvdpW=SEE62Y3q z^;mZ1@yiF_*;*}l=R@<}y$cUSdkTmV0YDWlFe)n#<^5~P*A0hKU}USKv^5%~KYcTP z_ye#3$`8)&8S%8|ICqFBRGcK-0KqwO*#^EAW1EdmXQOLu)~>gsG(kdSjG|<6c0|5j z`{)<`y#TsEMZfpFX7AC1hqAU+fA@pSAT;&*&3o^{d_I2q7|>sP@BN`Q(~EPJv8R-= zmYK`gSDY3 zzDIbh8B6Y&Rh6{?1r&e=8V#^#(9Iz!%@GRuLW=O;;oDFsLZJ+WBNQ1@ggxCoK%)w% z4Yg$Do*Db<;rn8{>2mKme7LG=Y95|d)j;CSO{%h@JUk=J)l~02_nhzheS7fY#SB~3 z@2K$*%((8M9rQ4c6{qQVTnU146zkdfxZX;FDx)H$v!9bd0U)!7c5&3}{qS#&e(`fi zqQLh&t!-+F2#_J~CQ`XL&kJyCZIY(h_=kCJZq8FGi6S7%C9-+ULDn&sOmSOKlL5c1 z+w+^}U}t?*isIkB-|VSCL`geOp3m0m!Av_P#R4g^B2QSX24#_uSi6UT5RuXC$s%k$ zB90Sfh0K_bk4Dd*4W8axSl>)r%`uUqbqfjQK7iuvi{PS`&NqPb7SLA(gPv4CD8c|L z8#B5gr0}Uyw0!m~7;ux>8Z*+QQR6D#KoPQ}HU;e=lC`Glh0S`~G=sIb-+EH38tr`g zf*>pig2E{f*=&^{hxRQLO9FsGAff~+Vs)>3aQ8l>1_7P(Gk1)EVUvM)va-nyGhBPd zwSLJMMxt7?F4h>!G85WSXRbLjGq-SZa?}|ly1sDvYrl6mzX0`CI~vxmYz{oItl6qw z#j_VKv|f2LoNLW~^PQ@QH|)Q-d%rgt3WBhG<;KlkueY42m=7p^ys6{<~FbEDjC#9b9TmH5oeQPTjzKtvHro~X#0un_s0i^(MeCI zsRl`+I8Bm4qmtUB)@Z&kNs6RAzdk>k_^^>Ww7uhby4`9Wo*WC({=vcA>?|oQ!bC1%f%6qS zE9HxIhed))#TsL+m8nhl)E?}xN0<#d1Vw>n7(RWnaCjJQ)ce39qL_e%fdyEL)YD`s zi8??3`Toy-*%%GybU2$>kGbXrL@-R^F-fPtr`wg|lLM%R%#7r94tL@>txDp zwab@A;u+FN3IqkgijX41TtspTk{~mXBC-HTXaJF@5>~pyA&o}9vp^^SMo@A}wgf;( zAm>8R^9|suTmG}KKykCRQs+UY9k}_^hlIqE^MYQgt(=Higx!PfGkIR!$nX? z^5Hg?9Lw3>G0{G`rWOIP8b!(W_BJVRDh-L>^}JH z;#+T4+AG6aYcw7=J{1#|ZLYZl7IRC)WKDG19y{#y9^9?3t@pJi zCS}D63o?RjBuRbu#mPq>9{l7V-fS-})%?xMB1NXAbTz1S$Aju>BVMQraR(Vaf#n;1s!yT-kcD^Q&LW zC_>L?Wi!8s0%Rsq!j_p4iG_*CozL>Z7Bey)X2KpsaJr^!i; z)o)n+zohV=(l=y7Vwg(eb@VC476+XdKl#D>Otm(<(9>iw06=0O?WHzVN(%}hIku;O z00EL>VN@iF{6@W#CMpa~oCLsxz<`LvAeei>CJ@HrfO9?tKA!=6CGG!7ztqJ(<$FM; zoKdB&bl$2cizQASw2=r;H!sB3J_cG8Sfs$he8fw=q)MK;e(6cgAA1VXGJ!CL49$LD zJ$^VdI39fZ$x5w;zK#H$QxtOm001*sh3Ji<>hb=`ryr&Lo=|4#DOBB=s7NL=#?y!U zNq-fRcuYvghldqE*m?AL&^Zp9b!atb-+U8SH-oj!v0pLZdG!h^N#bN?X2F}Cp;|@7 zDR1v2&mP3b2SS8OA&3o1-uo znZ;VGvwd*=%GG;!@7=n2>;Ap_mo_#JkB%$V8jD16?E4-^5vFN67)p}XmzM3q;wY?I z(k|{86`+7G+&u0a{q!e1=q+Ep(mU>fO@T;x0UJvq9ud1D8gs4AR2p@*nHAdoY#MTA ziykLxn2Z&h>w?PXgWu5qac`o4nNR1QPEJ}ckC6p9r!r)A@3hn5B%Qx_Ir2QKJXWYk z*$mME4vtPp$d<%vU`}EmfJc!h*7Ul*wf)1r*5);JX|tzDl<#aBn04{W@5)7Ao`=Gp zZvbE62H<)+1UN`psA4#x54|77T%t`Diw4-sAR66cg zfQI|~CK^>1mV)coy9%s3J-hCyl!h8u>^gkD0sPh%onM0Ai3OMa4+HRNeZNc`F@vvWEo(8Hq?xiNw9mcyAx$)G2L9rprYUmv>*SR%+Fn2xF#d%{DSO zkpqRSfeBD+KwzTwm1~#2^{o_OxV3k@y)`z&C?4oxzX2%<(>OMdp9R}n?Or#ClUl3x z=6Bz#E-jgq6=%~DCo#?BjJRXjiGXutH_9{%-?lOjhBO^F4 zQWSAK_5_Fpn31i=7{*cO^N%oz$HU?L^5U~+&(>B}d;PvgUcJ(Y#_8hRV&~}i)y-== z_a47uaeoLK*I(b9`db1jy+QBx`TOshLw2SelIqEQ8I10YDHS zjv@r{Je}Qsg-P&BsVCF5yiBMYrNZYWv#sPd3deO4aSU$(7O^7MO*V+l-Y32MQpKlFi38G5FlhBWDyZ0VJov2FJ1oAKjUg;RISg3)wI>LCJoZ0^U)`S z)cX3@eP0@$ee$1wm_|``W4(Rj`u@X*tUT~N%-YdFC5ZK;)<>+>8_{qic`z3#C6=MY z+_qU3lyhZgC>SVfwep}7hxUO|u9(wM#)F`x%vJ5gWDUIKDc}D#^$B>AKkrt>EcJvAGDfPZK*TpDv$C^ zd6Xzhj!!BABXr9%5sFGvb$D=e@6Oy@>*>dz9qb?6_@m#ew_A6A`SWcso&~Lm#cHL* z+QE33e?S?XO|l$Ef!ufE1YJri?RjaE8eA@seWnNy(^!st3z!q$Dh={_q`s7BCUk2wE{paRzMNONfK(6jK`txNBv$U z4CDS$y;j+ObYItMKqN$5a6zzeGv@E%H)>YTU*{))f9&#K8aWCuI3SG6U%_1SBV|6V zliP?0BV{>FnNE)=HygQ40*TNPSVi@@Ijub+R04__v@)7pcNBmKu!h11`{S)Gjz$Q| zii`$5-`eq$XO-bln*`Vji((PWh~lyBZf%V_M@Z!Gpv=tHmY;a{p5rJ=qL`W48WACt zMTIB_ldu*5HF^pW0Cc@2?fES$mD_LFH{OnBRzTH+b#-n@)oU0H8^h7zrymWU-r?;h zgJ1sq|NK`U+`e^t?b4Aw$+5v0qc;s0FB1~vejF?I_)Ch_|m|M-}pxeK)ezALa+^W@WYQS=% zQW+n2S6g%GVfW2T*L&N0x2|5_efE5Lc0L`9Jy4afX00Glb?Mu%fU5@Xwl z(dQ4KKU#a|jiDa|&AD2=87DEaP@38#78XD!@ROCs+5U|I9sCx6_tf6&P>cm ziK2v1gcJ(_8m(f-PZmK$jp&btu(v(jdd8d>vcLeSeBayu;C+7hxGfAOv2L=-LTr8E z8Lc6X1g#JWxsWKzXVInfNF#pP*^tBHfoi6P_3+9xKORt5eZRa5QxT; zgM-LGuTmSRP;3B3$6*MUFNC+Qi?5#j`lG#Hf2@SrlZr=c)oM*R9rin&lO#>u%3!TU zkXpU!jsp37Q#zf_B+sJ=Vb0&@($dnx;^Ku%7qwPWZmeYpe9F5er=ldK_)$@8d~!l* z3Xbm&z@&}uOSQs;VWoybjY@6M=`GF8N2AF1Jz+u1tx65XcC|6DI^&y57rM{3FDccf*DDuu-eM{_5g4-W>?Pc>EZxMP@+; zLIDyYq3lL;7ln{gW5(k#Dgv4A*eEsV4^m?S-*;!zTy=zbOe8`cn8i6Q*-fOrboQHD z7f(@4FuQm1o~S#+VL1qu+)+ai0SVAW3=`(lU{n$vZ1MJswiRH*2<$v9=s4VHj8R%A zQ4;t;5+|YZ)6uwAtMBb>d(DPHvP1$@=mtvJpim+doeu!cH-N7c23JyIlo~!zQv1u~ zk(@eEm$V6PzBhGLosfZ$0WB&~S^*M+02;y+MG#ml2ou{NiQ*S8lHLhu5lRV}EywYg zlIZx;kAm??BfGReji3aSF?)|6b38)Ih+$CJM9W8I*GNv&>o;!ReDyT|1QrF9#_1?Y z-+Aww*I#=h0WgS0KsOqdnfmbPuS>jp# z-#i>w%N7BnYqT&d?obf z+bysLP#A%;cuSmUNAtN+nx@0y5c54T8?xq|eG%&iflJyEN3_eXT@jx?LCSG9Kc6xK zzf|T=7IrLMK$(bPS3&=^a z-SHd%L0BPyi^(e;J4M*(Wdt~*Tu!=1h=NE;Kqz}YG8U#V2#~hf_?AW7kO8eVNC}Fz zVu_WtZ7s>x)8o(Xpk+}&4pbv-Od_JkdwVORNL3mMB9bK{5b)SGJQ$<~QI|*Bg?PK@ zkT?a$^T&^x?RGpIkRnFfIoS1r@Y$26{eCAM_GV`0wAP1lTD$ZL%`flA)|WsO!>E%C zhK>2QIyvgxyT5e#;#{l#qH{bv>C9ca)LvV9`0>Y{U~^?{d1GVm!Gr$M5s(rqp6{o| zxQs}oZ0*c*tR^ir%%P8j7)SBFFYbZ>DCO3&Ol9IWIOf6+H6bWVp-urI6fiIzK^##~ zHHadF#8#;k6#}&CVU2V&7_P2diMKo9Y%`1{6lhedHcBgDZ8#pygspC8_wwRmcYhd< zhraR>5>KfByi|;Fw}j`bcEh4#1Ry}0Gzhy7AGd1tAWa|qPydsy*0mq3E-%*Hy2S)y zfk8o*5;38mO6KncLUt@dnXK-Zg#uBp*UfZXJgG;@B@9uPV*PSrU2&K?p%P#3?E?MnX>|!(rVI$KB&v z-RnNvYlPJo557>9hHfmDB?09z(a2;%!H&}#eW z*dsk0Cm^=6agmo+2Gu4uy%8XCQg7A+o1}ZY?RX5`?h4SL$IRANM89uJ1MR&E?^@4vNv?c~XewZ(OvSWN7E ztu+{o=Ns)8dpnob*57~n#jT4MJ6m@LN{`b>3y8I%6p{e2YBs~g3fMH*4jzLS!rfWV3X*x``--OA!@A`FU(QUn1N z5yx@G^P<79?)!t?gJu}+-2FWCG}fEm{9MG0=zPRPNW~$bKyo16cZT| z0t)Pij{$S*=8Q3>pLs>PS(wU9Y84^5l{1ZSVc)@6zX6 zZ{EJ;1;NbhLig~9lSC1I`m105>hJ%4`}uRr*0qzxCEAwlo0)4h54&;(A>s1KWD2wD zw$dDI;Q*NI4pQ0LC&jSa<;uEj2jl`4$EXyO@@h5E-f%EponJoO+Ij8r^`oaRUb}GB zbVsZ0g_d74!)U(QJl;RJxW4iH(c>GNSN85dd2MC0GUi!b@fd?3P})aS3{c-#$GOE( z7A3(b?4`yR*gx8RaQCx-q(TsCNc)|rbAn=-+39Gwq-)J47?~ay^HJ(cs2dSv5t|kx zlPQWrzPLKp9%og{SQG(6l7_}M$7W_^XGhW+ znQCmklr;kZA){w7FvJA0hXw#pDq!hwZ}{Mj4EmtJO^i94t`QL-LK=;G`}+#Wt%Z{3 zZ}_A@7^%EAlupO_PL-c%vQRx>o^7=Q&zotsyGO@yny6Z(y1LxHaxp|X_~plX6oCd0 zY)c>*Cth!$2E)hizrS<;9&!>L?)451`n&rNKKO`FPFkTaCK;a`$D@I@DFd^MUdbB~ zSmMhU@HfD6{0p8Lt1#)4IDsI-l~-@xdiyQq>kQ@$;)cBi2~$K!DavTxZrK$k@@sWr zY&YAx&tH7~)wdphdiU*XH+$Rr*H$*t-Y5Xo2&yLshbt>9ckbS~e)a0(yZ7I|aeMF4 z(^ogIQfzBMC<4qvgix){+_*IgD=E5cHP*m58YJD5i#KjAZC*-}G%;zt*{ao=l3GBF z(}ZniZ}L133P?zn?NfB)Cucd#S8}m748zss6`CIF=G6%zYM z;(49z-qS~ol{K83?`v(zDdGr#k+MrPxt*n)xpe+I-vGWUGw|fDLI$vsm1dmxP^OzK zIOVAk7bi%b+ zJH0n=zW%{K{NmkL-+X@e;q~>+{z0b|)Fom_q}^z4J$w4fE7$LQ{>7WOZ$JF_^KZZY z?(Y4k8|{S}=(_R)Pg@ahe#zgsG$I8kWJFm@Y^XOhz24QUSJziI#IjcjTXPGG3(IR4 zFIprf@xlE`UPLs1>O$yB*G=A0;Ziuof` zb}!0DUu9eN>A^sWemJqVlz53{xP$`ccyCXS#u`xA7SJt3z$6Wc(!sFldCC61?hp3w z-J4sOvq7b~wi#vCzsYb%2tbJPLyQ1qBa-te@c9hjtC|70A(<;tiSjOIL4|vH!w^Sc z&kX5^zzBhr`4M01*sEQ;b`sAHO*LWP%1A@cr=zO3+f;j1wO7?B7$g=241#6$0fNEc zh3?0{>ipf0E?v9Q$28E= zXt#H_x0UB30fA!gA z>-Rsq^T)T}IoaCZoLi21!&5q^VWx-fAWnt-u}r)AAaZ6H~;g4 zj~dPJIEfLNw63qLOS2t2C;`fR@0?4BHc^3ex?xN_|pY5&o^&lXn}-umWy zdoQ-P@7>d$7LboV{@98YqGD8^B@PuxRA>5ruuKHw&arfRUZb64dCSDYVkA&x zI-Lf>_+T#>4h|pOZ~A`cu-AI`hH2IlX3*psKtRA*0!@B^%#fnztN-~1@YN>*p!`t21T>jTIg$Qb>1Q-A+#nL4cVk1jxTTX zhnN8oU8rP!X72TRO6yG4mvOvs&>K_?0~-(=M`O1AgQwo&Yj5g>rAR@Ajd!#kJ$j(h z==t5xQG33%NgRtJ5f;M$fLeoxm>Lo^!~X8QJI}YCSz{2@gsAFNIy^BJonF6+`co#% zVarC5a()a)eMY2yw_~kAA{V-oxt9?OM*sjTQlvbk6|$ga5%L7BL>3_c3a!~(TG@N} z>|0k}*?IEp=E{ZPNoS!oH|!2VKTyb>qt4a!3-=#Ce)GnwpWnat%~#+0$-R$mUAp{( zXP-A4VPKO!NOfgn><4ZMw^~$6lt#^vcJ^NEwt{A>bsY2j`lY>RPwim1^KiJZxKQy_ zW^)rs&|*n`j5uj4DkRGWv9y-E9~2RZ4BNsjH>u;@=(xzsnFc`@-zj;dC>8<-nCKo} z-UdpPB`IwKf|L1uS$*qPY!Cz?0u&yP%+XPGODxVejOUqP=NrIR*#DUh!u~DoMOW4mXW|6K zG84&bN9LPPhwnZgT|VKNSd@r1pjc9blmNh7>YC$Yvr~!t^?(JRHhgcv3pwQ%yW2ni zDVnjJp8h#su^^@(zNdTLzBi0R3tFKOVPqHn&BkP-!>l&S$U;2f1836iOp;#=Vg-<3 zJQ`>MfAveDR5~mXsFeX?nv1s_~o3H`gMvc6N5A-EKX8@`RLI!d!lV5RlT^RhrhM zij=2ynx<|AWnn~N;n|fXRjD}bIiO-p71HpiMQxBlb(_ph&C_~_^vDGcj1zug`x5~~56 z!$}Zu-0z#wSd;qJx4-?j|MTA{n`kj03F+YDpZyFxkCb93^UOB13D7|}lk;0(d5PRW zM375DGZa4OGxU6y6=s|=SU{1bKGF7^GOuK;A;^SSCF{ThZClF5_%HC&06?6kgP{V( zjCGZbggnyepgU(}>u0|lZ9Uh(!$H4ty`ko3MgW#3XAa88KRFYSGBL1=NRo3e*!c$V zRd#_&cYjvjPri66Posb<3kr((DKC!9&Hdr4JH6}2>FgMNi;TueIXytlVujlxjRY13 zc67o+U-z~07y@IHo!xYQ57{7kS=x-d-&p`aA!!Cbf%Wz>g^e_^=mUr-K(r`oH5+~CgrKScx#3<4|)42#w)>zjZ6uMGO(!iA+yZ}{TSn0pv_jk#HM zY4fCWoJ1qxlnB7{z%qaYLBQ6!#UTiSAP64Zzh@DYQk?f03N@-sB|Dy8p7OFa--!uE zqv6WRaJ+E5&DN;fZC2`Nq^>+cFu;Cewm**6nu~kehga4wef;Rb8ynaE_W7qv zi?dIAFRa$8RZkE>DP#l|KxGYko(J07d;0tzj=F=x{f8fYAZd!g$c&!Ol6)ZJ%}zx& zO0LE!)Mzq^qjs1e$OWE`*(s7O_lO|OVGw9VgW-_07C8g^b1GIP7ck9c1CLWd1_~PMYeVhD zS(b*)CLfbOogHNYGO4Q)P3yDZ-#Igd+HUSq0Tv|t@nAhP%>gtXGgjj1g(~dONrdkl$Mnl(uC^d~r)f!U`s%Sw0Y9J4VJnYBO za(jMj|KR%C=Epma-rcjc=!ZRv{Fu= zl!qA>m4x7ALSOu%_+2dN_g$sWS(>t2yOk=BPegcgbMyJucCX(@r7}X^OBdO>>hj4J zp0O(z=>rq%z;yN&mRd&$<>(~LMZTcOWf>D2FXIU1F}}i~*zwM@!Sjb`$D)KSVgp$p&vy{G547;pfCST&WKYyKX0RQBJfb*D&Fc5y(*%uK7$tnN@FNRhkEB$1p zlg>owr=YE?`tlIJj2VguVl|TmpTQHT#byK4-KP(Z?|vMLq#}%rpxFo$5QswZ5W{hL zIhgs@{N)RkrQ_!M4@TCn(-<>TG9qR0-wBG^xqDy&$jR9*h)PPnSpY~atlfGenrX*= z$WdHX3QUxEL388c&UWI(Kks#(m^_Eq2#^}w)e2{R%_cefzqyrzVC?Ez#5e-m90^jeY(MoIX z;G}zFas6jo4=yh*f4ch_R(;J#3_>glkTbQI_Bwd_)>n%B;)0`cjTs~WRiC#X)^g0 zm?Gw8X{gymJ{}KS?za??u_B;|ywQmF4&uFS)YbwDP|$9AGqYm=ONeM(3IMv$7oPGn zm)gL=`vbqz!w@R&kU1#Vmt#@lmNIANCA-r z1hj;LK#bbD)OcG>xiK6>pFZpDeoz}m+M2o-j>SfhXkS|fAW#C~*j}s7eZ8{!nr+-@ zZ2Yok+6gOWZ9xc9%ck2GW7)AtfwHHP%eegMKyb{o8<^GA(7Jq$R1o!tx^rTz4gGNc z;Gnj)iYqHYYc3LPTdj-VevcnL3=m(b)gQnAtN#8jD2Rjs6@ZmYdZTjYGos*`X|!jq zHRbfp({loGDnI}c7F(;=l~VnFkCYN%QVN(^7y*$1flwG2bfck~tyqu=UF#tL8toml z`n?tK*Zt;(YOArGt+rH@gxXVr=nyw30KksUN*JQHq{WzpR(rd5bYo$CXaD|kwYe3? z5=EXA8x{hRRYasfND!5$g&mfS%Cde&2XaHf3A)GibzmaNbfAaqSUMHxD1sntQmwTu zr4fk;lG@!nK&7&X&54^`^6=!`N}RRYNJR25%3RWkh-ZL8$?fATfJL$IJ|NEjb-%2%p$uT_^WC*gZb z7i}k5UZ~a*tAG_!DohGyTCJhdz)8uEQ#$)&*${@3E!COAL;(CiE5#VcClBw9cb_6? zrF1mt_doH1OP4Nv|6la04NvgJr=K1E=ts@v#np=!n211GHb&TErIoTdrY-CCXSg3I zesSi={p>wBqgQY#@>ay!mE{#6Iyg80LIAYPLF=ePW8WaS!H-6*YuN@yBKfZTgg<-a(F@Q^hlY9Vx$iO8aQVzcqz%L7Q z6b81hzy9j(_V(dP7qn(;iz}u)pC``XDeQlaErFNg9;ftJXKl~yl(l8k-sBh}kRRzX zy9NPf<9Y<8OlpK#p>l@?5(q##+gsf2W}_(37LC_zM%wl3B!fJm%0*3-G5>G^ugD!v z_I&Mvb0gSSq5+)>m@P7xCTC@wf2=?{CZWOUX9hH^UD)bY7k90-t*P(Udf936lD(;qD=8@+gH zjt=E`KR()1Nz_bIeE4YhfBp~f*{|Ds`*Qz*?i{m8)$-!(ty@-QN%AghOsvhINiVG+ zXVT|SFa4*!A=AAen{;(;?d^BpL4ZN8AC1S>=2*E52v0DH%Vi)2G=fr@Uod`PP*6Y_ zP}X{!BwM@7QmKk3DSMtCjfUhYVb(~FR9UQ!1fT#3kpRd_Lj^U_HP*|OW+S2XaK;;( zapy#_RR9D8N&x{XEkP&>fbjYA=e=$hwa$(KC_KA&X9WQ)@@~?5q=x_Ry-)wU`#*Z-M~R0P5y%!c0WEsxbVs%x)CwLhG_ddXB@sm?DZcvUwqnBeXD>iihnR(Wg#YwAWq zSL|9*sB1GVAp~a1hJmLCs%NEtKo;YHNT{N{lRH2CnGE|%5h%x_wBuyN(V+A3M+blX zxBkwvxd1T;+ShNyYnyoKir;KnW^qI#xAaPx?{IeW`ji~y_5^hPrGff0@`^Rwuh(vj}PZ=+Tq=_a8)2qyVjDMMRU>#ZoOVaQaTpfIg60 z3(i=<3;pFOG}Ea!c8V;WwT|+4j0He~P!tvbSS@x2vG@ELAPXT9F$7D|T1;kJ5``cVh-wYY_nVje*650AUF7Ogd!sozGS!WG zf7>(~Gh=#vW`1@A3w~7@0pUuLv?E(Lf-HcT3MQ!mtsz02!rD!#xhF{djA%4j=>P#t zdbsl(w966(VL(E+UHRI>UjOqS{b1NT5gmFnvyn)p8rJ4!d!1uu5iC}oNl{kv0Dqa_ z2Tsv`icx_~kTnFUsnr{u{vaI;C=A@mOp!9ypw^1eTF!r3M9?JGqUctO=9k8xNC-eI zVUU>F{$Tg%gGPI8&`l!0nj(q?O**j*q&0|k3l~vVaw3RWKys64Ol-SWH-p~1U%eEz zXHRx3$2~kc3f3w{&mb9=ZudQy$^vNW)VK<1=r|?0XQ{C2H9$ zaypJYBn4Iz49d)qIf z<0C*81hIe!x>nQenS@-4?~aw(Q&tA(!|T^jGrZeGOty59^EAq$?BW(qTrG-6OJ7Q`T~T)0$iwZ&#p z9A&{q(E^ew24sogcjkmt{2SO^x+Hk#AuU0B<_0QHAx8#rp zr0VLL%+5wxN1aL78;-Vq@v8>Wot-ByboAM1Z%@U0$*_+S3tJQ+C&NKU9tA={L{g5O zKq5X6#%8|O#9@4~HhZhRm^|5%gQJSI#1@f3#0o%IQH@4sxCJgi_7lZUHXq6QB;^jw z^!+xee@nSTPGpHzxV*KCh*HY3DYQLE1QQ;_Z%T-iQ?>LIdR=^hgMgzjopa@OHJBVQJcn~;eKb&s>|E$G7i&zmU86Zo{ zG`CtRLRI8D3NnHi1gij1jH1}rOvFT6d%N}4OsvQt9&7&F=bs;FBS6k{BOodtY$+5H z@Df;y!&~zgl>tAIwQ6faf}6U1J6u>v{ROY;rJ#fmNGA}awjIUIB=y)LT3|dH4O2;o z$SNWs_^r=Lt{E+!H36{M;hNDhWXZ9>mbLc$z}F!KGqYE}{T(H|{iDDC?0@_p4Fl)|8&__C6=1Q(Rw|Xy z3&h%NPOpFgNGtFVC}>`NWmKssL?LFe0bA^LR6KsMv$e0rfAiwwyVCi)txpG4>P8U- zUTTfCcEaHlM$AwIt`@b3jNl7Nl&m%v{BE+2;cH9F-N%mt!z>mUmDP-#YAqZR7Sivy#VnrZw zab@jfcb^17Q4-K+$J@_fG!BSSGO`ttWlI2x!AJ6q%&5wOS5uaW08?|ZwYV(dWq+p0 zzKU5RF*A!Oq-w(T$TkxW3@TOv5Vo7TQg^`JFMA|TwQEl~_p`n#7pu=@XGz&!uTt}?&8pR6NQ@@d7^Mkl0#aNCI8W14p^&)b*YxZOF*C9yK=Fc0 z-}~d)x4!n_^A}L@kwlmQasS}p@c0O|DorN=h%At|v{botX@DfCK!^mZajZ^`2HRVe zFxVaUhjYOPz30PL@UXYEgJU#gA^>L2Q~*WdqOexppxa-rwb%Vt^mJDr zcU7++7$GCbA}Cgqo@;|vAerD(ikXO%BD4Siga{`}%~I}A`J*Z3!{srnYs*xEupoMj zlNd^K0y)JA`b{YqMWXO&fmYciFeOF(@*)59ZAKyz)@n-mB8(&)jcQ=yqkS|M8Bs_; z0jXeiE=83O#{_|4B5*xRs&~HZpKk#FT>h`A4EO0najBV}br&#e?XseQhux4y9x9^k zM^7)WY&65#Sj@nO=NP@;-5S;?bvf-U){)u(Kp~3|l49|!Xb}YV1avAb481|R}B!w>)ce>!-++q!mR`So`O7MVqh5R0Vg;_AxlZ@wvPid6~nC-zhhZKmnZ+q;{~sV4MoH{9D!q6dHfzTx#{m(Iqk0f{O1Z=_%6+Vb5R;k3C0MbrYj zJkJlAyc8X8+AR`FWF|7JLo*v&Ex-sS2(i%;rHh`*sh;V}t3WXmp3GhI$`^C^u)}Sk z0zrv+RIPd^JA1M6XTSEf$~WE%-~HzGKmC_btug}GG_2N^msfYUcjp)8GsgcZ5A{S( zG6@gFv#x&u1X9{VMF6Y`cb+_5T3q(36}JMi70c}8fS4r(q9p>qR^PZf_9~z}CtMGb zh!3{)pvy_D1J8_;#jsWBn>Uv>FE!?Cph8qiL=j<$nv``uB)2sPkfJz_wNk_J2m>XC zlTp-AFnIbfunCJ1vVdTP{Pu#^Y>OZvxyex>)5Pf}JM-Dgb9RGa!GOryk?2Bz5CnZc zn46nJL=nyo5{Pbq1*LlY%Lc!Ns<|`~n!0&@>)g1MDkG%wE+FX8?ju`q2}NS#Chd>^7YF zjS6of8h}XQNq_^N41s6l-PJ3riQgKFZzS>Hi5~yp#pmMyEdc{s5donr2rBb{vWSqf zh!)VWt@xe>@JYKzn{&_`va}+zG)(5k#r zOLWQ$O-HCi-@Et4{l&{yul28 z0{|f_YZ`GheDomN-}98miJ8?weuMMR4Z$P1FhJb&SLdm*!8MubF2nyt#hGLX(P8%Ssx;ZRm#p4E|oDgFJVA?d{M zdDX#oI2vi+^L<||6QEezZnb>hFEV~#c3>2z1dyo)dohiM>DB+``{xW-M+sguIa#<^ z9*@GAnG_HJDKT|X<4(t>DOeKm7<{3y^~x=8Who^=xNc3tO^O0A`^KNQ-%(ZEi;w0*bZtE4o{yNZAGO?7{KP%KUMKKQqUD zjlCfKaI~|JtqiaQIa&&TIEDd%JrL?u%6h3L9!5;s^v&i zLeM4QN{Dfv3LOxf=A@j${5ti>l=;@JS3pvV;{^l;(1w!Z;ql(lE3dx#>95~!`eD=a z@BZ{BjU+-)v#nW^ntr!Cx40n8Y^=(%uB23~$>cPu}|?ftu?hu*d2D2Cjns~fTO7Y=uvZftJ-WB z@Ic5Y9{XPV%H`e{pEDW+)Gqdhr%=fg$VEm~MWYBK6$JxQ?ODrInWq0BdktxOxbBG)Y^e+yWk5Q8wG zj7t&^x)?=Zxv_a=?aep4QIwKuymtGjS}~bT!g)Cmfl0DY7Fh^@9n)!2isih#^MSzm z2JjVa0j?3_ZbP1G(PqRhi;i$sW@9lsG;OT0AL!#6#vVY->+OZ>-C+l~hvsf{$O<2f zj=$*duKO1_0S{1wE#-lRC=Pm(YrO?QBsHO5QJKex+{WarzF}$?2I=a+w#K&a=@g{3 zu_ha9{gVS!lU6alq{J^90t(7}W>w8|L9!wo3*u%*mL@GHFCKsTAI9DNon9KZn=L&W z9vmH#*4@rYuh&t5?)Q60h>F-5C|*Vhm)&&*W~1n>6}y)Zg0R9kjUY9{qr>%^w<>c> zOLMc`tu5|%T)B>Upe}$Q1I^A0-ZC`p5+TUqx zuBm1vAw*!LEP;ky&Unr`&b~q*77!Go2qZSG2L3P^8H(qt)plCh8ufc$eA2jl5rev7 z%_>Qi^5*ANy}?lz0l>fbJ*F$6g5T-1x&%Fo! z?TH=duk#kr@7@5)8xt?J&P#>Q)H8qrn6I3SzzRFQ^h1B76tbPQ>Q;4W0N6k$zkTdo zvekJA2w;qM_v8q)l1x;Qox}w}m|YiJ(Cq^R0 z1qIrGp1XRD!U_XJwu_zCZ=5+8I5lSzn35;vT?f~2;j33KFD}dx;!LaE-9H$foRC%` zV#KB8E2OBGe!63b@X20vL{_)J!We!5)`dg+5 z9C2BRIo75y%?Tn&{%#ehG)lw@GtN+@VaYQ*eEM7;9{VVQqCuxjYH2lCS^*ZT*eGze zYlnp`FS|uwqaYqlby{2$b$-#9*_pkqF+r_*`|Iz{UA^9%Ujjr+AgIvNnRenSGXPNz zhb^VD{WgVM3KPI8vZ5wm<&%sfh& zhgSf_ll%h_utmLz7r>E_m#t=kD8m*y~l^H|K(n#r)=(h>|hZS;KwgX1If>{)Gn zEdqe9M3JyF~KPCdV!9W06+*{C6UYR#U`r-uX-V9E$FH*8L!z1 zjA*j*2vHWB;ku|n5DGJalc(e>27_WP!eMIG`tikXJRiqeB=JIT{X%Wyg0Sl(k%J7M z>fXLA2K~)44kgI zmY4g>g}oOLi7oX9W_O>A5o;ymGa!lpTVP5>H*UX5>lcO=fV8sGP7Q5skDorGBx#K0 zZJGUFEx-M5*4|!CDn2Xcz$3<70U}9iKKQ{8lEZ_QwG}HM zi2*T%0=N{yoU?zjW}663Q9nx!IeIyw`Q>-weDcK!qbxQmUp41mK+mhKu0~1=pr-`m zvF&$+lVRsD`uvLvC;iJu-HpA2_5Fj|$Db{I@o@9b^EaNHy!!Oy^@HK{UfLceBy0%{ zIh_|FV5wXA+f5GVuk#bYf2js^LQudwK3hr=9f+9CiZiBG*5W`wB#1rgdo&KTK~aD@ zg}{aEvq5ANM1Nb?MhT#PT}^c5gFopF|%;0oTrRB|jK0a}wLyN@3> z{K`jv{e!rBgn@5Cgb*0W9TTXOnNYTUWvjnyB~#%HD7Xcat`tt9%n(5dGLS{dHb$+) zFeq}>KcM5hDG}0h3$t&()lr%eL}Fh|t3~6#UzbH~*q>qdlT(fe z6sfwp9By0~e=*QtfP{p^oyZC{hLl2kUJBbfU1f`C(ukOHN`yXQGKgyRN_+EqTn!sz ze)05S$|=Fw?7w2PJM~vgjpXHw^WQX&`V4Jo7Bmk|xepFVCya>JTB=t4nO2ukSs;^Y zlP0|miG^YB!QcMJ;Mea9qqQ*^tB!lk=G-jSF3qg;hNJ58!hWbX-njl@W7MsMu|}&f zAO7NR=Ng^A&QAdUs2&giFjA47l}p$2YLpO5$M+1SDfzD%AVnE#U_#E}|Ls;=;&haZ zgCM9`n$Z90;$=N2O-ARnli+Vy_2(KmGq1dxEX zYiqSDSFK@UcB>Z&0!Ri@gvqWj@$wKBQ5!%R$x~k92)QSGbkaF~^0@o_X*wKcIaKT_ zXvpX}kc~1Bs3h8BC+d3{Iax+so-#%WB0E2UkO(q>6=YH*pg;fxZPr!+q`7zBO%|6% z77d8crkNz>*^{IDcUs1*_RPOsdgD*p*Joo@H98AuV>Cn##ms<$IMG37Y3owdyg9^K ztXM_>5E7`My4spwOw_gNd{Y7(j!r)RsGcSSD2h{MY}lB;{SH*CtVB>rE@43dB19k( z1kOAm4n3DO`Ebh7on3kq0j^ZSW}|7D4KVup?uQ?Bk2~-E-tR44zYLo26fXxS1{R#i zY$ZdI;#5G`WG;N|s~*X7^`OZgL|5WUFd*YR(!E2B@&@J${h(`XB<< zq@(U&>%nOIVfx}J?Cs36Sxd|<@fIHMd^_>iKYaX09bEq5C*L{Z`O(<3mKa4)0VtGQ zK6{RXKHmVoQXF*t5KNXTnMPtkJ^*m@Gn^7ub1_6vh=^nXNa0E6IBe9sT4mfFyta0k z5_TP#47lhH-9pT0j-dr5HeH@uk_624lj(^7fe}kYqoLY zrm8nNCp)kk28fHIIgMy8liG?IEDM)>VR^O6fJz-59*qYBrOAaf=3{Hf$ADOBAIlWC zAhQ#|%XF7h@Eecqa_?^t=884xp|ufjAnpk5n;z?R;O!^9*vYv#^Df z!}ttQN9SoMZ&D|R>(LIzd>9-%_^6}3FC33^8S>d3y*Uap)(-`%)g{ru^l!`#MC zAH2DruJlb{Gbya(-iq@j>wE+F=b=I57MVg0gL&DT0A6tIhQGeSsFdlp6-#k6Yfbl8KTn@L zXvgLzH~;FwJ8N-JNzrqbTw(&(J7NS8v0uU$km;6vv8tjQjd)0POLGx@_u}pLfLB|y zw%6VJ#m}pQo&o|1`he;DY~$h;AusC}O3`_r0+|))i0b=!6VljB%zA6dQJ9Fz*Rcmu%l!%hd(*!KSjJdw07+>HtsjUERmHRV=8zSTG=RL5~Jp`N{ zEjVeDwbSGE-?@8>IYWmEI4Cf=fdFX$%}TI3`|daR;^hvnNqXd2b;dx^5J@}-*m2V5Qp4hZB zUD*gg0E82#FPHirlPt^$;e7&#!NP+xEewa#j$b&1a0HyHWKUhpmsh>X&I-BDi}FCj z{H#TaQqYwvx9abH?U1xZLK8Pk+B)3t{P-vF)29oOe7|z>kC$!+!&D1d0U$-Lg+o*8 zZ~jph8y=n7{EGKpc&bRqA_@^EcC)$Ah-I@n<0l}a!ND*7p*0@*l4{`yFAmG3>1SPaJam9(Mk9Xc0>Ggs23?s8k6?WUz`2pa31NiF2K&OZ(MZ@IF zBTbMRWTO2r4Y95fr^kp&`ho%1uXhFE&Qu;__nUWkdfi6sgU z0}1*J?I_(m9$!6*7ske8YZV+LalEWjC=NDC>M>gLHLLk9$;NMD&?E~OMW>6%bZcm$x7@=&Gy z;q}>-W$VxC3Z^E0`h4`+XH~GkX#zZGRN8O7PR%wmyXi48oFW>Rxjkk3F5b^7OYn))oS&CYB$EIDn8Xgak4ykXi2zc4 z^I}>H2|!z;4^P7V<7j7JTR&gF1`@SEk!=dbe(;2*F5$6R(##R^m^R7(`xJghDY>=0xi0gu_UMhmi7 zg|O6|(ZUV%ZnidB6oMeRz+C_fh(g&D=weV+CghHjWH1~`QSxP_u5Jah04E1OlX~We6x^ zS0f6Zjug)z0FWbZ?ZsSx{8JDw|i@0c$LjKE+ zo8Y)jghWOOA$S(F)-@e8d+FC!E>(>v5FQP?pML5e9QlMwXvhMWF3eoN%~k+`EDINs zeg}}ompvJiOF@$>T&M(!K{+sw0=nI9T)Ny-sDNv!!L1jwJ16UvI>d=$D`E)6B+=UJtlt}N z)aDwZYoccxGo4Pa8Pw7wQCf8&9{GF_cN0m1I1T}Y6bNRqHG*(%1UTOS{`rytUQRPF ztB>HEj&JUbE_97fIRZHlY`y#S)|H!##0czkILHob0DP*@%S~6gl5lD= z!DjLn@HeSwIUhFXYnhb#DyK*2XFI=6i-O$7h{!^&^May8G5B-e_-63VI|t;U5P?)i zgZ9DU@sEC@j*k}x{I8c@`o9vL#GZ0;?Nbf;4oUz%MPusZK9AGYEoFyN(n#Jct7>ohYDRuYw3Z7`GPo-RJl2tE`Lc6Zlw zC#Q5s&3>HRhbL2Lem6>jiMpzU`Y8{++<|XW^LzOph?51sTI-ujt%YE0W-E=V4rCn7_!S>ehyJ)G_u%9Q z-TVLZi%#pb@8F0OflB%*_%{DP{9h z0Oo@6vUl_hf%(hJiYv(TwHY(Nm;fq^XjM>u^WE9+{lT$Uw@^tD{4{F!PELOD(`4&W zYZ(90+|~bT`OTR_39TY z$cooofofnyI96ud|L}e9`QwVDDa%OIcyVd|8}A8u3WS)m7&9sN>|ajlfuaC#0c8SQ z9H_GN#c4b4>CJWeb33)?;Y8~|n4d#WZSmQ)$z}jf^aczvQ7Sn+mE)73am^{HHd?n| z>-s*U*2Yv1j=oNfTT+>~DAou7Fl&Z3``22_;n2*eAWS%nrG-I5SG>TBtNL$`?)*QV z{_Owt;@6*=!>(r}&@f4YEWz>4U*{XZS2zgHbl>H$i;_I12+hlf!dL)WvKfG7&x&FP zP9U0W(;#YTu zmrusE#0ucptM1imi(mh4IJaR$<=tl#5TMClhNbgI!DueA;PLFF@M*E+S<{T)RN9}J z4qu)sQ;|-CoasnW33+0J>a|xFzyBvYt>&0C0Vo^Kj{3b{{k(VQi*Pu)&Gr9!^PPne zRZL0mQbzFSK>af#(k4W+a;q!f28t<2*|z4R_5iD*t~Zw!bd9YMNa1L2|EE7{3{FBG zv*n(s;MLdb*KTq`$`HHwF~pZiY^8}bip$laY4v_Nx}`LRdif*BDg~U1l5{MGDIw5A zcPd;MhUKLb+XP%XrSd9{vjnKnWAGZ+Zg`uQBSKPK>GoQW_r8HM>(;laG02Q8%oR{| zL-VQ{rdTI`7Q8m=wqFB;QBD20^Z5UJboXcJ?r65^&$OzImI?!dQcgHNSO1)E0AKYP zfTjGvoa#!yq}ISG@=dOgL2+d>TVWEwQL^OK7clfB(^Sjc5GPZEa4d@C z9Fb3Xj%T(z5h-73tyB$gIq~Nc?HhM>)6xAqy&wO0F&YO+Y#Dl$M(dmJ>4glctFciNvUX#dFVmzQwhOo7$ zu-;mF=WC;ST@=*_!bdx|dUV@1>V{GhB&3vyg$B_^eLgxkS(};X?x01%Y`vM-)KtBD zN#{RzAAe#yQL~!FW~DYa*IpP{HiWFofo(Z+=7k8iE2PicxVPXLNfTS1Vz&(Qu># z*9Hq4EetEnoQX!VAt6r^8w-()dyhHf8P00#oK2^h#EwnEuUth*TzHC5P?QK8@i#V? z|KiVvOUpxx0^*Bp4ElWUe)q!euQEHTIA}KyWlXR^y zPlNcC_01;_9$i}5Fr!2x1!3h-lAm;*{Iv5ZZFrKHg-WxAK`%;7y_OOwmW(``^`_2e z0_PjRS84=v8qI=na=K6LR=^w&M-w_h_AFZBSVOAO0$33N25Z`3BUFK~bst$B#K0{N&M;iPSoO4l@lO0wIwC&|n*eZ}iOT+r!)Y<7UdB6tn8-fUn+| zd-pv98WkCh7L@=AlDI4sqH#1HjfO6cL)fYycN29 z=CFArcqyt6UwUPOfo!oago#4A%EdW-TnHATGFF01m)8FBFQUbjjsOY-)-(n~{qSk$ zgZJh6)?y5Q)V}hUt8X@XHV`BhAYv#?qjCx#R&IzFnFaXrcW~CN$+~2ahbt6TK0sus z>9D1P8PJ=x*;xrZD`+gTG5w<#fA<4#`$fp9B|Jv0Z`_`L{Y}dNq<~xkOBR1aK=Yg-i5#JjzD_5LTHz4z8T&mTQmTV5IV z2k5J9fBYYweK>0B7?KJ=T@+iHxx8@#)_O`w9yRGycT;Mo^Vj(X@J~DhkgLTlfFR|> zHkh7>=6&1g+7tODb5p;pDsI?p} zO!CFSeUt)3s7uFl2643{d(6$)tn|~j_D1jRM4LO^+Bnvz1j2D+A$<31!NseRB5D$? z&{^sguv10?7|Tj)qD+XC5H75(`hEb00aU3`hF{h_KZRA2vtEU(uFRt=>fSv1$+Fu+ z!2lu~6~6M?+F$0GB9Ja}ln_?(|_Esx+^;p)G;_RZxkhL(ts06`cL zGn?BK*&-{BOS^k{FyqE8l(VW8pyHQ}T9Y%4pa2*fFjft&Qtd*}fMM)e7D)h8+1cs* z1*ftS;f#~h=|Kzrj)bdXdW3mZQMdz3i2$eE z8hGjhWMMgzP>l$Pj7a2Li|xx-WM!iVUO>9i9rzzVc@Jh6$I>8el4NFf1`V$@=2})? zZp=OT`19|-_uYFReEiy#SB_rnuU@=(FWUbfzWC8zO(G;_fY@v_=3DK#r=xyS^(}}& z5kf%`u_DviI_Ix1e<}QT|Lyrz_#LdkSU@o|jsGcYYp%?|JT|d7MH3MTRt#Sl+AI5` zwO(4WnJM4X+EeZ+&ly%IC}KPrD;|R#Ydf&93OxaE`9}nxkV^d9iRiir;FzLxWo|7- z0gV!fXk*0pI>f!Ij0w7BE3k@Ls4y0xh%{<-W^0)_O%8YVPM&Y= zJ$;10=!Ec&e=1le8Q_`>GD1anx_ENGU;`HPeu&f#?UvvBo9nFHKk>NyeqVE(et96}|3s294O2aTW zslq(?C7)oq;V+327NpkPh2Q^vuhlk6wZ?Jy+5MYe?Ecr)_4NcLjt_nF*DpTR^Ubt3 zd}HxqcpU%XYhQct{)g{gd+lU<_v)pqcMrDi1ik;?{-;MZVpNhO*P2TkT(2*!^k2Pt zucrHf<}7d0T@L~zI7dO8ZvbD_22h*>uj`LMiRggGrV%pHki<3`b5|~FFB~54aS~}%85se{{UIh!Ewca<0uP62 zx2rW8P6-IIK`51CY|obSpK&nTE!S+JF@ZS%p0@w11WNB7!;=+?OMe|+Wl--7x2*v03fLS&ROz_mOx#L3^5HS>zy z9I$8#Q9j>hBoMGbVAy1z3JC%-8zL-{+(E%uY%dzdxGTSsd>eT0E zaHf%ZK_8{DH1D%Fe6gj#3X(z+v{|OaWR)$8)5_2goF@5~%M>cUjwRIR8Idz0FKym9 z>BLRq$6%6Olw+gHssTYl01b-4TmH`P)9ssG0^gdsy`#BbeEwH5_a3zCBV&jkMn@0z zaJPGOac;RXJ?g(dcz$f7R;|$>&(Em*Sx9^#3&EUP zTxQ`Cxd{2ps!Bj2qCh<6ia;fis$bb3cG8*_FHAwFzTdpK(O6uFy5poj1dT}IB3iP| zjGY@;P!p4~CM8g;boQ6ClnzT%2I;f*fR`EzPI05AVU-iE9-}Y{5GW($FD$P7>7RIC ze|N_VBh)qF1{-f{YxK)s5AWR>9_}@7<78Hz=*z_xMtEKeYjr zIez8F7HQ@3i^{`=Q>WWPX_j}Oq?A@Eg`2Nz^eE*v2r6Yo)vw)N{NDEuD^<;~*pL06 zef0e<{AIY_?pbARq~w_lKI-p4pldo<@N2W|U8v915}2tsQh<}H{Pz!j`iUMyfl?Nb zB#q-&)-J0As6QS<)!%~AC!@pnJ5P^wx-;zT_Kuep zm)qipObCPm3XwpGYad|&UYF?z+uRy6Da}zMRIG#+$(Xhmc5T}81S(+)6d~!k#n~%Y zgfKcdMq|m%G8I~3U?vbDCz(VgB!Em(>J|eKO(u~qFa7!9g#eJUKmy1sHpovc8HyM{ z1hoJn1Bw!`%?~Dn+LY(2d52=fJZ034p@j1+ z&TPla##k~z17YdLqSCCjh{`~Bp8$~{>6xVqfBBb#)FGkEyd`*%haZL^{WDoFJaU%&C% z(b~$BrN&W!OhQB;T%izzQSWeT?`tbp>f#YY)_8Rovn-CWH3$#Be5w8D9gkm zpxBKiF>G9Yty3^Q9_JaPZtr{B4g-pTwM75@6G() z@9no+$0&-SE#U3$=;zON|L*US-5rhwHW@b(zMa(nch|r3ifz^+<8d}s2LVwCfQms2 z5=*9b<)Y=|4myHFCGs-1-*2fl62ycRX9o_3cSI1q{CnoMYUReFc{QZ zjnQye3#&FsJtPERYmq2Ido=D>mgks@H z7rSZqggwXjLytkT02m-H#W>4-k>CP<~*Y930$HHjkY+mD7o( zP7?wUI~jvTK@wkr`h`FFv-Ikf4pKl+eX+gr(W5^aRKBI=s^c_ZFd!z>@9#Vc*5j3kXgtT@`G6#;hmQJ2R( z>C|Tu{(OxPD5b+>Q`1wJ2R9?h;vF@xVn!FWC4?*%*(#b@oO|y(^MCOD^wQM>(3Vxe zJSW!Nz2`l9bnvU6+k<_yF@gE*POfHVRpQ5iLL_ zA{RsfAWVfpA%GZQ_8COeR1KxRAYbs;^Gq-)~Dr$I9I!eEe$!)ooM*KM?$$Adww z)#wiTm1-?9DJexrB5cGaz{km0RsFs0apXY+hDf1fz9B@NPUwfK)wH$xm=sj1iwmp6 z{XN?`CYANAn1tQC29=|@r68laD*ns3n5T6@S?q8**k;=G0uxVS*PzB z^H#jmd42uL&i0mEUHrd%^f!-#@sO;j3}6l-O)s36>iRohySrT9u4+SB{=`IoQ3ev7 zzs@&+fBFdk@*tEmah2|iQ*`L8omzOZKnYb7bD?Lh9>ps|_ER_fEatxe!UV`DUf?HU zgI29S8dm(E*Xf2j2x4C6$~R{=8wqKi9B)epaxOdzr}&Z6D7A~FVmoi>Hgod)uye^M|`EklweI7*Q* zC|HPWD6^pwAOV3WBm$iwDbdsOE6umRKKs4z`L}K!S1KJ;1kf<)d~Y!LkHHPLpdilS-^xoo-G?!9ZoFGbNS0MFpsBPr&NJ$!~7_BHUz=_yctax}b z9*n?QLHX|?*+5J&B4%PmsYb#zi9mgbwU}zHz{eyldXw-MR$E|v^(>-Z6oBe*j zTB#UoG${ZUg@)}=k|Cr)qqfyKOg%ErC`)8LP{8s2aagamR+m$tk${?+X>KehyNBuV zk;?I@1X@`&A=I8q?U5YoeTuYQ0yF0k&-u_h|KQ5Uh3rltdReSBaXIAVjJ(zs0fT6f z$wDym?QaF&{Q7|o6w>T?JpbvVckUnluV=0-_0uW?8jD1XF!tra(a!wRQg>_T?af!Z zPj+ryyt?!J`SR6^|HGZ1eE`QhGO`|JDMKQ@qFM~EU%WluSbeD-Z-&je3(-g7Mu|#A44#$1 zLM`Q1%*!z}S>j#?#e(m8AlOA7R)Xr%YV-1yaCKb=_0)=GVGCkKAqnK6kNKIyvFIm> zvxJZXEK0DLhegCQoJ+hN;BN*A7Q(;GwMRk@5WcuV52LYH3lI7o4m?9BihvXm zvKfz#k7N|JRu>cPjRbA0v2tNEKJLXwCmu2(gB4=5$oWKDigX?~@yC1}gqMZ2XHl3C zX>xF!gv(&LZB)#8%5kANdn6~HNT$zatj>P@o6Yb3{*hPl5NB-aeSGK2uOIyzZ}oaa zRbx$>c&G$nz)3%iMxGoT9lo}CZRgRGcdx&;{cLOX%7vdi|KfeG_kQmMhdMvoAPIO@ zF1MGg#pKm%&lXx^LQAF4XqoJI=PjV$<)zOr!S8~CDC8m;CR0jz*^?LmEDIlr94kMs zf)P@Zk%uEs#R>pK*gbla^E!)&gFfJS13RDl*i<}j6uU0EF1#eQ^Q&i{my|FriY*jO1is#FWo z)Sj@C+D!HKZ2ju(#^Ju%*&aT97QJ|$o*Y0LbHbGQqVf?4Am=n|%GM;ze6#L~s)8y{ zmfd$~t39Z$zR`y+Vx|xHcBD20jWx_54$hyi)SYf9}l)3A|wQgEhC6R zAh9~;OSJH2W7QiO6j6Cf4WkG#38sRB8f{g~|NXNczdzpFgP}#ifi%!>Vz5@5UBv3O z`rPIEY|lNE?)2RTfYs zGq6n00}8G!PIIT-DJ?&>5xEVU910EW2@v(wZ;8M8u2^)zqxiOcc-FxcI!{M}&s*Go=*&TO?$jzs^qpU(pUwkY3Qy2{7|{ zX4P(n%Rd#CTN3X%D*($<1ecG@S|@2Ipq<9j9d5J5GP{R$CF~A*VZAzzqDs96qjWWF zU9Qc0DIkDv5gAw{zPoiw6V7?T zPOLk$(_%;zxqY= zjm6gMBUCM&7n)+g}|Hb%lCrm%xds1JX@1As4TXV@^SP3hGXsiRj zJ02Pz52C)`YHW8;h5?O*L3u>vYoAlrT3Zv_;}e~xs!`RAMr<*y1hbbelJ_-`fwWsgl_w@gF^IzJKq}2H~I9S7*nT3@cIrdI%DM8JcmTDYnKkH*2-Q z@yXiq^5bVuT5F3x+<9EH)j=b;>)Q{4=zZuvtYEyp5HHR^yEP;ct*vp?EeQZT5lZ`d zG=fgwoOI%ouIcv8uwzDJF)14()@J3IQb0;+t-}zjO{&+Z*$C(7aJHq|vs`VMP{#n4 zDMe67%Gef?8uVcQuz&w<`ux%G#TLb5jz%7$6$=Q8K>-G!YF4db?OWmczgvFym8eop zERZk)2{K}=DOS*_;zMur@3%ku>(1k6RWJ*)esflZK2&_KQUM^XG!Y`we6{6A+@>HI zjS#@bNfM38n%(W^sTm#b@74mH4Eyy;IEvy*y_SxK&9E{YMGyv291&49;R{mvtBY^n z?)$IT7inb3_qyr03qDyk4PDC#65u4>D`;LX1AR`A+u zdTqVqg;wkwr2P4(dq4a^y1NBvd?B%#MG;seNefQunMhH(n)8DvzEo+11&K)@HYy`P? zAIc)sBD%fk{}+sR5u3%yI(;__paK>FRsdmY4T_GX8rxY-R~!D+gBMH0&a13h5gud3nj5mi$*c0?kqD_Kvf^jM~VP+OXK%g{gt+bEYi^EWS z&yq5zQUxg@3zFp!DU6ef(D-0yPV18=kId2j(Y-si--URfMc5|fW189kmCx8zK@0ub zh_B5oEt>ET8=IGmM`;of35g|06b`gL44_l@o(1Mpk^665hsG=GtBcZZC-tV)WC;_n z%wmO6P*9!=5sMb(Nybms!kEOKNu<+hbvxs|U30jWqUZPzB#U}U9v&-P_TCM^^3F1hd=&l=kt$}w2LYh)GUND1>%>NK@cd2 zlxO(3TW6|6E;0?!bV+T9rKY+-E;Dn-Th_v4Aw>}FZCqG;?>pX=t2;`n7}Uli+TLDy zxP9Yc=YO&C`r=_+MH*Y9lmY>#n=>XIC8K7&aewbcYjO7I@SVwr8W_6NOoqq#rqRkT(tVl0YsO`SqwDH#}9${b@N z;`|^o`P)mP)%;K(S@Qtc?HR=2ISv_sVhB&{GO61G_*&!2NBf-@6?m|_^UU8mY5UQ9 zGgw_2SF1_2YM5B-*jPek*n;xG^K}J@nTV{l2tt_W)#jrMwv1LZu~-NcR>11PDB9nz zSu=R{!kip$5BkHCBTfcjVr?xb1*y?0FmXJi8=kRqUU(sFw<3A#%H?F|BZ0Dy*2G%AP0 zAVdO>Du|%hR(z4FvB7ABgF(E%6Yp#fx3}ZN{rLEVk~BsJjZAnDkDrkD)BXE@Hg{vU z*O{rcI)k3?`Cb}VlpcwlX|&A2Hdet{>uFl8G*x0#l=+7DMQ8uGD#n`O=XZy_?uGZP zSzbnUE{!o?7pMS zZN+>H07NK+tgzW`dqO9N2idYsyiVzY8cTTr}B8>#wiQVuUU7)Av zKZ!<%m)R+FC`)mt`{pZIAG9IBx*jh#CK-o%2m=zGkcC9)Sj?9(n;<~CWb8vle znGXk7R&VlNuQuPryLwa$jvM~52WjZV2o}*2+N>9%kOd@5 zL}M1CNh|{*GFr+_VL%BB5JlFlGUQboUbPl3Emm&5RvX9CJvPsujPBnbJbj#=oUlQw zgTpk9n&E@)-a>ox@aVYFZjDC$Kxv1nV~#fyI(Di+7L38xJS6SVxMKp%)amUVdsZWb{_7fpMP=v*=N=9E3gG9g@m^wo!f!rax7Ao)nfFA za+BJ-XdD-SyQa0Y?0)p;f3~-~_t`Ig#a9;%NRI^&Nk9t=cwy)9qm7^b4DTIIkVqJDUtXVNRW1PFoCuJh76{Sob~ZaUS4Ame zwP&h4_l=j1$8i|U&QHMB#A>t+!Wu`$23bZoRWV9_8J8_rElFvKGJY`Y(F=C^6@eH%?R<80(wV(?l8t7({?j zgg^k8TI7L4MT!ZL83dF9%L>o}GP3}RfFlAC4eSsFp+c+~Gbe5tdX zjXH^tPrj0x*|n+nPZFz>mBj-DBPBy z>-iV6@lLe4qoXg1tEa`)MU~|z$96KUudX^j`&qQT=Xd&ZkRpsbKmUuJC!ZEye=+&$ zv*PG2=b1(Utr!Vx6Da|Js02m8ft}5!NU9Y9Ed>j(;3nWA2pX8h5vejwpFe$mb$;a; zA2n9C0#u9&bd=nGu=%4O)5AxTD4f?ERkmAa?(8i1=4kin@&DS}`fs4KS9>}yJ#Ff; zVg^s^Jf9_DM*xLUDSbA+$ferZ*!t$#H;+Gf{EJ`z=1+hAr=R`)cN>rI+ZQjH8ALTL zi8#9vc0*;-$RBSF(tub=%k4n9QMk$t`r_{NzbgRW=Nh1e#4J=kvSi&50m}ki(`trR z$1jaBwuxOAgi2$j&@E<{g1C_EHOd8Pk~YWzAr-EQOi<3VpkrF;M$4%|fhGwYmIkyo zwWj?`m)WkZ5NJWaM{es3vMhy6ZTJ@gC?Me0!^Q|8Ld*yts8Gar(k*!d6>Iac4pNaR zmlqhnJ-g03{+pBW%*@`VlXJ<(bQ3yIDN49tHgV?9sYi3 zj$-dR(7Dl-rotmJq=*QJ#Wi+d1MCT?+Id__U27JpYN%^lbRH^<#fHFN+O-Eh%L?48EA1AKCeM zHqF2MqCUHfKl!x#qaT@0uS&XO1RQjGfBqL+Kl(xS_Eq}L)A@^Ucrt?8Ek3_YlI>4turH+2+%rB~A*~6~F^68zHp@cdYU6n^>365+4-X&y z?&~jq{>MN6#V>yGM?d@HfBxo+{jF{P>>@`dKoJQ%laN;_EOz^|L0pMAY&A*?Wt-_MPHa&qfGL<%b z>Sm3{5_o>ab)>y?nhkK-6o^#2JYAtq#N*>$c<-ykst`~XNpT3 z0*oxcLX88s;p$ikQTmFuF?eKxAH*Sh=5?wu>Ab;_>jwYw>~piR_5A!~rq$(S#)f8P z!Af#l8*JMR768LQJiiu12cke>#oaKb)NXc$*)-ks`+YCmF!5f{ORQQC5>>m-T5Kw} z?Z;kjBQUm>`LO#e@{SKTKI`y{_2^whXR%Iw&$W5VSQ8+#1`aE$6hmEj&dGG9vfR$5 zRXQoBGcF378RiR^rypzkJZoK9R2$9|Km5$|M#0u>g)6Mt+f}gzKrf|{QCIWEXFG3 znAIAEJ6>yx0Isslu9s1MN6^=H5R_(vcA z{g?ldoufd5b&Al`I7qs6l9Z2jFNvM@1!-}`xiNk%Bz3eHlHOH-I~nNrVgw@)7DQZL zv2UHfA`Nc-hRs66x9yk2f{wQ`{%_wE|I@F}|NPjl7h)VBiUZJqg22+c8X2H53Kv|@ zsw@d(-yxv_B4I{(-{-qDe>E}>{1)e3L>luI3O9R;*1y}XG1{^3ds(>4V0vUgZZSS> z@gQUoZg83cq_M1P@YQiP@&=vD>BI~>-<-cIWA(O}6b8q6T9P}Tj?vSzA~za=1qGdR zQ5{uE&b#5~>;Bg}z29`< zP1nB+b*+d=u?QnGfCBQ6LlRwND$DY>?+m-q(L2Mo8jTUyR<$-wc!T(Xm#2B$>E!9W zH|US9Mx9PC&r&}KswrRN7% z^GV$czPLUvLi5G!^mp#^on%*aVF__<;JSm|pZ%GC@4+PS&HCEBvP>F{j=)7_Ay?PM z#d&#rTwk8$qcfMzrL4g@5C&lYZpjj`N{{9n(1TW>JQcs7aczG_YYmamuhbc zARv*mL0;&2s*aDgUY{Pm8U3*tY!$LLb!(^+M}2Do6L>@f2u>7fMar>L3LB(pYKv>m zGtI}7t7K#F^wslEKKbPLzyJL4M<0K4@$Ogt?EiG}yGf)F1giSuVB@2Bd-~|!@qhQT zSG~^MCjlTvR)FH#0Qvo(UpgUIWIv6BpBF*YvVh#sN`|T+ zBZ+Kg{NEfE|C?W5{P|I}UZTfHAWoPTIRlOMnj7#Jl2bCT3SsVtNfUL~GUmQ3S8H_y zgoy8@-8Kb4nn-a%SO6mz_(WO7bFO}xO~FuP+F~OO^9vYQ5Ey`f7yyyVy24Oj%&y~p zaxoucXy&deeVo^o(rTQ}O5jRtl*DE2H0dHOk|?UGG7N*dC4|lUavc!PP)T>k!L~NV*u333!^ko`y1;QXP5UL9KL(~^4^0-?_R%ITicwC z$A0J=rRL*F(upt5-uAlv(eZhlbmo(Ju(l>iqPI5ugL~W=K-f*SS7XKKkjNnsYoD=$ zd{A-t&CC5)$0z^%FP)vW-@g8`?wO)4??e0(TKhM8^8@IvW6&XAGep`{b?q5*o=&Pz zKTogAM1M6s{n|}lLi#2j%?-~zEn(~rH{$z;c(A3`xBc~KB4~*n zp~EKHt3klEvwv94?f@Zd=wE^?z8_d8s;w@#xa%}TI9WaGzrzu>+8{4xSPRtz3UeE0 z=H%Pcq~@i#-E`AJSHTO{u>w#6h|VFgxX2h=R{Qaw%AhcnZj&IHgk0`)1&OzL)%B zC;H{O_cm4qQYB36fE}?5g~KX0*R$;P%kunPd2#`^=DG}`aGK8t+uM`rY_PjMOVj?| zL0(jGx2v?57v<*e{@KaNlb`(T*|VpQfBGjcpFRKZ$3J`f^3D4F5Arf|TyJcypB)`P z`te`9_~z;U4}Ws{=JnyHAH8}0EGX0T&8zC`r^(^H+&BG)AG*QXJcx28AOcM#stRC2 z-2ds5`N3MSZvN#z{1t@6b=e~`q;OrwULn0C2%U!xe5JKT&yTpWn?Y}0l|N5*j;cvF z+S$+J6IDLfgBQj4MKQguW;UIVPhQg(z2V`bu?ctn_>ZT4fJvtiQ)@E=(m_`TU9+~Q z0JN}i)@Sx@WmwS3%C}oYAt~iZ)rv|@IRFcmLLfwC?fFE`1!WnG$NKc#dvlRoj1P1E zA@)8toAvS4et$SSzuXvZq*vq3;aZgyk@gF=bzLP%*VRrbZ5`Kj6$C!B6N1{>Fbq%U zg0H^*{gS>fgM|wn`T` zL_h~l$#(#}5Ws@7z={YM6)0(pyseU_u?^g$T75fvtEm$#-0*n_z%?SJX5s|ASZSa% z;j=Btd9iI4AyQ3qP0*%&x4i>4YjI)ZrV8A26e5VkO)3tNvre?Gg^9?qbIe2}&Ke@; z93fhEMthZWs)1uGa%{oVp4EoMs+y4%=)yNAv3k88|Kq*>KW>Ik`{t}mr6R1Es+ySn z$_07K7e~eG=kDEces+dXp@34xi=r&gw-4`~TwNY~@WI99_1f<4G)=pM^~M1a_d3_3 z(cb>S%jd5?{N$r=zW(~d$4}n9e7&{1Ga8Syr#)?Ezib*qwK~-Caima_1%ET2Ttj;)}823$a{T%YI?etwW znPXid=M0!6roYzv;Dd~4{mG|!=a9Ve7@m#jia!i{MF>u|7HC3 zsaGinpGIpRb@pcW9~}R?KmBb7OHT`PYkFv7ni`Ep)8je-L?XEx0l^&$=zDoltNWzZ zFi*FX)-B|6VYXlBY8H2CT&77WhQRXPoFAVR_hz6CQovp2J z{8p*C$h=zuzC>g(&;L$}kt{exOTQS&?R@rz&$H-1NN&PL7VM*CXR;8Nwxy05($8X7 z0Bv}JG(TzfATOjr1tZf_wJ2+^Y!TO|AF7VsYaJ^=#$oAoCHbN0&Ly8 zcQu_o{>e|@onJip@lU7obo=l@4a&rE5XX60Zf@_Kot-~;{PD{-uOEH#$;t7_?!Eo% z$vElv7_hXq+aFwCU++G=|MK0N$3Ob?)w`p|KltI<#ntWyAJ$swIPPw4RkhvUTtEKe zb3e_?v-81lh@L`&!UCiOsUplo<8Zk1;fGRMJxRmy?8n1{Fs(bD?=vQ%JVt|PK!IZq zwGuE$22?^OL2uoUI~DBv{e;b$*XyXL=S5^i19=4H_-cOqwmLh`U%n__KF8BDKTR>8 zCkoAUIzaU5(ii6;pg0Yvgbf0L(KE>d-%tM2 z-#wh>duP-CVdKI64DM6hbD+{{t3NzDK7Md;@A&1L4<0R8Oi@8y%}4@ce6C|I5Xz!lN#FyAp0~>}8K1KHut0 zL&J+kS#BKptxiLv1s&mC2XHq6`W~IYi+J$%V%&PK+W!O~fQp3M8NDokJ1h;Wyp<+6 z6h?3)4uypsfVqK%-oC4}XRxpc5_;r;Zl zH8M2XImBjazv3WUS!^I800S)d#0&R7udo6ZRj7%fUo;KN0TeN_BGr5t073xF3*sH2 zI6)u;0VH8jh{)W?)`^fED+M)*LqMf31A5gDfBkUn?+>G24TF=8pBqF}0-$Rih^V9E z+0!rb*U#O_sqffwl?(>faUAzSDe(RE{@P?dyZ@t~o?MSU{MpY>PS4g4AErg&_4~H2 zE0E6G=5#*aIygMLx;psa$-ASY&E5UcWSp$8&*yVvg20c`Jn!x7UQEaLo;-Q=?%lm7 zAD^6@Zaw*Ae0kZ~yH}T`Ez9lA?fG={WcM##e)jtg$jSff|FQWeKhrzg*c(h)EGa_e zJaq>3tT#OPpZ@1y@AvDk&t8A__AuEg=Ot-nr6y5`Mwr`lE z!~3@QRP|16`dTNKy8L>2I`xCAJaf#&{H+)>di7$~=}8otK_9~?@Iz5rC9w@m6vTC5 z!#J*Ojf7=YMqxP5W})ZJ&(0((v-69}Rf#qi$Hxb~UUqu+r~41foR@X=r=Lpn`#-U%3*5K`ntDsii(1K<@4 zj@;e-?+U>8`C_@9ejzs|;g+`9itAg~m9(iR%dt$;qcVXda3oBNSSGmnuQ!Se#3jaA zxCM0G{GIZC#M9Erc{>8EjfoF}0HKY0UB-1S)5Dt%V5O)mI+r$Am0=k)FRkN-Tca_y zXuOst53A8p3okUu!ZxuOhzTG90dp&m1rlK)MZEA-!y-)0Dm4zh&o<2O?hpR{Uhh{M zdJ+Z#NaBE;@2X){&wlgk^!J~s>yb>Ze2tE{v$<0hwzsxcBj_mdl1}Ml^Wlf1S-N@u z;o0?gu)9CaGQZO)N^86jQF80TUVk#rdK(+(S674Wo$+MS>GkL7+>blX)-_9zbkZ#C z4>ztZN87viuCA}Uo7>~bG+tZJi&A^BA0}m0#+wf&v+GCy<}c4)yx1T3@BZW8_3k}X z_Yac$_wpbt1qel z2Q?!3-i+ChzP2t-l5{@v1OGZLdi~z{d=?@CbEhaDZtoVyr+>M7|KjD*4p*!TPHQcW zK`9hbNDTn1D64+Ie?Gk)4EpcN{Mp5^+UkD!;^qJN(VrZh96#PUD2t;`6a{H^uivLy z%5Ea}c4y3JNI-5Lwp%(-ToJV1H2`-bpzm)3+yd0T^&bQn2$Arn8Z@dP;rBx#0RhA~ z+0XdNd2w%2CpCMF1lT0R-w1LRyIckUh4U;m+EAP5LN}maL=tTN6}B$U_V+hcg_)5E z0HZKMAOa$wHicjr9NWH$s1dn}Gy&wzk_`x&gP596pOzT|P18b%(2kSfrU1~Y5qeRs zq(QngDZ5RyvMk7?3w!e-L%1dQL$1_GWIo#p{_*j~e>&{_cFi9p+A3jmMxdMJ@yW^f zKmG0evtQ|KR%dA#hXRrehBaV!xFO_ugT9Jlr%lu!)Yf%|YiU^|{eDqZK@?Tid0xT zJRckf-CoABw!JqiiuLW?>CrKy^Ljjr<5|uU@V9ha^y?*}>Z8#harCdk3S7%X>R}`v7IsM7un5xxt&DaBSnfV6pv1Si~6I4xwDeC^Yk* zhC7V_)E1j&o898anqor@E(k?fa;;7h^ZRxGpFiyX?Y-!Wb$=T976m~(=D{qje*4+= zKm9}b>Y2w??aF9%TBm)#W~V%3S&Z?R+g-P1 zs}(uxP?2-B?|HSYlv37OrL?nkBLcS0Y0uPkZ9K26E93jtTIFjiB1)mr4uJz*5u)+S z%0`1hiPGQS_K+ycvh(v0sWa&3-~`230g*A;c_*k1#h&r)`K&1G!2+-MFV`E%+^7z5&!RAB> ztDAviyAOkdP7&yMXOjX^D& zrF(RmeQ;e5YSDlItho)Gzwt6Q=mudR8c(ML$}^_9*yD}N9{?F>k*~W9sb602m)Rh) zAo|jhn$q|vo2xr5s|X?jGB>Lm&2%>3*x9Qr>m)Hrg4#2FWPyzD8$qQFE9FFV5ENx$vV5v8FRwG|&hNRy7V7ki5q3F zxXbZDJQ#o%6#Q^wyPnQ>xtA6;BMI5?bLkGo+MYEz}f+HjbTCfohB za+VFdz4>(7?{w4YEcOFx4CJUtR4Y9YQKTHOQka#gF*0?-V3T3`d= zQhTs6ucyUfyP#0v@=#p((}e(iE9<3ube`Y8uKE>vvS63I_lGX^&4@@EMLeT%F&ff~}SM5-=#W%`oS%8~G6_qWP?H0> z%n)7)t>P9+KnyG*=ZX3Cy8rhd^#Arj@^l!co^hfSx_&whUcVmw!{29LevWynNJzNb z>rd1C@bO0%SL2;~_eD|R+=KLW<_X|37-dZWDvSGh_F`IVQ*Rs((>2y-AwDy{F zLu*r4b=2w1=JRf^H=Rs7ooQj3`pxBjD77DmzVkIdbqY`QCPq*FmgpS_h_y;1PCgZSn@0J zlokL$MT!`1_WTQ+4j>CHb~6O1kQ7p&jdB>G@g2ov{2DfcZdCH7m-vOd-`z-Z_b^$f zarVJ*2d~o~>^`vPlOOIraO3%YG8j^j2n|i>S%{UVE7|T0skD284Vx9~y*_8vAWCdn z8iv^OU0(L%g!8Hw#;&ZQAe>L8y(rc|8WjL3P$0Arurzz5^v2}5f*yAy9VH{0DMmc zfRK=vx8N1ICK0u((e`;;Vu2RXdaFs?0)}N+%EM88II7nwFjf#25Z~K#pygf9Xrr|T zhe+7SD;GyA{$blPAYv20h|62iGAwCz&mgdx^1a;LetVg`>NB{VdR{AH_v&No%D{Wotk5i=v1+ovbLrq*GS47sXjsd2tK?K)Tn7ii-=G zrA8?*o&zK#K~*RD?-3L4+|f}PrAIFbVN$!Js>NfCM4 zaP0zRj8HF(b>;dx^sKDKUCgSj?w}ga@2zjUS+?fIedU{qyDIQeDa(l$c#HvKKS;2u z1MM3jCEx*hs0^Sdpcy>Djvp!pUu$6reP1kxegKvU6oR6*Pa$ZcYk-Adn$48&QRIJB zUH$vx&&?o?E4Y`eca)z6^!xnmG@m@!x>r<`{M$c$ySFwa5<;fi@2MNy;ZmN5-!{bD zz3vJC{Hp>18eu-*EfM6+A&9Fp5WIoI-3&*XpDC7Z?e0(P-es{}QBW^=wzAkBuONM3 ziS}%_uM00Q-Ii{?7yNglKElPEy+uv%B9WKnCNlhHf}>VPT&wf0)uaEm&G;s2yeTs8 zy)zeyQf>3J`~t3o=d`H=z*rf55z^;t!9P6c|HEGJW#5cq!{8!U4)eKs_SN}6{H;4b z4vliaK^O?2j-uYy&iQ!s=!ZXe{_OdO`-k0=?7vMr|GRqQXV>`Px;~il?$qv;v^J~u zD5~apu($K&@!PF~z0vu3-0PKf4FW+B%xBZ#`r5_W>E6A=qgSsE4)2}4JL(UHX_gw# zAW@O$NvAUzk2kirPfw1vceXE1&jxG5G@biF007R}APmZ?OuF6aY~Jbhr_*ViBzcwv zQCwNuOoS?14F|*P*Kf6B?HLGz3K$d$U}0z$m;#{#DsmjwHWbhd*yN%th)?a;f2oE+ z6cj-~MJ(L-R1Bj>B+iL*9x5NTFX%CK$%~j`<#|?mIxw~Lyg+4jf+jRR)~*-CQd`BC zgb~zsm~^?e28o;mK~Uy-5{5;Z1-_?IX@*V^LG3(LB%nzPv$K`}#jyjyA}Zc%REkZum3U?&?38cWi!y`{UT!Hn1v-n6LIyS6qe@y9YIZ47%Vlq zrEqPrw8C$l=?xG97tt}$WK*@H7rK3i7G78%ml{oGUI46H^7D{^H4}WD(-iDgWq74057=tkJ{5Z?<2M<4Z{p{I~KKi(NdHUb$?f-4D_M;2CH?0O0 z2jaTccFJlmaT1TOuhur!k6*vu+ueKj^5xFn&gIE*H;!#tim)-dIqR=S zlWxC%eRVk)^rw??(22_;H`;RyrGV-VFDtwI!;g42_2(IkuYC~U8lZLxuR6hRc6)zw z*!|^JblM9mZI}$ALPX(PEf-_kMm38J1uU+G%r={R7WRz^QFXORP$xQw(ex?of*ELk zpu?UHdX&UGA)D=k-)$^?1 z9n^;2jxQ(t^jQ~${|p&vr9$um9l-$H z;-!~{f<|T3MzUi5~BQ^!mlx`d~U4 zfjD35>3BR`Te~?df8zaRiHAk)qFQba%)0UU?`0h4b+Vx>_VrdWF#(AU1U=%XX4Pa>c&(bt_*6Ctw$HHzWjXyz2-G3vdv6;8;5elTd0~SJh=c zpH|sgJV=Xr{ZD>84oHAlgcw1HkwlhN;I`NrTh~6y9S7pB0DONap!VcsZf>vbiN8_< zm|c7EUTiplU6dpZN~xBZhV=lCtS^vVyURfiHT|EL9}?pytYw7m$i zV0%`vB`FnNhV=Qs{Bp1R*_wZvD2r%>6I&FYeK!7wf3oLizVFv%ne@7Oo(0ua7T!UhLAUniu`BJ3hVK+}b)hIy!vx z=+*NV2Z#4h-@WT~dwG_DfaeE!o_2fP@pwE~U%NOzA8xFVudd@H$+Fb=9)mc?eiY1$ zqPw+wHksf5^wY`NnLkavq5_mkBPfLclePFCxAfm_sTXTz^GPH@o#W+6&O_&Rov-Jr_?8mW@*|V4o2hA z+S=Oadej>Z(%CeOqN=KhNO`(&Rn+T_r}=Q_;CwRO{peA4d}6Lf2?!%Qr4;E@;puk& zUp9hY4(Ys0g>KKehB?lSYXgO$tq0gbN2Kwlz(TOV?Aq@I0uc%`N)sy~u@@*OgSZ2= z-R$(MS=J3gmshbLg5%iueG{qD9;|Ply*YaP;NgpJo?wc)dS7KfCDld!z9+5!6yEUzJ?40s*HKD#EfXYg;pbV+KT9*S_(=a^QJskwzjob-yU?vnoAffMi7UjmvE=z07T?24e0KR`BH2#5sd3$d1N;vy6 zQ40`&NrVJRz#`;^a-(V@1W*D5U|M7DO@>T!n_Haww-nD!BXVn-+6H30zYGwNn%M~p zqHrrKUCeoiNUd-nXtBkmZ|^_89Xhsxo`%~XQY6B~S+pEa;jOP0p=87*!U~O$Wn-11D@**RIFbJ;CFYevH z|NQCGM~^;8^BfR`kP#M%Y{&pCtvr_)loOAzC`%KDWnTIwP^g&255m#qRe#VsKRxbm z46m;*lR3r&ATVXN+UE)_R_wW_i>djAmJ9V|_HAZyfBGXBYb9d`$qr)jl{+ z)u=DG27kAqf04jtpjl}FApl^Nkz(& zvL1GO*>rwycW*Qr1)X@3&6V#>imYJEh>h}q*@a=?c|MDfQdyP-LBJyHoMrC!`?K*R z3d0KAtLrlrhlv+NVN!*@+E`Dy!B91$)K)8T^LE1p)e0M<9X= zSZFt?Wde~jUM(c#g^z%VN)L-bRftWtN;4V9rMh$xExF=7Zl7r<(!{X5N057u=|+kG zftek!1((;Av;b2?0&4cBZx&46O>lof|DVn!z6H!>B zWQwli;OTn!yTjhs>v|RlLgjPmzk7S~*MF_EIf|>qM%`|f&U=HwWI7%6hx5tQGuq{8 zKA-jb{nK|xhYub+d-akB@klch8b?Z~b+U<213(6J1P-|t(Sh#>of1}91F*sp1Oh*; zo$mGvB;D=R+JmH9l0xG(BP)%RXIa=uX6Y>Hb?5VW((R`6Srmk>sGzERt%~Wa6DRZO ztlRC)rqeh{ig_9s-&GX>5K&o{VHjrlJV=6hmW92+)YG}1C`-fL2XZzbb^YJ9{LlRL=5MB0FJo)Rtmhq*qB_R(@mS$lR&!*GCU^tu3f-tgKNo;}b zz^GTckb`~YIb(kGZSCc3VE@KZ*@}uOf)xi9INA=ntGJi4gzmpm$lJ#5N4!s zXM2={yuUL_qIzfhIu7jiR@&>9gMQUba$_WpYCs31j8{9>Mwex&jhD^m1R#!WUWCdN z(^=?w>2wnKem0wX#;eLwD-9sxoTt62Ed9V#RiOjFtgQ*-%GZPK_44dOPA~dMn#G|M zMEP3p*V=y8!_!F3NGu3C7RSx(+cC3n#q~5#rMYV}kf1mg2PkSG8ov2P03tUo3}Gbz zEE)+IJf+cb;)lo*dcHx$)_I;^msP*pEoRwzcQ8G_-d)?cIy&3z4Xdp1NNFTj)crWI zdD#u4VwMh*UOve}KOiUjJ9`Z|1W1^j(V7rhKoJRm@jOBtbNS81k?BNl&rZTYH}~o5 ztK&L0g}7X}cX&`6Bho-ZWRd?a?;}4KhICx0W4}XDclUxjAHe^w)1OsJ1HMoAx#2<+ zE@+_5RZJE$ac;t51OOFKud;{Z>fuGPT{_<~F2HLIS{WK+@$JB``kcG;yjf89&1h7cHS$s%K&Ci19vzYS` z!HNrdnJCZ{B%%fa-TcW)YQpo-`{hpjPY*g@Y=(1BdCrC9Z1RhL%)b5{Yyr*E1t3hK zvM9T~ex8-x{(yy*XBbcr3B=Y_)a#6kBJQsVXis^b6OD~fk{n>IRIP9vsF#uXY$yKJ zz2uv~sf|IdHTL@4=@dZ-gW(*J`n|bx6va6UMR5tD;*M2Xg%SClBQpJA=Gcom)>^HN zt17Sz3ITwfQ-V@g3Yoc5nz*)Fo7yp{HX~XQG7BIz0bC*iq#OunQd)W1q~odf3`Bur z0#vrPoqlI@etIuc>y?BS&`EQ(XmeaNUCysBt}Zu+>*!daYKmU%oOQJ^rb*ptA6;75 zrUV%TP)KVhK*}_P*Q&0y@r*Xs)ugE?iZBd{yokauou^Tp%qFv8Z!Pp zug;6m3(Kksg0RTTPSUXzhhgNZ+MsE!=1QqnPzQ*>sVmslo*$e=@>k;*Z}RJ%&CLkC z>ui2hXEQDm6WSn=Pd}V(trtju4X5x%tG0YpS5(?9Wki-DiMu@j+~J_Vrw%}*UHAgR zf}JT#%;${(jGBjWxd?8fvJ{|er$eq(SZcHcZaF1cOf?(5CIT`uErorJerJ)>yU@;y zuq+@&eB(fF@zw1zu+#6%ZKWfhYpX#?a~$(>{PPDa0PRQtZ*;J&kN1XJ-Q2@&F9zOw z$00y#YJ1v`GsdhQcwGM+rMnZo19e7P3<>LB`jXwq(I zQ5+=p?QFY}oH*S?2c!^?dFTLRl&h zja*e$lP4CClw&|ar9g<9nZ2|?Ruo}U3YY=VD(#z~Dyy&?^>jMFx(cI+J+BY~&zy>w zM?3%Tw@){F{lq$|nNTTa-K;v9`<-570_T_(94Z0OT8U6AT3d;F20{>4q^$rdEb<%` z8bews3*vjeps;gFnRz;o;&`5>Q4m&D)lWJ_Rj>61WmR@No$+iM27y+ZEqk8F&V@lx z6;%?&?AS9VozFW_)Pe>D7;g|3Y;9Roe&D0g$J2|st$W>mI!$GN`!bu4Y$1wjW+y1Q_u^Wj|({szWJ;O`!&%)14D@Xp#2k%H6>5=EX z7zST$gl8RJh@z?r=HsK!e`hb=ks%OKN|92HYKTP?At5=oL|~mo(umrYr5}gsY|=%Q zVfLq>(|RBmyOv~ogVLMNgXv13$Z zo%0mcSr#f{>*}KLjmH3x!tD?x0D4tFyowfC8nupzfZmrT@ z>1t&>0kOhLtE#Sz=T)`!JX2e%JyX;!in?i*g}uZdkE_$u;9%bYu;ASHPPYc#$D9B3 zYPw}0GF0bzWW46fA}k(h;}bxW>e+_7HAnwyMi4Z176#HwM!CMIHq)FdL=0ww)+xdtwkP zGEdVaNgAwO#T-XbX=_GxJRjw3m4n9*KD?ex-^{K{4TEl``8sg!?4AV3+ zZ9w-;D`VwX*0)wd6kJ77)^ZweND+Sy_p9IqC zj%4N7hWC!^RR_Qggn;=*>a+CvE*xPkrE%FYv=PF~KMauo72}oBZ@S)>yPfB2(Ihb1 zRsMWB`Ra3fa^&iQ7Fg{@{;iC*%t2_1JnIYx*?bmty0vvmlW)8#&*EP1;_7to!3WdR zGubxhUG#UlSO;PQpV0~Afu1OtdQcbzjOZL_;8rrZSmw7m1?U#^3?g(Qe&koP)N|Gc zDz3)9?}H&P2&%dcqM*t$uiwdLGcDvt(QG{K5BgVUXKOn<7uQ#v;V>=oAPNdslhTUF z*4FpDqAJ5M%JU)!!?G+xKPt-7#C}?2ejIX|*Hl-)UDsNhsw$!&0s*CzFe{|yN}-6ND8_{$1~nnDfK;06 zP@!*vK#3rD=CVpD@~gCn2R+zl=tp+w*>yara-VF zX}mSkki`yn$&=MA&$~{%8MGL`8vCI-CDvOxY?=WYrzN;5Y*M{MI zgYr>GO2`w{F+tBuz%7&`O{EY}ORU^??aP)sW?b48+JD~!IC8TF7XEG^gz&8bx$OU& zUs!2<9_ep}-q%~fWnvVmz}D*WGJX1uOlG7FH$YM%1~#6lsxpkCbT;qxdh^M&)9K{t zTpJRBvdH5w8ed*)@9w^P@oc>toWK6M$gVCXXQ!CHUNgVn2)^0~zUiBbuE~9}1XhV7 zKmZ|TWCmdXhloJ55MebtbBDUpCN)}y{W=T_OD*N#}gRV>-&;Pi0oAG~V3-KoGS1wzo+#A(F}xYDySAPYEBDBxP1B%$wn zq)3o8x!T2`x$-CwW~{uTzso zpauG>-Ra+G4Dfw8Rr~O_V$i!L;I07t*JuX##$~>ucv(z@mT8K&-iysRk_173EyCPT z5vrOHkr)9~BOPt^>Hyplv~DAJZV#p2s{wE$8AV|P5FtQvyp;@kQOwRE!s5!in&J*^ zI(~90)fWd;$~z2A+HLHc`)ZqIZd6QeIv4 z^K|yR&+>~C^0WwOtr0;GjPF;q?eu!tEZx}JIz2gB+gKl6T_>GRnPuo)oFwDXc>nP5 z-HR6w?mv9`o6q(()+SG%`WKfnn^?A`hoz^S5(^?g0w5%!+5iWT2BZemdyLd{4LEwkJV z8W{nDI4;VnApY##Gw_rZm$7w8P>U$U(pnez-f&onAku9oOgrXU`X*Z)_7cS2WVgPD zo4tG86@Y(@2l!?aD+^Pt+`x@VshjMT_J;kfE`bHO0Y7j}m>C)eQ0N5w*_E@Q!S@G|M@T+$3BYqb$Rj2UrfIG5|L|hgedHk z(n=}kxZCfgS+=vce{%Hh-u(y1uV1ZiY>Y0iJ4pf{^VxL&(Svty-#-5MldpdF`Qwj2 zdiKTVn;RSBtE*Zm^n=CX9;9(&G-C*cn)`t0{Gb0RnN3w$)M9%Zn-`bYI}h%^eD?g{@ZRb37n}WldUY9j zO0gB|0^iT)d8gYMkH*8{V0JxT?{u^I+z;crvZNInW3}=FT^yhJKp^0RQUP z+m3!AWo5LZh7SQHTXt@d&A^C2xE!D@oKirI*q~`en~Z2gg+QM10Jyd#5wc@pK|ppw zN?CEMK9D>wdfonfK2t=w%DSQ!%Lq46SV3^;=Eb~rC8<`diNb;BCrQ%j z_O8q9qMi##;0LoRubOv*fYYQ01BsFfgs~;%E(~8yDWjW8K#htG35Wm%m|4EFb-sJu z6@Y(L8CV@SzGrS)l7en-srMuMfQqM1?L>U$iLMHEyF?bh=-foK+|)Ro5QkAL`|%F)>%nz&jJ z9XnCz2t?rmQbLU_v2n#NoqCHjh_-2yWt>*CFhxQn=bYAhvCR_e90JtViipw1R&^4G zSvL24FUwOzRHT_LfG~6Or~1C%TrZZ(=Nf9z016qH2=g*`ASg}&F!7Ablr19|&zsEW zSzQnUDa8U1g^&bR0n<%X(W>8NRUHR%iv-ks2zN);T><$1Q4n&QICXPhW|kFEnkLN-yfH=Co z-rC!L`OP62wzOfh}tw z?GQ?9brd;kL#42)G&)9C2m0KH^l<$-WV6UPA|wLGhEyYrS&m7hb!ourb)14g1|5ehHut#BJJzp9F{f($!5UF{=(v%1* zxd?5-QTx`rd)*a)?{Ai_BaU z24Dg~7D7}23V;OLH#uU1^IS=WT)sgXCJaLJKOqzVMOc?rHk&zTp&b;<>ip`~CxXjH zvk$19_>3NdFW>`e=R9`G zS>hVm0SmB00V|vb{&k#e{`^nhT#mL6AEwi>q~rAI7bpMtw>yR=Z{O_fY@eJR4|lh& zPEY%TVF2nt6~8u_s@f`c>FBZ(c(c(}zt^2yT@Cw#>1f)CJGLl%qs3KdokmqumFM~O zcp8C_SU_}E)cWvhJ^mffF1u!?q*ka1(K0T#q9Wfiup_|of`Th89TMS!bB;?QAplr* zN~xkOgD|kxGP6?3ITuD@Srx`JY}xlb5H?0tRl(wn(!j0!tgh=eFAqtfuB%!ry;!+0 z63p^6<*N48wacfjvW|W2&GQU>53R&H$R}C2zEP1{?lf@WjsNxyj9RGzwm9f!;zxIp z@OK5^zs?9~0XVz0A<#-K5oot?CAdiAf*aa{Af!qz0+H-p_<=n|cIp?PQI964-GN_?w$s&1x12-x~p~jPOJO4a4i z>DC+xv4zzmG|fjN2Wm7SBm#&IaT2IE{ophJCYRWXFU~K&{1VcvDRkDcAB1ID1z|`4 zWmye3HZRUE_73hn|K^+fAAI=s&Fk%hy)4iCFd&8V@o0Nz`{L;B!QSr4+hcuj;Qio} zd6LxJc0WQ*j1(w9ZZ@SLB0>P#u@B%g>!J)T;4JkjtI}K-mCj3;rG8oIG>x5$L_!fI z&H)2BC5{;j^3u)C=+jRxF6ZlOTLhxYY4P^O+kg6p4WqBmj)z+tSJzijcQ6}IH7Q$` z)qL(NnvX7%(4Ssjc9ZVp`Z^AyY&Hvw@9G)>6bsZ&8(r6R6nJhjQ>XzIiZ@qgvfjVk z>b|04rX^L@ktju=P(;MJ1ru6ui6VzZD%&zz?gpg>BErJ3Fora)MWZ!{7-Iw=j3VQi zX0Kpf9R~h+>(0U8q(frfbI&w_uK^_F7L}XT8rj{ zMs&>lU2_#!z6nKI90DQ;mRd~%H4b%UP>@k*Df|}%Ub(-t)SdT5IRY%JPy9_He0v|F z1(gm0?NOr%goaA-9pbs04xj<3wRM7*|7$q&B2K^|welXso0g&#U^iJE0*-I~g9dV> z7!-<>8qY#?lIV%ARb}<{_2{$TmKUc0>;OT)^G#WmVHA}`iOT3OoJ=OewYBr}v;D*S zNAHdf4j;@WvoP-1%86y;2bWiu-R|J*@U$dvhXfzrC$T}I%?7LGh&%!#7gb~mQfH)^SL6O4){qUX* zLn6ZtRaMSky*m2kKli{@(^(QFSuqEXtgWCd6xaE96e1OqY2^9Ee3pb!p68wylvSlj zfdgUDgi=|pwG+_*E=>tV6qLf!@1I59Q%PqAW>vwO@+!Bsa>B0Zx0n_30+!iG0tj0A zpD;V38%d25VP@x?u#izGq8Pb$#`BP!k3=lQC{CCyfr45#*4D+c*2*!9<7FJ4wYJHv zMrp&|L_`!bO6BUBtrgom%j79%YXO0*?xt?L+t2FUu?0ji8bnHVoz0Cxss^Pl)Z|(; z?-6V+Nlgf*v_aV-(xfD{lC!(h|E>Uhk2YYrxqUBaYs-2-t;bT9fd2P&@!z_V2tcK9 z=z0>~|_IY*e^{ubO z5=Pe??zCvkTYVHPRuRnyfJ+;+2x3Vx(Qp>2^F*a69-+NBPpXP+Ep0F|+PV(Hpss5_ z^aTWjqd1z*CcS=tG8%8~?2gBiC{F6KMnx!KtI`NgudXSK{RfBRBuuG+Y1r1kN6_eH zNWd^^D_B&jvbwglpo%*bM$}21r)%GT+$Witgfef#SCm%oDf6g4Vs08lKGAUHN4HqSk+*g36L zZ7a|BnVnMFSw{pw;H*=K%&fFVMcO&-90>!W4g9nlpBg@{(lANNx)h@XK@l3Io5!T8 zE5|HLos6`Z6pSJwwXGf4=GL#3(%KN9Fk9GZ_?T1Ubp{IydKt|JTog&(wbR{ zvVISleN_QVI~4r2f^p3awbG zmXEI0Gzrv2V$MU#jlu>Tx)^4Pe0K)#cVenn*RbtjyF#uL00K0|D5Y+B6IPOhSI1V; za8#C4^5wQ|fm?4yNGnLvS0=IET(61v z{L+7S+8s?}cI0fW)Tz>&fBa`t2J*a4oRr1f(^8$Cq_3X4>8RW7F(7DdMF@ZxxU9%A zxSCKFCUItQ%_15=kcbx}91&4kDRwA;K!uR(Za(L{7)0~3@H`{ffc~2a90-C?D+Fzp z-q>(7NdXWL`kszLlW zsboaD1zI&v6o813A^-@25QPwlMdD6!d~rHRI>D^`vz>=w!S7B_Ob~#8QOfgt_B~8u z>jawd9nvCLTL8c@%ZkOaO`I2DhCB7oT><$2ha5<5AMv=1!Tr{4ePzVHVi75azzQjLpnfP}MP4XHUPZ=TiaO*akdp+Qo;`NQ6oY zf(Zi0thBK#N*g3qR27nDU{J_{==nD36l-gB5RnB_i?BEp5g`X;*$AR_QdzL9d;_6Z z1}f7H1`ZhzwL%~*=rI@u1E?9a6OREI9YT(hY00&6NnhXF1FiDs&++(87iz`UDw-H` z@E8BK@{_W(L6Xd~nID?jo7csgH}lI=Pebi01g@(J*~PwBPA3s5n`TBt%0jcCt*Hr1 z7C<0&0;sHGWxT?c3(h?tVio$+uK(MMBd-(JW#t*uY=9V~y@HeC#s2+f;=L^2z2wJaZB1LYzZx9sq5;-6tPbT7#f!0a`bz9{yHF>9Ro= z;il@`Re`$#@I8-!-jBv@%)l$E|8@ei{J~0C;|i*wr8PGxPICiCU3#x?ltpyV zGJc7hG4svwx>^R_b0n-Pl->((5f&8G*xbJbZ`{1N0&Tu^jzhaBz99g?%5s~RcCqEZ zSx8-%C?r|P4MBu%G(!Ra1;KSd=RJRBKmp5a>enR~g@AxK(}>U=`@YXkwC58kMFx?q z6VLO@qSVGK>MDqmx~`4!tYfE)?yc$FJ-xS|J3(PbPK3z;FenDY1eTp+3VimpMQ{s< zpB6SCTG$iO)*8oTYa>oOtJ!L1VN2|kbA|yOi-1KKDJph0k|!Tv<>p_0xt8VK%Hfk0!A(HqSgF zS5?i|&pFZBt7>aJzjij%K4*n!5Mqbmk|2%!H1V$LTmm!A(^df1;NIYd(0!}Y3ky3% zihu}JlR0C>DXlECQVNLxu)#bv|7@OqC(b%o*Ol)Z;~CEjoMUFuTCuQzlx3xrZbYR> zsED{3$uo;cRTs^Ah#do9Rn>8voS$EAZfuXvt{?6mTwPx|0&895`J~i!o}Sft9eK4h zyz<3^N-O4+X3Dpc$hSIul{*H|T><#7cm2oq`NLa!gWF>N_aIy?+H8SoY=r;0rt?r8 z55u<|y7Iu$0y*6@0Sh(edoZHKalgFmw_%WfAk9&+AOj$gRtDsj2>^-SLtLzwffsfL zyiu3qV&y@LB|s~@TP;fqn=vdgr2r(N1sy`F@G_vQSmnfE>+02MOwO-&? zbscrP)`Vvdc(nFHtnqqFRw1Uy?$92QIgbk4Zg2B9q9DJ-ThhZM5|hZRe}vI zT7aBLUJ`@${7ONEA_z**XY?vZ)}pPkuAnS6i`ZHbfO86%tOHjY=Tu#JPQWn=2s)>P zP^E(Nq+{+KB)!4)uYMCvCR(WrB>CXM#-IF*O!Df?-xZ8_yK2GVmxq;37DW@7jA8x z)>*1Jmm0Ln>IyUfNi(BssB^853|cB|Bl1CMpT>p{0SH-?|VyJ7<(`EH6fz#xh-2B@s1BQ)t({Th);H$U^zh*R zWHgStor)bIf)mnujuPx_%t=Hk25BuCjmBVc)-R8Eygi{^aBlx|LDqM#y8`h4<=1E_ zz<+Ooj>yY|l$9(^cL^``%}Be~ZMft*9v!~=i`fq*Pi z16C#cO}{~iB!GY0ZRjAXK{oey zudlAQc6X28zTMg1zqmN>^aj&3_j+q)xQ?A}XaC^%dMus~h(by^r5uVlp8={`6Oy7D zfJKy`7VsFQv`P?b)`G;SNP&RX281*zWbu^tNhu^nM1WdES?62Ou92Up3Sde~4i5T< z_b-3*Yya#jQsGD_{^ZlaC!bhC03o8$=_%Uk`ps)QpGjS&lX0&Tjm}Rtw%1RNUTtj- z&R@UST3@?9IqHRho6S6DHHfVWKk)J*_X0o9vM37Y<5B292?~Sq0*g4yTr)SW@OIz`jW1-eU21+}U6E&j?>lF$wM5YPwyL^j7Hb7S@&uV3GL`0(h>o3+iY z^NaK0&MpLj-|r`Tdnf6<|L|emVts@afN;kW%yJ^MzAi~XTp*~OQ_eYCds+*NXMAVb zXpcl`($0w>)sBHwZJh|Q2%vI~+xTY3$WAkBW^`ZyC!os12g4tHGXCN>-t}3+fs2RX z{Ri>Zc5^RKM$NA;lfbX9N9A}F1!j72v9qyx@#fvZ_Wt?Xqx%Q<-ah+sqd%CRTqioR zm1Spr&&#tsjH0|O{3ObXGVXNCvIIg?XlO|tRl`%%J z=>uAq88eq(q&u6<)_TKPmQ@JM;*s_}Q&&~8 zv0>JSWlJ2y1z(+3(n;GqqWAjURsRhk-LZh~3c&Z73coyX-y81pA}#kl_2+wGOz#Ue z1rV_!IFHpgYu>Zn?(+^!0xg1M8-hMIbbVO#7|W^bw-7@>M9Zy1^EPfWr&a>JgaH@? zl~SZ`)_u2|faOA4mdrT0DH1DMAXj39Uz*T{*?dYnQ zUV|cF^gKUH)8YF1e3tG$csS4Upwsoj==%D4@4>_8&%Sy1!H2J3yf`>Kytp{ufAqnu zs!XQ`Iy@as`uFc=%vO`ahB+oap_@)M5gN_lh+V{@vfQgGRn?vV)U~h3vNN7vS&N!# zcBF`%(~TTcDaQ_g*s@UySQHYlkaNmftSkYDQkLKvCEY*RdGg8Rm%lZ$aprjA<4?T3 zJ@i9uv=gTT@9opCRaL|aMyE%^e)sg{%frpht2eJc+}}HX_VnWq9%bpQx4kvDj)GWe zQx;Ve$9YkPQIcg@m~`@@2z-wOn1B_|fa8O`DN5n2Z;Y)a#e9}43_ zP7FYD3xX?4ChqbQ*4~#`?!qAN3c&Yo1AgxuT#74h{&{1${8nJaayzU@5KvL`)0)&- zq`%sZes{0)bx&PKx>R66sQDW}$wFG+h@BUj`{qcO6{^>_UGmrfTN=vo`PF6V>L!}z zy^!CGyjWXX zzr46Sc=+h*YBb#1s$HGs#rC~}7cZWF`01z5o`3VflP7OpzkcxH6K zJ-@2Tsw@$}TE|vu>(J8`*M28CA6nCEGr$T->A*qr2f(CdZ=yK`R)5kYJ55=LI3 z7RpNEw8(o(=v#3VcQ3dLh5x>c0N=jdf7^(=tPnRs_%^>n;5Nanc~}{N7_5@12kcQ? zOOn;Th{vD=+r+L0NxTxvg*Wl=H+S}Bu*)hwnt((A2^_E=g-UB=SmwJgiCXX77@e06_nizUI@P2!coFv+nsk%Csqc_>;LMbDb zJN@2xJbC!!qob44gNKhs(}^ENQ4*h?96kB;lV{&Nef05@XJ38w@WT(^yn3^-yE{oU z6@)rTrdq`h4yVEZ$RZw*&Pu5&3Oy@q1gUhUwqR>lSAp*pdF~lg=Y=AaGS`S)Re@Hn zEPQ3^yzo7*DspX1UDrmN+Sb1D>#9@);zXem1keNkTAE-nM3j^;+1!-VQ@Oh8?(b9# zUFDD8y+L$@RF$RCCQiE7rxzQ;;oC32u+!=3*IyJ@=c8B8=kMNJKl^I-?p1&^*xIq4 z$z2_Fx>;U?ag=9S5QRln1aVS>04gL+WxXwS>tgcAdIK_LT84gD)|K&$)K(Kgd&svs ztmeMIq>V2ho@R5)EbLtK43TP>9b}!YU9F8qBxo1BP}LQ)HJ)a!6=9lXA{+#vb51oL zM1}<)lmJo00SJ*oA+59!PHbLlxtx!}BrNJm58}T&`-ZmqX;sdxwcXD4U;f*RB($Iv zBaxDO^O`yBct^EO^#$6uRT><$1IG_lt58UeQUgXv_oNu3}?-LqY7xBvcosbbr zLj{2~XK6CXzy z`dB{w`ttXmks@)TjmgSl|KQ;G`1Hdc|K#HOdN|y4B3Uup-rYWW@oHmjTdTVQE zrN-Dg}a`pedQEk~|Uw!wQRBGYb(T1YtC+r0hJ6wW*6N@Vz=ueWPq`jqz+*Yo*0GjR;PF&^bXOaZV|1nUx|$Vvx1X zt;?^!iao>Y8wxQyee2Q`K$KQN7|tf+ey4YN{BAzEsA|{@_nC~jV8wo z-~a&|43%&b7pjyg%gSg&q-${#DW8u{Rp_x}?R(cnIx_rndX)#1Iqp7w6#ei=7lfje zG)CkW2#1Sl1uv4p@J4`#OD)_|{(5)%!(Aru_b&ilrcrPYaYs`TbP&GwTCb4a7oiTtM>=Ttt~Kto|)Du1$qqR-HDF1%RMQ zY2ngYa1xvF{VC85&~1e{w`>;}m*UO_41l<*eQg(wZQvGCI}wnEquh>xoPyerB_veVk3W{-pqs>) zbbO?s+hwHz)QpIgF9<@80LygdBly0lu19*7g&X~%kp_VgK#9Xbt7dj@$Y|X(H0+}) z^TJEwc{=xeubj^V&#UK|?**I{5h+_#+K_V&m2nP?Hg#>4(M~uZWgVbLHMp$b8GiiH z`B$Is?CzWGZLixc&rgZSl~tLghX?mxzj~9+rsydk#f?*%NRR~;0T9ULKmVgnI?2!f zjST`@R(|N0RUHOlUKOG5=MAk-L0Q&YhxbOOU%VS#-irt0*|Z-g>3rTxdbW0&6k}t_ zUY^Cb3?I!E`@Ys)?FlAXQeCAl7x=GE?5IRK#axh%0jbRdQ zvW5hfkXc+jW-Hw58yFlS%KOBuyBcs;0N{HLgKXyD-}YqPSb|r$(C{r!K=a0A|2s zPt$pp#z7=nzBAXp*)ObyZ#PYSqppTVWAj~pwB`G))n{OHVG{?U+6gi_QiY=0Q)OKb z!e~C3Os_6cDF6t)FiVS#d;6#7Cx;(@IvI_164llfHOuBct*@=!J9PbZr>P{Ui7eto zgcunB1+8nc0l5S=y_g(})2)@Prw9p`p^IJ;P3;zch7msTI=i3 zTI+jWofn`?<4YvZpO$6ntm&*>9#0NB!+e${L6R4_?*-O50uoZt9R1KH$ipI9t1)eP zzK4X)*@oXqL{7M_YgCjMxo13JHlC-DV6i*4wGETNIj5Cz3hJ7*GOlKA3=10*pb!Wn zHP}IRj3VG0Lj;Wc?(8HdhQOO~N#uD-q^!4t?hj)<9=!_JI;Phv6*0EoQA7ZtMNca$ zM3!4kc7wTFYJ|RZ>$-d0je!2uBcSh$pI+So+_;5Tw4UEyx4uV|Yja!?NzkE6HBAE) zPm^O3j%y5RP%M>37SRkSLd_tz4TOEK7iq0A?X_tEzi)iGTIn#1JkJxpQ7GNoZLA=l z+oP%ZTvh`H|3H{b<2j&a69|ZlWik+gNKJ4Ns4q9e&$ohk$Joou^5qMAdG2hDghb?b zI)$xw_V3Ncsh{+-ifw;ro_y?m`a`>akaqhsR4HPKsur{iR?s3cplhY!(h$p-kQFhZ zH|TY@c7QyMP`-Ip9=(Y-Hf$%UhyaKY35kiEfFLqpEdtuqD5AB~N<3W~jh;eut}Mva zQr60fwv0t-h@7>g$*~0uP6UAzqX4q+C(e$ZzvvtsBwAm5@fp-iAZ3;%ah&Iwh$B)f zj|FO>_PHQNK(UhS?wh^6!a787}CI)Fzz>uiPQ6Z(S$KyDO0U+@FM(8ZSAWlHSAZXy{ z&Pm|=bzL*FF{Z^Mf))lOU~ov#+$NM#D9&i@P*QMnACJ-zC@?~vHd#8~Sl`IzbJdNG zk<}l4ny#;9O{OU|Q-4BShH%`1qqK50Tn((glmFax0RPpNz~7GNUA;ap=d9legy3Z?ZWFf4oIW?d%8 z(9G=-Krd2@1wfdI)DqXTn6To~?!fL=a3C(0zeG1u>-Q?b&Ap5ex%Ce(>Rd}|bcB`B z&eL^m*ORznv2{hNji?1eFOKI~siNMLLG9o7A3c~4`x8VUEdpX%B}(&YsD){{T}dxQ z?}DlnE)h`aR2lv7UZBfCaryk;|Bbh^Z4P!BQ2~iCwr~!?COfNf#sXRdB&-Akz*pMn zjvvL6W}K#VQG}!s(2l23uTxhQYgJpP4K-FkN2+k#Ik;axeJZ07hmqeOmM6!K-C!^n zUte0+aPuv+=J3`5O+ZbI4-kQM#eCv5Mkf?d=s*NS5h+3k$ik?wW|x*lcd$9Voa}}@ zTUkTOF$=TjdCLqif<=?a%nZ#mrqP8q`>Iy{&%h`SWIma8I~`>3jqe;IG9xO5b?K0( z`Ner&dY)fZ))>>6hZpw=W?*I(6kC==WIPX96jHOt3VX@hXD_6yM(MoQ3n%GpeSPih z;`07r?d$Vr;d(&b?m1gR)k0-~+M7k|g=D-v_i5=`*a-g@yQ_9?c~=VHP6i6!uM%{1 z{_`EF@rz&col~G&OJi8zqoGOAZLaQ2C`@?X^?$kP{f7^dzxyEm#lCqqP$Qo!1Et17 zOR3@76*IK1_2afs+$EB(&3V1a7r-T{6x)wsF-E?%?_g#^R|7DfCh4e zrO|U^>VDr1dwP3quBGx&P^#(Ft4f@ux^h_83Ir7hF|gRE7jABh-ne9PAqA(Vp*K$`_|g#$Tr$AGb(+2aiO~5+2|@6_D{!`-Sy$? zqj#Ib_4)O9z0>O^T`Ryq4couv)xlC`vDo;w&o&YwwON?5lEZy>R^4>~-@6g)ruRfd zCBV&%`Ms*p{J=F^;y>^x%B{_*EHn%tEwu*)s8V#5(65juet0_Yj^EDr&ZfO_9y!P4 zs%bX2Hnj9hIM$~~XM7>@=9~A)xjYV52Q&d&#ht3L+C?amYR)mfn5`hRR5)ijUH31^&%G#pL z!Z2#?4GL6c>#{04oencM=9M(f0U-**sw#Zn&$7Ai`&Cu5V-rMm?NBR0CIn4dp^Aez zFUv3rtz|SOwbhL3H>d9&JbLi%9eGY_VB@wJS^jAkctE`3Qr+?_yyqXt} z3*du8Y=)W4e=`c)cC=f!N)*;%WsRVUYhXCI643I_tM>Z3hwTX2dj zv)W~;0(`$T$wEli90dXl-$8j;#z5Y(-n_p*kTyzebxPLIxthx?5|Tim{jw;HrZ`~Jg67p&MA02FQnxE2seTKJF%2ymNfWgRTSGZ(nz<%dc_j-+(+ zbm!0iOzm#hJNIUeL8)d%!FYq{UK#G)Mu6PdETFl~S_G3sGj_qox{Gp2Q(cP|$8~0$ z7~gkLS&urM0XmgmTy5Sv9Cv$lk#z^~XLDs)03Nfc+7sk4C!R8?4Cn^~T9;-sqTKzl$ptiqx!gTOe)M5-xz);f01 z_q;|EY^{r;q~RB-M!-WV2!iJ66%ckV4nqN8=X~EEkH>KogNRaOj8{3UloDZfPAsdS zVZuQaMAkY_tD0RQ_1p8)!v~MPeD?IiCr`e4`s`;9r!4XuZA0H;aw*1T><#7X$fvGa4V<(dn@AQtbA2|_uUKO8-Q9X z+yf#fk|{-6Rhp+BKkb>pezab#QLz!AHUfL2^4Ytx|1OJ5VGwGti3kYX2>oG6{%TTT zZUmk;^B!C^1ufW$w-(okg077UUSN^F>r;b;2?)LogbVziX;rbas1QMl zEF0_|&P_P{=}%rObjp+EqFdZ@zQ4NT6A)?jNy{O3GpJfLDhviB$mWx?^W>*LvL8I2 zSFR$IMqY>_z=X6~%4DG~Z|Bdq<3HQ^2@nII)|G(Q?Owa zc%Fax_GI&5i-NeAj;iZ?XLI*@d{tGoYNHXGErhTU5GI6XDUH2e=it6|q7>9307@%W z*HvJ2R#yN40F!`0%4TymKb3`*-JDa8+cb`BQ-4_Q|D zzE4ELLW+nv3WCa2p7B~S8MWtcRaKtnIa^!ne9sUmQOY{k>2&J4)})Q+F(WEs5m&pq ztdclhz)G|@)=Du8E54eIwhnjy@!98(pFDo~{KZc`{`mOSyH6i|aB+5VaCq>yCtqB# z4?*BW1PGa%Ku=iA`H67pHk6eB*4rz$R`z;l1-L5!-{+nG+mX|YOPegrHQe6)@#YM@ zbrJp+Bl^39nADD;rI{%?0kjIo0Zjrp0t_q%oEQtr@nLL~^7`|7m~*cLa@0yS+tdHX z!L@q&{}-?>;FemPxnch-l}qw1bi~r#aC=?^H*QQs6w%fN0zQx;Oy{{51gMR$Wfo=h zb)G)_qo1BAs5LEesTdcZLTgWh#(=QgZZIrC1r0o7F$Qi_o?WG8Uw&O(Uh1TKUb#}M zmVD3-$M8Fn6&5?jo51n*YuJ8^n_s~|LRbi>(EI;U105iaqOMn$T?A`t6_HlPb7FQN>?*a=97MQ{GkY>}}#j}!UWCnK+r-z!U z?!!69-6JBa0Ra+k5mHiBnHd?x!`)O(_4|HbyBWaX7&AuWk%_?NelyH$(Ol~lhx@Hg zqi_}wNU5X4gWmdT8ppHA#Q0Gq5+l%zf+T>B1%v4N4}RorY-X7iC*W%kV8_Pu((#M} z9}tCw5aU_gj2aCa&R$HecQz)&akteOO~&n3Gfy+$3mG_fR+A!y076Pb0+l_{E zOiBreWvdaH0W{{sg{QuJ^7T9Kz4zeZgOA>M|Iz1Pe*fL?ynOcJ_MN+5zI;9n$gOv0 z!Ym}EmZ8$f&7WFxg<8F;smG7ChPlc@xY}%9ErI_#-T+D|f6c+Cx$AOS+{g6ntg{?GrS^T8*RLT00> zMshaSfC%UuYtKid((}jGwOXwtNls2qyS?6E&|mBIMrXrLt2rJH!@$pqq9_XM3T9Vn zg8@k?$85CDvfTHBdRc=d9ZDQDqUPeK#!P^kR2ei)NJ!dQR;0y=Mr{j=ippvPEWpxe zG?-Z{1wUaapf*>n0Kw%;TWELSz;u$%&zO{My==j~un`bA3_0_fEcuQ)Ic(ii`#ZB+bG|nCB^J&CY=nQZ&s|(+t0U`taVpH^2G%>v!LJYya7c zw{G3t+kd%zWB1RWeKA`Ng3XO%VL`P-RhP0X*Mt?h0N~lWsJ<{3Uk-Y_I3@zF1P-7CgoW!x7_bNlGBJo0h{plG z==z5(JwCII0*ozFVP!u5DgPF-a4qb-$SEo*(XdQVS)i@w3*_pnMFDUZWES&3W#*Fn zjJ2+bS+FL8DHb0vVvY(&tiWq{jlc<@Hf&vM_g1>r%g`Yj2cTG#fMzjb*%l!xZG~nN zO$g4R@HxWoH}$NEJ#B=bR3}jEty>AWe&OB6)iJ&4Wg(JvlzQ{np!q2Vbgov)hQ0gTpu9 zdgJrMmx`1_Moq;me(}vizq5Mt`&9~6_>>PqkU_+@A3+F&#Z zyDM=P`=knI#rG;Ul(ULuJ!&04+W+zOyMz7H&GpUGet%_UWq8)_b-J^090p--bMga? z2*M7Sh@7)XP!xIK`+1T1+AniMk(7XFqZ~UTvPGemaEHu7sH@Hg$uTQW&*G`^jB}3A z2vA85VPPRkvIG&>S|sq4NlDatXaB+Dja%35KYZ}vy|?*90KGUmM`92FP)N*7WujB1b}Y$2JT>}7!@ca7v7fJ|3<6q^ z%gK1HmwaUxG}k7#9Y7FaIp~^6naN?x`wW z7gTu&sEoQ481(bA@%G0bHr}{99ZuaeKRi7PwSV&XX~);kzkU+<9x5n^%iwk-LEuNf z{^jZMiCSNcHa3j*V(WTaJEP&m6Kb!l96r3i^Y&XW5B6Kz*C&%{(2R;KL1REssTzp1 z!ZaK0AKcx!_u~HE+nYBJkB&Ch*9ZMUZ>2jpJL`5Xfx@sp^Ha%CfpsND#y6*ssry4HLhNRXgU)YG&L!Jwp#>Fk6 zw#Y7@%hlMOE3Dd58V2HW|Be8F1<_%sUaW-2QF?9av@6a3)k}!$NfhEdC-oJ9^0=Tj z2-KvbrD+u{rs0br$g75A)eODLGQ%n+Q;<*)gg^^-65CFl63H||7>O|qM9r4JeSM^S z5rqyAgq+ZHZ1SAq6i+Am@a6t*f8!}BvW!p{ESXj|&r}e;_~Ntf?R(LkJKSh1-56On znI>T)L~(wW&kl~zW`Y#1_MG;Ff8Wk)PIFp@4V-(R>U$Db8)ODyA3%mva1y@%LGj+Z zTok_JU@*z|UiP-PPQUuXh0U{<&ruTz3pmASm53t6GTM6zhx@ZulSMY}y*W4=^se1- z;!d7Dy7l&3kH7kI>z((H2WQRI^;sGlV+s%}0DuZ1oz7Zmc70{_@agmScHcaBakRU& zGagS?S62sTr=4DJJf5@~&4Srzl_Z&`H9J;H*}@v_mG-KDitS%^TM;QNRian3+($Qd2i)m@lK(=ffgq z5D=m(AjDMxc)hFN^LNi`+>S6;BP?eCEZs@va)!+E!Fod%ml|8QrAT1Q4W$(ZAKFbrTdH8C{d8t&e zs$4!V9h$T(e_{~?CQ!oNjC%=3mUFFL5Q^~uz;rs&?pV|WMCg<-#53b^FP*{35uYBt z{LQbLzDd(03Y$fiqtfDXMb6CzFc}>@dER{ZxOew%+--)tH=CW6IFCtzKRL^fk3bN# z@2zdlYWxl&EtRlk5h<24g-c@JT1-{zyUL3Wh-elquD|yJd?T&ZaiU|Eg2Zq4TJQCW zELnf|Z8__w55F0H`epiJ&nT9F$XaATtq7IVXtP=+}(Tn?46xE!_jD^+ZzrB-ClPz z8nv38qOhJZ)>_XPt+gT&0d}QshlBx931XbaokmC4At@2NbO8buAVqPS2r#ko%Vbf7 zMtMmZw_7a{QK%>gN{N&cPV>YMf;>%)F(Seq_Er9Qe0187DDsEH(N=FKj%TfQdk{~c z8y(s4uZIWO8(ZD&olHO>Ibo_7Q5OiNmvs{tP%G6kNotjL z#8Oy(9*rp%pg`v@1Rz57`z&-f=PnB6Ry z`e_>bew3xD=V@S6eo!Qd)->CDl$;)_W}w$M{qCk->2^1J!*A}VhkFF98r^Vn^NcN$ zkrKaJ?{ntT&-sR=q;xFSjB??MAoUQ82^4{tG)s>UO|OZ~&^oeO6FbXt3JyJ^3B%26 z&5dg}-}@-}`iuQv{@k9NYUK%nQwWGkz-VvK?{D3_eYE!?Tv=OL?H)XPcJrMNUOs!i z`_8*BPfwfc8*!4N@sJ3V5)cL8rc;yTTaEVgsQ=dX&C}EV&gRBsIO=w~qsg$*ZpE`i zlfpW~St()>5scHsXieJJ=xLFx$bHYRC{tYdud3;a01??DH(I$07R5>_4OloA27VmJ zp7GG=aw1l^qTozvIvWi;?M{*9#tX)ZAI(noD4rR!W18A|X_Dxu2LNpJz@?v!4j)p! z^2v85p`R&qcpgInm;5*9{%1kD7P&}oyqW;Pl??Q?vETqoXiq86IXC{sWfdCA0*VaF z2kwQ#SGfFRVUSmdLFWdsDq|hWWEJ7kACJN%#LT5y_9A@J3tl$W#IPeEL1HR3N%iIe zNiJd%=VX;q=Tq)POQ}nJQ<;B9$PDwOn3A}Qg1Wvq$ociD05F0B5rk3<$mL3pv0-In zTC{TK94A5KZL9(!g-zBT0D(ecP!0nSe>&xZ{g=P}b)>;%S>X9an)$}d;yCa7bWK|N|y(h!Z{`Tnq_y2kHzx~U@U;JFN6(?SIt!T9bNC{AxqEn_PNSUKt zvP)|{Z{^Uc*CT{7cLr1sJ4i|GWYmDccaS6Xqch#<`37yuM{B#0skG0!qb zIE~|G7>&kb-}vL%H1+5gXD`3bCPRYLJkALVK=9PaWs?9u9UOd}j)&_V^~S9!BB4T* zipp2<1Q+M{Wfm`%?5FDG#^;uHSI5>>0eJ0HXjmxAmiqK_0n|dJ?B&u7vWAr}s^)7h-q zXvA?6gyD2D(@F=%Pm`1Y1J5gLp%i6l=6ObIBLZ2PiDN~iloBp?BbCaMsB~6H630Z4 zW|`8uD2gJ_k;sWS;W$Z9Q4}=@5u7L_w$}H9BFk6XEAcF8G+UE6jy8H(3R$J=o;ZOjPQmyuy>dAU^80kWnEC?n5CA1hVfz%Lq__i#w^OtKn7qML} zFe=1p)%qhYw_3}u!s3Bq_fjT%vs#8IP>BuS&$OyXG-ghiHzVHhWg_PyyW-r2c68P1Aa_wK%_I!#~^ z0StrQ?llJh2#y)8D9eT!b8CdPIL)9cX%_(_q5?(&LO~LOI*Scui5FLP_`rd+@yq9s zrzUDUP{<5o>xZN|t&l;9LQza+O8!gbyN^G<@z4I5-n!;UlU9}sW7KqX7KI+$d^YU& zI<4cq7n>WKqkcd1f;>r$){a>S8IXmQaB^_82D)isrPYqp*bDtEO?}VHv&{E>qcmD+ zcmX>Hh)PqO&WzCjV2nXTrIazAXNqM{*n3QJADM}87o}k|6xf+F`xTi7E;496Z+iCRj!b5R|Vj|%N=0Oo2kb7 z%++fh;WAC^vW0l*YEY?tmON!t_Bd5nUY@WO+@y5j&u2m`!Xm;bOk`0H0`Ga(f7vlZ z9~}WAY8K6v6JSY71g{J!TmJXF->=>W@RDSxUTDKb#NEX~Z7m_CD$SUbNH=$zqokc$ zzuC&7MheQ){t~=YJgwu=SvLv~9zOKLD9f`TisD()Xf%@~ZnRpH(WudC&8D+PqnTxC zv(?J;0+9T$vHRwmtjw)sj`# zc$R$u<-~}fbxH(nVFbyE5+JETdZh@|u@R>y!`ZW^;CcSqdcp$2<*jFVh6ZIyjuJv3 z(yW71G3mW~yZ`6^li9t&IeKIY=akk-9J?$fakH~wGYm$9lSbg%JTux9Sy5UaoCpaR z=FL`PMf;&(mZZMYd773_9)(nn?X*$^82COBv54mdERGP_u_0}=RtO}ZKq)Af_SMr+ zmFp=Y25B@JDB}A@kpd(jbi$tRA)+CzwXU)RM4WStC`!|`(Q2Iy&${ha?6MP`J(5Y< z@*PqkFhTfwIvDS+{@=d%yI*+OUqgKTU;NLVKmNmG-_Mm6DgEB60Ovp$zk-$%3YM=x*lP`h!FjtO^A!`j>eY@UuO70?@{@IbRjnarbCo?H0$&2| zOQp-^CCULJ)gGoYb5S%37;zh!-5jQ?IqEVm1#5CHp8I0Xi|5Y0mX?xMp|-!x1Njz) z0IZ~=3tjedA*cX(w5U3W1foj(GNU^6Xn&)95TOgT>z}HqVcxhq1_UC{TF>QvoSfbN z+PG{wIMLb^wg@~wNt0%~J)2Crz20~OeWJH4D&SeS66%YZa;kZq_wtY z8jW<8w406bXqXg5c0BO&EQ$gXdRC*=n1hg3B}qbwkYf#i&M72fR*2%tMM~Kv)yok9 z1&qwd5~7&BXM?}}TOEZfKmPGBj4XkmHxK8W+XR_}6>^#RONeL^Kx#Brx;-A8C1+=- zD$jvY8i|zFWQ>U-^nD0IN5qQQ^9ya5$U_KbGxfW#-x*}LW^P3VKAMn}(b_pCKwlw}hFhp4D{jDSDL)e^mfpb0j3;9F$PT4^=WX zrD%bNn{Nu1Qx);DtE?6j;ZnS5rT)b8%dYtfdOmGh{zd5yBOyTnbSt^Lc9w6>#CM_v zoC3i`<6nD~VJTZTm*FSteQ&h}mkuj5#Q#G8NeEDT|a_S{{Q&Ge70#d~6 z2!WIUXd+@p7L+pAQH)Y`d8-}+5(H)vDM6JDasG?vqrd-6V{5DN$;W5PI7I-S5C};% zRYF8S1xk70Cdh7Z3wBbPDCtQB2q@DX&gmie==yScYi%Q z_?Kt*@2e#CNqnCgO|{ac?al6YKkEJXlhz-6f70vqkuswM%hhk?W3PE6aGq2P%MO6$ zo`XmM;J3WiuHN8E2KqWiKP5P~8f?(=bIXBX3HF_L*$a3WUKTQ+1J^FhWP(c#_VPTl z`lHI91vMp+5r9B}016k%jXm0L`_ESO+owe@6^pvsIOEdo<6Go(^H&*goC zlrfe7Afkw*R;DgfgXYvBDwo3`Rn|F!h-D=RpulaU#r09%EA&(dH`X}GtXN{L7zLOd zE0W=$-|lrL$483DF))G6Z4d^d@vzhBjt9feO7HCSq_@6tHau&$+rvR$z&`l(Z$J5y zKN%dK_Mad1?!DEwj3@n#Rwv1m4i>Y=500KbG|gtPb3M9sXZ6k-akG^vN(CLGK_csr z#EEDI$%--x(bQHr0VfDHD@aiRMZ>!6*;BByaAO0!2mwJzs3@1HHI1g~2dEMfQ>7XJ z29J`2XWHEO!H*yPyMIfzur{SAWaqN+w0nJPbaLFed22QsH&@q2xur%_O3Vnw&*C7S zL>U^RIpe?!iaZa4C{6Py46`(CN3H(gwAbyi70>swEJZ=j3xtJ~0%0f4vD3MVB&O1kXFXYHs8LAT#f2&f(?fla}-OEOO2!SGcXSd@V&|f$E5qO39Dka=DrR`vTvhu0>KNhT!>c2F`Jz&s_q_ z+1T7TEA>u}Dy3lx?f`git2tvDDg?QTXuER<)>JjK(KFiQ^}Jv5%O)(L-=`?*8B#iX~PdEvp8ym zv+1neY)+?fr_(O7qRiSXg<(b;5C9|w29biDb?o_GiENrLPDv4qAQ1zzR74PFVPVhn z(jp_Jjn;&ul#Y`b5eT4TcI+GqD?E-zXC43larDjjAAZ>RAOCc=yE9u~n>L%{C>$A@ z0LKKjZ2SqA#yec)J;FtAe7zgH=%&0}6=;cHbaex`Dgdu>1Vr;gbScHFOfA7u9C^_? zj7uRa)sTPAWSG;W&v)XNp0mq7_{B@5oWBboAS={BI?0OJOdH*FxG^oZ#@xzL375+~ z#)S=S`RzRIbguisn&(!2Q?eZMc*4d?t?_8Iw!Seq8?3CZogANZ zyWPoj+z10ZO|l}p`|)?!1pU#>TU`q_R!>g*E1hnU=YAv9T7!rZ3t3!@`qRB9)0fZV z7teGWN61a3j8fVIApoKR1%O1*u^?%2s8KoRK%@bd?|(D+)zAG#`}z-lG-@<*1|^Ua zl_rBD$N5iuaBN@uAMNSF#6I#!b@O{e6XxWXk#b~g020!67Uwsx*Rf4+D7t+$Vc zqvp=;#M3tL7*LD!(%5_O@Y;*hyM=cxXi{dot>$br>Gf7-(^;?GnN6mhb|;y|%|_E% zM?``p(iM!+@obtGh4DNf%x#gTSrGUo;k--|&26EL5)dLnh0IRt(o!acvs&xCutu3O z<`;l1vk+u?>cAP7Dn?a^a-g`3`2hu@6rkeD=d$cJ zzc9(Ue9FTm6xFvN7q1GyRRMS%Z&W7C2`^1k=z`qy64-fO1_&0=(78ksE2QKFWg8LI zBcpm9Fuw^y&29rEtPE#Jf}#nObBYj^i5#tDZfjyY8GB9$z}2TR0n!pL_X4dN7bC2t zCLZTnv5L1p-zn5mM_NisIamD3E|_Q@?sd zWaiB#I!(vNhenYtY)NotVGt&*^EB;tyW`QQyRtGKj#t;$&dvs55M)^rXfr$NpPmhN zzxUB3&NOOlMy;K#L4UBZx-lM3IxFjl3Q;LdEUZW%ofW62qlXVB-#kd4J~5*K^-uj- z(jpa6siFZzN(78H>{tr0MMR7>WWA{YKP3?caX$ttU^P?!5DE-!iTC3PJ=7 zY|%P7(qG=cH@3GV3=7z3txQMb_0_er!Em*=GC1w8_Ii1eg+ahhv^LH;K(Xw+(hxwZ zEbU4wQs_j+<8c&)2vy=@`8*}67|WjV3u_Sxk(gN=D^$j4O$w3nJhRR@aG<~o!#GW( z9sX{1{GZhH#rNKb-@ScCBw7RMS~pg%rBvy#<2lF~7id;FuY-VB>WmTLRcx!p?*m+^ zfUXL_Yq|kYwJk%DWt;l>XCy3%DCXTU;W=%^Qg2dmgmB*AP?bhl5#MiI z+de)y*;wD~_Xpke^}-b<2uK;F19pOl3Wbui=%0?BJ{~`KkUoAq{OT(?KFAOE1Di+W z0*^F_Z$P=CjmkTGdGH_qgLb*)WPEfmd-6hO2@cQH>FGw)@UyJ#Yfqz5gec6GDyNko zqHKQoMAOmu+O^H22M-|2fzVmIwz;*xe|Yc151#eUns?twv|>e6@QUNv z-~9a6$#8dyJM68RCQOUX)z!1p)6LDTQGc+xwqC?(Gi*2(t+faWNSq{|=O?qocp6cR zF;J@Q2|&Q}d`(JK{^-gpQrfSR{fn&$&bbicpnYRN)7unkVA62Q5_W<@tuH3ZA_%MX3ZQ^$Z5fVAQhnD(gcVIA* zu$pJnoTDQsB2pAZsTe5(W#^ZL3THtT)F>}&CTVUj~69WpyE`LluYZ+4e@@_Tey4K8V)a8ALhWSlyWRhg+*_Cr8KI8=FO%1)g8zxiLnB5h*Wn-}kaC z3xa^1)7r4(@?PtTf-N_rNLUb+FyyuXLhA}<*2VyXQ6|eW&v+~jgtgYfq7*r{S)O`Y zE2Y5bX&j?xPHp@ID7x@NTDd@%DkkC!c;xMNlF*O#r7XAc@;0SaxYv3 zUY)9Rg@m{&0IypHI%l?Bh&-(2JmShDQED(85tbL{a#}JM@yH_OdO^}((oN2lq~(XI zLnjGAn5tNeYR5`ID8z`U2oOaZ5o|GUjN`Rfd`rO0ihSSG3`~{PxU%U=Metwb!BlON zAYR-WSC<*Uiv0jflPzEoCQ?eNIykY;^(r4F5kMjU=NtnIi%knZY-Gmto93WxW(t(j zR%@}Y2{7A#xwEw~dhx;tXK5;B5<)#y0z_djo?&N|(rhg%BBGLa7We^xWO+P$`ND5@ zuYdUd{?q4vA*_wrTpK2F@7nI*Y_fL!`q9~7V`nR##ap{Krb*K3cD3(=R#BrlOVU=m zQ)F4#42om|c@n?e%Z?Anj~AoG5VaYNw9z;icG$k&=;qVe#>#5{^mKD`eKwgiqh_Av zN~?G_GoC4Ifrwd_HJiE60!Jz6X(=_9H^w;UhUts~Z^T(Yl0Tn3{aGXH{tth8(r%_25K!o%2Lm))fXdX<#Tj{V1XOcQm*}Q88a*SAJIhLL<0boKaFMk}PR?-t_ROZT#WUVc-WvW~*fhElHFJS$Mvfuth;i39wQsOEY#3Nso??qGsdf zdvEoJXLgb^K(w(wPP69b=3p{j-Q7Js9$dR|`}pXjx4k)zr%|WvMU5m$uiv_TI_Pg~ z?~JFzR<~2wqR|M+F|liEbd#AE7;kMw`%!mg zC^_64J$&dRcdu>ELHgy#w*owLDUZDVaX8m_cg;_=k?JX_en_eI1x z5fQC5gOH*;&$ZEth?K72$?WDH5Gj>H4)~+d#4158s_+rc~7yF?o~G+^PQP24G_;66fd0bm*Z3~2!sIO zDiZRl0K7IM@UkPADz>J~$M;J-2dVb~^eUjx()zS+iz*}8(qdMYa>~!;u#{Ij!ue@cX$vUtL`Ya&Qi)erQ>F#mA z`{LyLt2f~+?gouOdz0y;x3V%C4OhFp$!OeeHjzP-DsP`ksgl;9lrD-wMA))YB!UFQ z)*59HsNC@&0E;6<&a&tESS|rd9$W2e;lld9m*pvuDy$`!W{8bvLyyXN~{s7IiSfDNkEW=qM-P%}~LvE)(+%)G03RoXVzH;JpW>#6{} zmL)JDs!Gksiy6>7TX8OAo@bMOOCBWRe3DWMA{J4LxS;NwhmX$3PJ{?7q!cP$28NaM z5Cfv7aeQ>50HF~&EX9|wlDpMu*2y7oSY9obV#Q>hSWqwCa9#jt=~^HFj8dnjl-ppE z+U<71TTn|rtFNG3Dwe4PrNodBfzUB)(hVff0Tgc9@DAE~6zYNikP1Q%l$}j`tw#S~ zztibVM*~ve+_Dp*+^h%?6h)!6W@n8yNfJ9|CtSN1ghi$YFGmLlx8AvD+KoI*XQOc= zigHBNX(UO~SzGH*r=9JsahwLN4*0=1%QtS`ezt#b=fe-5y*Rk`*1HpDS8v`;lnyty z8#}vex9@Onbzu)*zPR_^JLue}fBm0amX+%YC0dmm_bOS7SO|YyAu6&@Z#$*``=F=xBl@@i?`n# zA~GR>lKPolMn=zPKg*)zTAhH44KRQpRGPSRSBG=p&u@$Nypn-l6@b@{0xCDN^W=~V zL&@b}M48XjFFirAX1$dS56*`><)@IPAq-x)_Eu5m#7II^&r^w!m53+I&XVsttr3I~ z5`qX}W0J4NwvnrnP)v*2e(ex0kLl$lo7CIgrSGb`>(qg<%Qx){uR}Z!5ru_aQ%Wyg z`M@acDPbV+SwRk&=j}J~xIv7{0FfxI&}M13+3cU5ZfVFNwSYR~I+ zCwabd^Jae*uiv|Kn$E7j^LDPy%C+mN(eONdaQ~rXnaz_o-hXd$baMX}KPMvM^28%3 zZPHi6zzWfT*y$t+{A4ulc6%pJAE&3s2&{b1Z?tR>c0T@a z)M|?k1INMfvHkh4f6`qyC-JS;He{J*X?Ot^ZZ&E_;XGrYaK7@uF%c3eYYWf!**PRi z;<(vtuyellYNRaHR1c{pb|Oe9TuN5w0yb4i7zj%yhf*X0LS%){@>w3J2a}V2OZ^{5 zU-jSG>Hg^-ABKTbS`Y*k03a%nxnrh!nGg{zI6vnMFw34pxnzi0=Dxj>L2`aMclCBv z0RGzxfWpN{z9L%!)PdCJCy!MReVOS77fiGBoL{MoVO;mrmFH}E1Ya+SrIhZKW@D@v z^~lZusW8etB|?srQ^+VnxSAB#&uk}0!(gOx=L$kuLZtHeo?p;`01?!~pCypod?F?D z{d8Hru*OU;1;O(i7hV2sBEjnWLIP9*jzkHdpb{uRj=JGNi<}}x0FBIf7=$bswOi?I zw%TltPWzQmmWV(hfWwL*hJ;0)D{X91a78t!>$OzuCKt~J4<3$Q?)wHdu5a2raT z_zA@`O42|?8%>_-bUTdLTVKx|Z(iF?^5oj}>&bWqSw217AH8_dfAqA~iq^MRx3OJS#!nsFaGN0Xu3Aa-)UXrS+0e9ej^fUd7*L=d4aDDS|&tIM1)z9 zX{`(EJkNK9YqdMBV69BqYF9B0HFdU}&RLfi)*5ZZf-zp%x;qgr_g_fX6^H~#1qy2# zWwGg^?r8z=(7gsfBfV8)~%7&mPD0kQNmZbWN;}BRS;jH`MHpibpFhud5+s< z5aD8%eDwxbEFgF-iNG~XpBFiT7e+m`l>gQ8gY!PA`Dx3g^BzQ4UV*SW9}~8)0ZSe8 zO8_K*4$?R^zAqjLDn|fFndT!;JzQ@*>SgP*+;a{s2^y$^TjsO*T9#V-?B^!l5jVV-{%%<~EIJjrI+(#gz=OF$J@Tt*(CVhJtxa{K0K`rYTrizYqpnn{2KiEcDw z8#g ze^ufI9m2}ihBO-B1q!Hboqh1A+aInKuo-kXP9tqRAQT8ZA6S%93ej0>lqzp{g)PYF zX_7RfW}L)P*l^AnWAY+5N>PP@m$GgZMS%(tzzHaA3g?XPS!w zFPAJfC9Yy=LRF@yFDk?`y=z&uT|YEbE24x29EcXzDe&er`|x1=Y}JfBFYypT7&M1b zW}V+?Nu$}_y>a~b8?Vu_@syzAvSEGGn&V;|voJ4K6BU-JE<#ESfwC^&d;aifpF+R0 zb8YLbx3)K0LDXiUJh$w)ur6ve@+=R7&`G+s)fLN;(f$4X)4iwt=g;!N86>&ZAcV{U zibOaH*qLmU6Q~(5yofY9CZ#G+LoCLm~=ebrIM10S)&Xzy>j0^DSY&w=^ z@T|YDw%UKQcfa2YemUG*`Gfyu)@sJ601=r0fQdn9{z`e}L4SFkbNPjH!2*UrfWnvR z#NrBD+U`iMYQR+icwI_Rs;>dGSf9!{!}$dv+NF4a3h8hG_K9Aa@klK!c?kJ z2GIg2ptJ_xvn;Aikz{sSXFeVI{A9iH_$1v(+?GR6N-_{o6%=1(HeOg(FTeIG6GPSh zFYYHqBvAQtMHZRqA{88T4oAB9;w*K6QqGCU5r7m8CvOarA3htOH1#0RxvvF)HQ3NV zPP)-3(q!$<8`Bprc{H4i`Y2^bkF}ox9J5kNk+Qrc^5{M*-1P&R%BKxgyXLIZ6 zmtT#J&d$EL4`HCAMrU>1?{-+LMyG>{lt2-WN2f;yV0hBcMq@XbfOANU3ehJPF8vLH z2rN#7mcdGO8YVCh60_Cq-p==al#o}Z`Jf;wvUzS4aZzBJCWAgAD9`h}D7Lcm=9?ps zs3=Z<^Q+d;$z}|jVT)qB)>=tMqaX|nsv^&$pkb|ThGCYZ?Pk;Fg&zcQl7wM68jV&u zJ)7l$@tku2;+)f3TgSredxp8xD=9_>AwZ6zC`n?^_r|kHtI^ET)MyO|sL<19n$955 z2mPbo=EfH1O+v`(M-hZv=0?IRMRwN?3qEkc0(XeUIddIU;5=tcU@A-}dg+K#Tds1WF_1Jy5KRa%kfo^=Y3R!5F$oalg z+Us^LGi8ll7#=_Prs1jC@o|-2K*-g72-)!xH1C`^x4zAYkP;`G*RJPD0szV<5r?xG zPp19D15gBtK&z771|k3&giB0^DrNDEEG5$bsY;V%Bm^!+Kn&%7WnSQg8JX1j`yYjG zz1LSH0?0rJ=$M2#Pg}lkN2BrnOQTSG-efYn^TQv<3fCL$)1Uv6zWHV~%kH$cyF_EC}_LW_#`Jx4pHs%{zC+7*xn2iijOovv=fD-7-Hg%JB;c5TFS1 zG}*m%XT7_6y!S#h*_zL(45(0Hpq1w&zL}IB15DANJJbXI}L(J3?#IOYephf zQaLLA9!i;qAc(^3+V|e-e)P#P>fGq65pb-8iP>o7L2>f%Yj7DVD6(wh#*LFW?yhab z&-Q|Yqt;;fc6W1naPsEP?&$bQF2Xz@y@ zytUuHh^}o}wZu&X0W~Qo3g-&cCTE5)kn&swQ~->c5v-C<&RdgWJps=OL%9=m0LVgu zb$yEYIDDoU3q0>L*zQ;iAa^#gZY+jN#ack*kfl{ z3dgn`9#WbsWIuGsMtjbJF*;4sW~)tF=Xu`lcBhjh@B+>mQ$9-`<&y z$DLL?p2Y2DXLL4fHJc)$wddFh%z59)wlG>%$(4ZR<s*b{^j2u_RJGEUi-5@nccWO0|5dCD(`kEj;YtR2RRCV=9iYY;2-G-}3ptNv#$Kfqh2NLH zf(z#Ja+c}EdFbU|Qpt%Bq4IT$B#3B8v@Vo_z;o;Xk!w1spa`%72n2e$U7w`Qf{j&1 z6aq3V;&Ue-eU-a^CRcnCq zlVhoqLG~T`1u}!QqZ2M-=Yr6mfdfw$c^XEIf~^-A=NOf@apPu^XDm*vRfx_pDkUrk zWtyQNG7yn5e!IQ8z4iW&f3Ui<`Q>kZefsp7R!Wco6p*S#DulHw0_Swoc@-%iQn}EP zR#gsgImm>V1b_j_70`b3?cN{$k=?mAYql~_pol?20GK7f-0?j;K0f>9FS6q!4PcZ% zv2ypve?W~W+uJ|<^Z)Rp=4$wC_>bQCv$c~j~36% z42uSEF05L}xfxhU!a`a(7wZk*XEeJ*dIPn5MozDEgFAC>JP34E|nax|b<17n; zFpXz{AJ{zCL}CjPMqwiIJ>T=gcR&1a^Ty4+r%yiryT2;q=*`|NHOgV0)1L^u~M7fBWS>`1t#eKl|d7_rJ6MeDB8g z^<**)j2~!|$LaRk=4>?XH9N^HX*8N?k~A8PBuRbW&-0v=O7qOI^E_>>RSL5r4?;i7 z6JxYvD=3*Q3TFurL440o)6@jP*=T4YuRj@CbQ6~kir8yMd&6U1Yy8#0gC|}1)%Zox zYi|6}A1Avvr&O7vt_-TpDzKEDXvx&YI>e)HRI$V^ zqX;pV)KCO;BpPHjmX%4~wo=-uGy@RVrKMEmRD=p)@q7<}%f9~nE)M22N37f8a=XVM zh_V2?NToH0DhFz=*{FSHRj`?GxsFCa03)DLjN@Em(QXWEoC5oPRIoF~6h#rWT7>}m zexY^Bu(5kXwC?R}$4RoXxy1;+7vx3GP6V}eoM-vb%l)TceK|fjBNtseczEHKw>t| zQI?V`nhLzrv*i^t!4`~7EM-T&mB z_n$p_{Kn1OgTs?f)D&hZxZCR3IBogSY&wm?Mj9tU5F~LL_(7T`N^2+V*eRp4EDJ(^ zmd3{D(PSJ1K~WSX?aetRrGQ8)<($(-$64w%!sGE7_%tq(gm_B!G@bBj^JjT=XTe}gj zR6th+;5D&;6jbv^Dreau=jJ&AAhb9aY7jmwr~6*eS-!%oD77=QvN&N4Z7x@dvP4d) zkel_EQxK7afdxsGU6BG%&H@7|r9fC=OfCe|$?V!JZx&8F1qeAgMM#PS7?H4!cA1AA zmptDZaay%m0$7@et0_1FR|9?0e!Ek&+?}nvq2jrIZ&YSstyfCL*ghZd)&Ct#69)TC3}6mUCe%iD;3b zlmRIW2u_h8YE*S14+54ZUL>iuh&UIvE*k&xCqb|ft^fEB zs^=yo)HHje6xw-$P5$NJNc+T^6 z4y0H)mCt$61s00C`E_B55d=a&B6PJ1zA6B(tpY5Piq5k-+CwMubqNc~vH>631Wqs8B$WASghv%)+9z)zo6QbLLi4P-X2< zdX~(_<4Ge5g-enC+!72_Qd|geK?f3~QpzuLco9MU4zPF)FHxeaz?cOIthzAF({jq2 zM73G~L?vLHZ8Dm|IjwBBIkFiO>d*sV?FESit&A~V0ivUDn&&~MmjU=IYuM_Vwe{BZ z-S+Mc4E^TDCMXp)8*DARg4rP9;b4pTebRbSYd-mkd|FyCSk>>zE z{KKEJ$n(Gdbaj^Bbn3n4y6lfWxcSEEv%UB3-t8YAUEAE64u;z+YuRiT`k}8iIc^wV z3Kw|3D_j@^%r5Z!EYE!3XX}E%FAD3#d4WHhO~WXf#c>oyh~#PQtSzCTgrt>XW~Fsr z6w1?+G`1SY*$fn>F3U*9P#k0aMc)5adUPy_1@d=ySO55rj)TY&A#ybdR8S&B=P!!6 z!@N=uT$p6y(lBr#j*v?1b8g5gHDZIRr~aI!xRlCQoA9u1FRtFM3c!DRAOJ11(d3n3 zq*c#Yr>Xp&@X{q@^s6S7=QW}=ETtav;G7}^^Msc9N1Wdzq&%BYl%NzWEQ%-x)`aa; znn}@e&bLkpf&gjKN@Eo=Q10;-!IW6Vz4JNEE6itB3mH*Oti$Co`qB!cR?firqjjDf ziFJG!f|7rxl{XrhA|}*;hDEVpo??7LDtTo2uSpkGjxUhxq`GvDel~+DuW)`POYo#i&S7~S_OpB~gkUGZ% z1#tpy40c5Pd3y3$(SJ~!u~7x7?LYbn-?@868VCg(moh4<5`tg>8(APm>I3=}DK7Og zjB30t)Dux!YVdJsqYSSY#zIX#FWaE20&rCTUSA^2MaTjCzEo2DHdNt%&TxRGlwn>3 zmPvEvW#R&%VeXE(xNm?8P(w)In*yC9ERaBBl%?y54IQv>2%a&90Z|lH6YcuY6F{WO zzgz*R7w~E*%LOceKjpvA$-3*^-Fb>H)QM?SG2f-im#<&WBto7Q&)IGv%|r@aMZ+d3{lo0ahr2qSO7Af`DOIk>)-o9^!|sv z@BTR5*g5rd8u+>ATU1zr1f4TZD9b2GeCB|Q=GoxUzxr41^bnPD%75pB_q9?FfAeWL zn0_Z%xg+65rf)Y^cr?4Vwh^BWwpKT7R(`)2H)u(WOIa38}m6Ad%|XJhvQP zY{I0zfmWl;t2F>zIe}k`4XhliK*dk^mUDl8QRNG$lS}U}OOavAzk}!cVuX3yT=p_t zH>6T88kV=jc!4?x0s@RE3IK$)PBgp}^_vY@OS>D%nQ?h{#>zP*L_my4fGjNME-qCP z*_;7^)j@-$8?!2GO9S7_2IlfyU1k6*UebW|D|S9at~>~=0Ejzj_HG{mr5D@Z-U>F? zumAS*FSCRF?%Qt$jkX0lOESONj`O(L?#5}RqR1i@WzFh&L+A9y+G(Eooi~nWNo!*} z9Sv{XduP@^*+5FiBM)RU7-Z8C#p!I&*9x-f%=liBCdvz3nrT0<*6BuM9ea&Pv@t;# z_Ev4!Sh;sM^P}eV>u2IryZthA?0LMfAv1tOCmOV*iOF&=%bU!>c=*k~`9F%2eb7!f z8Xvv)36Z=1_rGly^zq8I+o|4Bepdx{JnM$dq9~f}R*_~NYQqG~nv@n~=d@D7z}37_ z#5qF6z)C4=8BsAg7RmAqNqO2hXFbp4)_PiJNve!43$(LV09YiGA}5|@Ie7YLbQZ1j zPDdl-d&6ve5az#ggU@HjMQCi1voh-+ew4L(Q$Qgu<;L}>uhhW-DN~cHPgInCn#Sy70WYm zSyr@M9+tAX>NZCzjPG)%^Gc3xd6gDmvk8bRkZaALAkq)NgiPs2y3f z(AqIWHz+_TYUCo`#yX2oVVPaqT8U>W$yUZAD6)7u_E6a@MN-ZcCJ3@DZ?3IbK?(xZ zY&jx-Wi|Eu*!MHfKP6-h06>A^r9+GW07U~(ocL^wP1-K?2g9%b{NEPG2O#dwd+!rc zIzD@T|G_4OZ-l+w!fdeL)q&1jq_S@j#uP;^Q1fsQioEcR zcFq~?7X=e3%MOXsEJlrlFen^7aqGfx{}0T9O=XNhX~2g9>wuXAvE z)Z5;Cc6iWUTX`}#idTcrMlZkSF?XBEY)pXO?pE;58>ga06NnQ81_XBHHL=uvRT}^j z5CE?3f^*#A65U}jBV7`SQE8;E1^v~=h*${G*4@tqj^SbkSvC|`-TzeqcwJY3isSZe zc!=|suy46{;=(5-uP73iKlIX}31y%P0+r1W)u-@s5jxM;WkD#dw@jtH6SN?R%Z>S} z18^fU)<*Zw?wvWmP}(sOGL@42rIvq5u}`%Ntn4}Gu;@kmhNaJl@SLZ=`W4~)(V5q_ zMKN2f|4M!*2nrf8j38h;sq-u=hSk}maV-en`taf4#iQT+D*qIA-hY4NjkgA_2pVCQ zCQ1`XQ6!lcMsZ${=NAHio}d7MElXm#(m^l?U>&j3oerc~u(`=;7I-=xO?ut#pnuw4 zTNzI#t=`HcPACYO(1EZ~sR)KqF6FdBSWpXoy}}q3cB*9i+2(Yi(n8e6q8#IXoL~ zuW#CE+72R{W}fF2xh>~*C=y0dk!Qva^1RT>v+R_jEKhv@uDNv|6pR@u<~m z#j~05yuw;Q0))(26NN{Uesi_+Xz$sL+qWJ)f4;T5`{j$r@lNY!r;i@cZ0f@xjg@Cy z;nqHQd(!J3PA@N zK_NM3HK{Vn^jtHve36!Ufa%rS)ehiwpg>VkX#uYEDufF&A}xB2`JQTdSidwFSzci+ zbPKQa!C%Z-TqN}3D~r$tyUnuB6zB7xax5y!5~bu&DMiwmVF6Co-l?UZtWOvt1h zl2s;G8lvV@h_V<7P;;;V-(%I_f)^|So_~`KP_+URhIlI^0*eU!EdON`|+ik7r z%&r8D78w^OJ8K&!hex-r-#XquxP5JR)*tqwMm9?$KblTwMr*B=vopa>J%iXbvgD~c;!V(4VV%} zwv{Plc?nb-SV|=im1cA*7rsKmTtcV>HAsu7hukRgP9crd;$+%3#!aS18%Jd$g1EF@ zh;(~5}p#WU? zXp33=B12~J{;W}m9ARoCA$F1HS!vIlC#;!G374oW2vRP5%P~(0d7iiFOLZ_rRONaK0aFQ76)i}XJt4?l>r=p-o0`B;^56YcL&GEn=5Ox z@w5>&lRRrgO?J%eeBZN0?i(*j^DqqaJoh}EWtkrYd7gWokBHW}An@bKq}^@}24^cP zD`%s#R;N9gjg_Wcc$_6sxAkcM`R<)NpMLTAy${~~#W$aK-o5qj9(~&H>X(olrDO0k zvtv?gKmL*W;5#ECr?3h)tsF>U9&-e8-E`}om!cMG!^87MgNEVF_E}1f}Ho#W};B_AUwV_EW z(j--0tyhcs|4Ua3msX~)ILFUz7YHuh04}dyFXMLS??A#N=m}bc#L$G$7%wa&O0%W| z?W)hK7WP&F6zgo7CZ1=?WdhEV1S;ywA}DjohCv^0E(*-Gi6v#WpE}^%s{A^Kol_|BQTW3QJ~K31O(+o2`B+0WUTlM%8Euomuz}S zPoBQ~_kS_?^mm@djq4k4z58~5Z~yU^Uqe%DjX_VeFteDv1;`}3a=CC#=J;MFAm_fGA`Sph>uyX5qnJ^7p^&|J7d&e)ae9{RhR-v71eA z-o6#*nb&SptCQFQ178R$vMti$%1h-Sv5LLCI=-$7!0QTyUz&3ORtdMbIR1Z6l@#q6>IbO=BM zETAf7s8X7QmR?imm_PG>@b`TCI2Wi^zfwe4&jY?K6tGM#pz1aNfTD!kxm!(LHC~GdheaPrrUIJcKY>$voF532S@%S^-!9t9nnVVpak$+SFxHAgdCFylp*pp@vXY9 zVCBRUma?-YKvlb&P#9U1WhGFuPnDo{xd!WdutpHQJlOxszkK<3e_Nalc5Yn1b@N6% z9X1Q9@duM-te`{lt9B1R{jm@3s zPoBPY_sy4&pWWQvJ~=vGU)wl7IayszC)0@^ z_-T=Ba75On2<23PF(aY1L_3Jx-cmH?W zAHVZ2fBUn^PUG|8!I@+wMH~rP00=?%zUi%>{sVsZ-C+scuLu0qEmLZ3aD~e#-P9;` zbad$$sXXL}AdZkl3<&z@R#DbwGyUMf@Gt)2_-B7L{o+e|Hqr%XB19Gjr&O@L?OL6* z5n`vEDRkvsf+~-hfMA6|K`2v0uL{6b0eF2jfTe?}LLZ}u2+Fc5`P-$R=Z>~-^90PT z25??6eU3W{d@fe~aI<3=Z&xa2m4(@;LPETkw>3F)^@KL1IXgF)NLg%a!v{|kYnJqYn2#y_6 zm2)5{R4yl2sG{Tn3KNK8R*tm*vLkUmQo|MN$iaBTd(V&m`mc}w_U~XcSn0OkdjH+i z{^{V^i~i#ms}$^n?M(^Z>262;_z!Nqz4zO%{_x}PfBo4PKm6#Er;i@pyM1?bI%s-9 zx6vLRpWeQ4^YF#XyEkqRj!)M&HV3Eu^|iIpVAKdB>k4KLf*?(jX4J~l)bso-&y43y zW|LN{HI8Rq;1_HKAPB>0GHZ3a2Zsk6+Z&Jep08coe7gU#v$`@EpRpnF^eCBm?daj@ z%jV7PfAiI^&vqKW9z4%|m5CE!Aade@n>SYf(Vz6AC@+5wr8NU{pNHkr8JeRldE|MKMTexAN~;aL~?ku8yi><~b#WzRF)*I;Km zZG?$Z4$IF-7qGlAzj0g@fd8VG*uVMrSC7Jfb_om@j#r$gwAbe#oEy+zPCHsoHCh(K zEl+G-3Cmrg2`yh~aVat5)svrBjDQ3P(2*!%lrqB#2+(tOXPW)=IRDAR@pqq1ZjT@; zFauGjjRmVJ(wqWBAg*3lbqoT6kT~m*h>%K)04=U3a_O7GxecNWSf1O(E=c;$`KS>X zmL^3`1VITfNv0rGY8a>&zWS^!pRTF+T6ch1Y~11T-r(8u)4e?|3h;f?>#V);2DCcO ztu1Iar4>ywt2}R(CM+mG41mg5VN%+%D5VNyP(;EgpoE+&lu|5C*aZkw6b-GZC;}_? ztAS@cU+1&*#luJ1IY{zbE1Qj(z2UdI=<#6k!L?fl-#q;I-h0m; zKKkDK-+A)z;Tt#aoE#qR^wwRP+br8z+nDu7TWjlQhy80?+vCxw-ENOZqgJDpB&qKk zKuWW$)od3@8hT!yWybg8Gzp^MbU27wQJQ5&8xbiA+ibUv`~7aWv$y|Z>-zSy!eS_2CLL(ap1S@|{;B%mAM9(-kszY5 zs$!38LkEDAJ}{~L99-H0%6(BKVixfbJrrM@wuKoSr;neG?mtSNzknhqM2`rZ0|v)V z5F9u}WL9e*eXPItiM?}cth6J=B2?Zn*vUMiwOlsTp$k`g;Hv`g+6utj>3Y$K`zl4~ zE023vl1`pK*-{Krv(x0jdA+Dlj8f&M&JE< zbbDe~CD4|%BUg3#i~yzZPnCzI2qHRQ)HocEwDzJfLLuP!U`#F*fMw+GbIN-stoso=u%~q&v|8M(m;-wmU0>7YFyQ-FWfz z={s+|{rvHhH*Ve@ot|#?*3wBF8PhO6XLhyOnhhqKD{JvAZbpqfO+8}@YmH}YVI85; zDo=}66s2+Idwv|pe&~(ju@{A-$*|dInb|j#f9Reex zkOb|`KmG^ihu=F5{j65;@|>*Bvh1&^Vu`K_z*PZwZ8Fe$ps{>*&oPH{K>WAmU0mpD zFBg)FewOp3hoz=oE^#C9av{0Qinuf&Vywn0qC^DI8uW`|bCQ2Yjju`3+>mpbc)D;qmrO@lqCd(jy`5N>-sFC+T3|izAS= zPS5u}R^ouqPEOLnBppv0#y8I0UEhJT>AUMUa5UR(_Dq~NME8Oy9!|EpEB(WxYu9#O zJb!-U+U{s@c5Q7ln@mIF`$~I24ddH5Z3T@iPP)yG%X4FlbFTb15EWvJ!UkTzx%K@Z zNfT6`}2oVs^Ed;a4`{gG>knl|=z@ ziV+Zrgt@%`GXSEl75z1iz1rC>&h{FbSH5)T;2=&So<|2ptG9D@Dp^-!s!R36UB>lqJ(vr;#PGayU3To=zrtoCH9MX}#HLIM{9V zdO2QiucjxXov7pI9FcA)1J(uFPp8vn(3quhtJRtf&(?dZlG~7UKw1NOpcH@xQVzqw zmx6t5M8qg<*&$*ku6&^KJdgY!D+)ghk~BuGvMgh9g$OEiA`IX_2r(;M3Plc1h=%D* z`36|5wYf(JruZg5`*nJJ7QoZ#sSf-+F9<8}i2=0CpjGF_4YRXjR#vsqh?F~F1SBF& zzUR*-6J;F~g-sKe=Ta10Sjm!PG?FZHaV%*H&H{h|Vj%ViN`HpbxvGj-1RaVJ5!OH~ zz=G87UHiv>Vn2HSz%z&jfn{!qXSpzatuBj1z*jebs{-)4WT2#E$(PF&-yTZGtX#lc zy{hpCcnwm~t@&$m)rB7sm z6)hE6Wu6U!h!ccDikU8Ag$2s6NMCYt5~#=7EZOKiu}RU1`YwaD_OO^Xx-Dx9FACBu zRVaX%C5bU!Zmm&Rq)8a~@ocJ<0)+i%&pKg)<8*j@j3VRFkVvCr&-WYTx6rKnQOl{D ztzO4b%VG%1kZGVYjDgasum%WNG$|4)PuM__0o05Q?HM4SG%+BvuMIJ3r3p|~Y8ybJ z!r5|9&mur*ZDD*bD+)l!U4cl7D9$rfl-fcNn9vrMeAAzff+!kHMqVrG&n6Ulr|E1K z(l>7SReU;#aBtjKk)P+qVogZ0WbQ1gc5TO>WNyd3N>rw$_C?FB};V> z)VUPz^H-nwSBpz*jAcrUEbo!)_%V3}K$S}sB7=ws2@#7J@*7U6+;=jc3X+u-GCKVHP%k zu`Lk6SDLL{Z+1B^T4AIdbXBn7H`{DB{b)l%%=2EWJwEOCn$0Xp!Z37M7NQPFqef4g zEXi8U)?_mFJZ+P#)9OH+1%amp6`?Vn&2rC=Y+RE~J-00adE1rz}aXvK~ZQNSS}GAKok z#gHNgMC23-FbEq|%p!oobu?Qg7A1@t9QfCM^h5LU2hSBUdYZ+OgG>IKI#`0|YB#yk z|6CP-*9!za2Q>r%s+Ul6;bS?msZvp;%tSdylV7HEf*_Je4fO=5Gc=Z3^;&Lu&de+4 zaMDuHID-$w>rj3J>?jBiPva?B(O;_M3Z$2i=`Fo*W-GR_+`P2VQsg zdH=}zt<>g@ogX&iG!6q#id==Bvv#H3&f_9fIy4lKX$VD3E2i0Cv*JhjaB_Wf>*Vn0 z?#8vl{g)f->$CABAmx)*0)g+xv)OuYb|#J;;9u; zq4#pwZ>{!T9v*CLZGE%PK%SE@6+ zbO#VHB7@`_GLQNOl7`VJCN0_pDklWMgoZ^sDR2K(>hA&uL{*f^1xV6zLQEZ^dwETA z`JOa)1I#NZ)-2LRdSI2LK#LQhlJkp3WwU|+q~ItBhl5e4(S+P#Vz;7p`ttbW>u=!k z@Ta%lHiu_FynYAw`#;{j8=X$y>27pbuTgNLvD&nFx4qiU@r~YAW9B~EzGDXQhnu&; zv*d1bZPn^+inhIm7Z=w$E7Ozyovmx9FAi>PUq5>B^6rhB!;{mk-l{KzjvIbBn@qPi zHqTD`*EhEYhsSrX-yELyx7Ie&SsZx2B6809o}VRoBZ|^AYekJDP5jVHl0+L_6ooOK z6`SO#3H-C++3Lpn{^8;J*5-?YgRQOYx75cc!Yf%ruXGwOhtkZE(Pfxdt+R*Hs-pxH10o4xfskrC3t$!yX%(clX`NRT zqR{DbA`b&w%v%imEs4Z``OStBIpvMYFH*n$An9@P?6 z;457uX|LU}S>6dFAN6E1+1c0{93I`?xpw^g#e28z9z1;f(cQOB9zA_)`?~Fqcf5Ab zDKjf>v{rC1d3XJKym$QZ&3k7L_I`Z#-ND1BAK!Q*I~i_AorWl#@wK&$(ZTVXySMfq zKYQoy-RF-Uz5nJr`_G=;+r2&R51L-s^22yKyS}}Bd~kUC`i+y92XEZCb+UhWBu-k5#%MeWqcDyWtxe`qMi513lW})t<>leQwVS&S zA3wTt=gyO7Pq%lr_fL*YGa5|CR#9Q-+3CUR?zNvk`ZBn8?cYE7Jl*O1^^5yiFWQfX zw)#QU3sYQjZP)JT8bd{k1g`4ZR~HBnVOKqAO9Oz2h-js3Q6P~mER;hu5Fk*b(kv}K zeIVk*5g{`pppe4e%IXh)2=BgqqK!31kQh)ZGw~cKdj8gni%gAqn8ww?byWafmlc>U zs#7kp80vrKNnEe|P+X-7miQbwmoB*|7_yWFBa5Pg)ieFvROQ?;T2DYx=CJ~J0T+5+ zS5rkZEmt6_)TIPKtW-uc^u+o)a4L$kRw09v(;4S}vmwq_R^jrnAd-4RE|;44dGbLO z`dUl*7V@AagY>0K!2D6C`t&Ej#dY8nG;ORN1VThX5)cF;a?XW*AdWR+(**f+w$|;P z939=-y>a;b#hbf#Up{&M&doQ@ULIXv-7Ln_wh02#>1c9uZF8`<|NfnOPrtbT(~rOR z=(8_>@Xm*Oj~>3Uvzrg6A?a?^n)XL`cCJ5r^!S5!-?{(!mmhub!NdFa-??*dfA7W4 z`X=W&u=G0J!O`*U-J36;K7aGpo&M4B^{wrbgTt-$jnUvN3IY(c)-|F=nx@TWV=^6g zn(fhK-0rr|hNGz2?2m?C6eKnu#k0;z@95Xbe|_hTyN{keUfA>4q`PJTo;NG?W`1tc;r}K-K4^_9-kH?~GU--E$<^oK==GV>vPBL$Q z%4SB1FqV`bL9KPE&g6Px#9ZdY12c1(PFm!IR9b}{I|L>t#DJop)xGs+e@fr^VBgb@ z3^LmK>8Y?bnSBdxgm5W^;;H~#6@b^J0(zwY^n7e@38fMN#s&F#xiOdJ(S2>>y4dwE zQYX(LBM?A{7Wz@S#HgrNvXv2c>D;_@=r65XE6C}Rzf4$@qiQu#B69>F3Dj6)5g0K_ z6@^cfO_Hq01LF}9DCL+nsdA+-|MZmvv>Fo46Vq@p&99up<@b9oB)`lYlkoPZ|?5yKYM<6_xAC@ z;m-O-Hk~z%-wmQkKTCu@aeM~8#|N>=EX*5 z<>=tx?R#&2_1PES|M-)ye)ri&@4o-^!K1hDzA+k{b(?LiR63n)tZ(e^?cKY5=lSEO zH+Of>PWzkd8>c6yy-tShdh^q-KHt4}=d)*zTHEW-&rZgglaBYxgU7tP`qz8+ zi;dRTN6&5KB{oNe07#{mrBu$y0^oYS#lf1n1`GT$Rus09e_q|okOV|nNGT$+&Xzq+ zXlCMp$u`S`jAeRur4cCu2+KAV7ZJ^PK9;Op z2vnje#IpSdK_VQA*xKITdvSeddvZ41?5zx1WCU{&$`~eDdy_Zw-%6x7OB+EH_BLHm66&yF1tSo;|;H^XALvdz%}Zv+1 zz<9JZsFTIb@>?3II{IV-OmG6}tcn6w<@JnsalY#ULq zgxCl>YmL!t^C0jGXPeEY&9YY1%%@4O-JMLPYwPQS{LEG$P;VG@fm*Z5+JV zd++VH?|=E_M<0Il)z@FV|K_{LFJ7*9S2P2#>$clxM}xaJ?>>F}=sRz}^Z3ETciw#K z=-^;`V>6r1JgpTHTf5R(nGA-z+uO$nM>nqTj{1XMr<XM>IP z_0z%W%4+YZf4Z`{zIX7lyS6f(O;}M7hG&Dp=FaxRXHRx-?B0L!aP{W3-|jtX+}!@{ z-a~J5<>Bn~h0cyc{_ObqB!JUo!k%`E6w-y72Ith53Ybb%G~wdQlzIO3 zqGg$f%a?e%|4e4z)!UU3?7wCNv~+lvN<&~MgOHX&+u_puv7Cu7sT8ygQY%NxN4lSl0Cd~O}g0qo@Z^AV*irn21?cH{K`dnewkc}T6w8jmAeKKB(7FhwWC|2@s%mqPcV;03$dND$6LBnN8qa$z%EKcvj%*RDXg3ZT7k^e+Ub)wfVR;)pDEu6048EKRjhIa}lVj#()ztX0M^ zNG?2@O`7fYY%&cS(JW6LfoOF$9(8)%!{g(vYda60Jic@H?(=7lw>P$v>C7liN@ZEv zZTE)5@%qNf(f+~iwd;p3_pfj7%qG)D6xlpSMBnp^q6mx^$8odS9G(qVdn?n~tl4U1 zY3doz<^_WwQIaH4BRDxd+1T9b5Bkk+=kWBT*=`*V`+m1MO;Z#IgWzm3>a4Fl+ItqR z_r5-P>DC*M`iFY0dpsG&p6ut-zD*L~9GMkb=BibfI=a5RMAkc_Whw3jGr3fm>~a}( zb$Q!QL?T=_0TmXM1PK&_<4S16f`E(|G#goKFRrdHK$F z5g8)Pb@WhOw65N+ZUC=o1hi-?%bRG$v5^aG2Kkm$$69+?_weVb_ptmw)rh=$>MvlP zfc4UKE_+ze6>w?BUzHdZtP(rQ4K0_NeZi#$xvUMPYEza3{qwK8+`A%*0*72ElPNRw za1elv0#+0huHpGbkqxFp(V~qmcihB+gl=AzL@H|ITr#`#`Xs;$ccdkLa6JzbKm5fj+L8l`}_8H8w^XFL)_$E_et zCh^+J>frQjdwt{d`1IQ5waIYQZnQucEVmo2e3ou>dhukk)?1mJjkY&7Cc|;J)pB`Z zNO{_D?izk1h4YM`CRwN59*>8ePIo*W2SJeKIg5~@yePEi^@qdm%F5yKVQ+2iuz%9* zwogaHAPmRJOdFlsBC)yGYP=YnKs);K!}J=FSY75a*p|fm8ppqH*i>fvd_=`YT;IYw3@JkiqrQk(!Gl=aQPb z!cn=et-l$f#V)zp>avgs0f8t1$~7E^__6`h$b&!wQdqD-JRP5nXOqwm{{QWr*|R0b zao#hts@JpKduIV=1`8LEqC^t1WLuIgie%VU$YS{K^@Ag9g@X!*1F{$tNst7HbujDQ z&(?cY`k}gdIp^E~Kn`U)oWG|5<}Q7Dx+|-4`95q*6wIpaUTshE)PC$;M+9s=Hn}qz z@t+RH$t%BDd6S&B-Y`0d`Cce*L)Z-+kfQc`+Ij%Fyf$0sX^4o{*rsW;QVJxIOH9J{6zdVm;lgrI2 zn8e$%&_S>&^OCsG@G!gDCiJjeodxyNpn89EwhZ}sxvoOGuJYVApj0Q*P2Rq(+aBXs zV77mB`?)^koumr4`-VNMjP@Q5kI%iJx@(poUnN6D6d1$@fAv?%U;O#wP}hnSQq!eO znf;^;-lVa((?j77Fa)@hRuv=w{B8ljmuKMysj^|a{cuk-$Vm9vE1yfU z>%pi_!2N851?SF-FUtM8J#Fjmi3n({MPv&c1Yu*1QdBpFnT@qU5Y$y2MUiP5trY@V zW8E<@Q~@_exd_P+khYBph?K<$DN%t&rI3KF*1BryC<<-W1VP}0leHp3LZqsxNU5@^ zR2VF`t8_kHZ`WZMGFW$Tshb8!6?LTowahkQ8m;rpXeyhUwccX0#^&7SkIeSdX8jQI zkE-kQl;6F6dKto5okO6mi)}@%(hhbxJ~wcSFB*};VJA?(+riQKtm{c0?o@o!LD%vN zNbEKk?#~DaOxDeSDNE}1zx=bKAAbK~64okGsEqc_rQ|z>z3=4yu778=rIk~J)|FlY zfCPY-I0oRQb)5N?FPXhSee-|?7Is^rU5y~-zL3le=zH?)K!I+@-iy0d({|@$6mZ}s zG|44~oH-wBU}bEKgbiC`Kr6SYM;<#+VmI>HIrkzkQ(If}29Qny5|AwzqAb#s z`8?b%A~JBK!WfY2W}Rp2?KVv(Y#E4@C1n7K0jwn_;YMCd4%(HXGdlMD=04%zG7^4F z0=i5YcLEg7CxC_{(8Jsu4tw0)%#$_7Dy7(3r8NTwT9;)RgrPAuilU+@k|=JBAyUB1 z)`m(WLz*UektK0ll|`fjTQ?B}0ia@tb%20@(w%IzLLvZ7q?w2mkz$61EdbPP0I{ko zrBz+mZU9)53Y50YKu{ZF!5ZM48>6sn>V{2CHbZmXPV!*C+@Sv7s@DM{52`?d1b~+l0Qz&N&x8)< zn09oV_j8o(`Uc(Jf3Vc`Qvz)dWt-+;*!PAUdBIbgpGQIl8xTQWgch_`2EZa=o9nR= zLsT2cOJb{{upu;F>UVsIrrzbZAM5o6Rkv|vMpV#u7lB2nG;X5cd5lj}T+hR88W7hXbs2UN zc%45K>{v_s(-R^SA!%(I69lTMYxhf|Ff!H>DbqBQG_8s<2!paLwGI%`7#oH`Sr>7V ztXHeqWRmB_d@|#@Ny9MGp>3?v%32!)L1P+Cgx01>VjCNfWq zO&x@RF~+iWrPYE>X=+rsF0*((yI8M+S#nWsvQ&RsE}sYW`}xH~&Ynm1{p}gwntgit zoMy?@c1?k<>k5Wifo`nCKTbH#F%Da7*&h_Z7mD^bH~pC1-f7rcM(QU8*k##V$+^pH zB3K}pEnfc*|33ZK|LSR^E2ROQlaNJrp7P*jvhbi9?m^4zy(^R$AOYYdwSo5DTin$c z$LXN1PBqv-30-U80 zAzZ93P9UFDX$JIBKnt51`4@&kCo*mLLG<2Iz+`n@Yx z&m=|G8dq3WN*QBNDF%qbu&L`Pj#ukVk|f4j%T{Ss)>RNi%k}zbzE~|+Cr8KGCYz@d zVjx7VRNa(Bs;=umhk2e)XVb=IlWK#C7`U;t&Obhz(NC6-&*$pHYWXm`rla)P)p?M_>ugJ5 zV3?7}4qFn&X-T+I^mZpCz+ewBa(3trga>3ic$mdR0<-{37SOg+!3Jn?>(w8AAKw1< z^E9e}fQSkFrV2Vaaok(|M}myZ2i}Wa_X`OC5&&M7D#?&Jh*HL%+j} zM7xt^XQWC8qHYByg4L%|us(L2UyD z6$Gn1f4aVGH0jy2V55|#+A0gZZr&h1a$oT6l-{^Inha9{xHDpRKohAopkd#UVgbsk z3c|pZ4_w2dBC^JkB4ZoZ1*AxoRhh)`cAM!iXpE`rI!=<+c0HTTm#fw7lauxJ>S#J| ziZTqeZ5lu%rShyu(`lAvM~g*~7jY2RWfewI)if5^0%v6rrO7(m%;t;jdcBy;*2~p= zvADRt43oHOnoW@fX?%8l6(7$(y?D-d=0E=M7u&n(e|z|=&Hed1&p)h>)AyIBOJ!_; z>ujsyurM`hvfbvu-wJXyfW1|6UwV(b!|3pV+!S76YL0}lp4qjB9V*dOaOr; z0yGBoomcPw=&$v6zI_!&IfbCe4ks1?hZEhy)x3M~+~4jTj)#e$Ub0t^0PvD>Ksas# zg|5{EeP-GE0Y#^A?~9h$O|XtOTj=(^ozblyEE}9;4?g0)%+(c<+pIk(uz-l9QCC$3 zTHCHvfUGoe7}+?gh%5n+ZCyGB74FV&#FssAP!wpVLx(S(Pt=f$My~Dv)*8fhte+?J zWI~rmag`(p7(-Cyxr)P0l|9~GW)ZBg#x#OZ8Ec#tJR!N&g$GGouY2bu^9b7+wPD*2 z!nixoJ0=s128i0ZGio2D@)2sIA=$-F#-iJ}M@z;GA@%p6BiUKC0x9Rzt%OefQ; ztIONBZe5*U+&Vfb^J0=DMOH*ngaEav<2Wg@{Ah8UZPt@?Qk7Ml#6?+>Cd;NWb)3dm z>+6$SCzqEOw@!|)udZ(0x%K$TXD6@Ry<9IrD;ugu%X59_=x5J9;a89T^LzhGee=P8 z{p1(H*I)hV>8C}kPdCdtpoT55B}I+3NW|U0`1k<#MN|&kO*i>7-A!LSs2g<;e`|5t zRSSkM3jz>mKmb*fPTqR!jUWBT^6OtaMa>idfZ?_;%pV<)_Rb>1*I_81b)!R`XaPw8 z_&r%dI%Tnbptau~@4QhX^&972K7Q-Gt{eK^IXIx|eCSl$?RgmoEsvJ1MYf~@)W!e? z+P3*#unJfQR%sIk4FW4{1&i3#n_D$E>a16GHjGY$-ES+CvQ*=yT%L!=Er9_s5* zJ)WqiGrc?xO&UgFm;`DP1<$TdpV#a6HfO)uoZ(^;D3ww`hPg8ghG7$wm-6XtWja;V z9jAtIlS=!Atz@yamXtSeLsVLoRTXH(z~sA+2+MtV;__fnH~u z#nJJTXHV|mzjtwUdHe32j~_j}d;itX&Yvd7v&(XOT5Ou5(A+!vyN`c9`J=D= z_>*6$2e*Fq*@v7)o2I}hY{0s>Xs{F5b31W@;rVk%)8~+WcpKMgJW36_M+7=p7V93! zHhFJbRVvqwL%<3xl8MvBpZ<$GfBl2)y}MfoY8BN40JXcmwm{aJp7Fkh)lM(me*eXR zMhOW35&&N69DvvS#NK+;H`Wik7W2ixiG@Fu5~{xv7unfVJ;%R@VPSMqnp0 z9guDNy<6cNCNK((bKk;NwXqxVaVxKFy9L=-qzCRZ+$Y_4F4c=L`r;v?ZCwPx5>}ed zVtSn7^NGr5DTlhLt6S4)k#C9+fBx*#pIm&l3|S>1r71U6~%?{V5@%7_Y{U}Y6qN$Kjk!noCV68QPsC8%=RI8E7)>;+n z$~26u16}3yY&yTXyu5wuPPWMx^F^LzlXOy6Wf%n3TEjd^C#&UhakN-(){`{Nvu%{d zc~t@eDpeL`I-i}MpFX(%;L}H+-Fxk|&mKRz|Hd2dfAaCkt9Kt>ovoE!C-^@f{|3H# z_s0)^6~1-VQFYGr} z?{t6e6np%Un0Innf&_qrZj zyiRB7YP|}=psFgvf}9I=-HDe_g{bQ-QT=-?<;Tq{KNOB_wK%b_Sh`qr&Rvr z`f>ON5B|&hKcxpJKYQ|V9^!SG*-%wrJFP$%jA-pYW8B-i^yk!@Or(7W{qEoFr;m2@ zY`goc+8s9&kwuH-+A-1UaQdxpzVV;_7Qgw{br@|CfmB;H>U0$cHcAYm0>I9q4|^7P zt!uG&p!N?wvbcds0C=fla5PAI;OKquBFuvhMJKWgJGHV-+j6KWjiWZ3Q7hX{8DPA9 z+kKVYew6@;(Y6aexg2d*YDS;!>9=^y$o(LwD@OQ1Wdc6XYtfaX#}_;r{Oo6r+L=={ ziZ+ot5Ak`dPLGlzjgFG(tg>I59mPsNSJf}CpMH3C`qAn#e)U!zhG`I}hRIrYvzS3! z?hXLd&6IVk01**d=n_$0+=jY;FILo6;Gx?#x(3BwTGA4cBHhZHv31EZCM@d8GAC)$ zlvR?%d6v&-^PXQ#&`_^0Uy!*4o*WdWr`Q!X{`d)eYfn8l52Y>hRFUphj!>eai zsB$)j*tl5jl5~XZ(^)_?%=;gl8rk3b51+{{T68H(UE3m#bI|=xpNHpcY$bDdHv4cenLV1b@3(a$$Br&9-}&_cl4=`5oPOxQ zF=KF5wp~WY?-e=CwVe`TFFDsK>fB(;(V53~bH42$i?Y$ub+a-h5OYBry**XwjLshYa9hPB>SMKDP}IemKal?Olmj_PpZ@V#nyw*03@joe!{E_kcVKiQDdhF$#!hwz z-V5q$(VbTr^es#Xd+khu1c2W)1>{#i^eR}4yTdg5wuEj$vc7A-ofm@}_G>R(Rfk58 zBa5uggt3)(Apk-zfjMY9+WDDwH@Vaw{M+3z;$CfI-*$L^iEu_TuCnUHc-#UENR|PR z4AJwHo=n5%(~$2Rn{ECkPlK!CjobHh6kTEU?)vdBHs?RRc(j=YYii=jlz=P%Gr7`+ z1!U^>wtYJgBkY(kkA2XvmB2tyUHuY}83_o00v#~hw&RJ}Z7drwDh@YAjtY}Fsj4c8 z<08+JG`?Q0CbP+Uy_`%YjcEvpkt@>#QMAc7li6&wSuc(kMODow)4a$z&_+RpP!K%X zT-V2wzkmF}_3h-ppT7V6Sp9r^`iu3m$7Xv$)wL;2fb1nVeHPM7^bC%n2sk{I?g-<2 zS;y1y`Sw6cXjGqXhw)sy6{1E&GyuW92Y0^rm%(?wTRphHOp_86q3UN_+FEjZj&zgK zJoptuQ_8NbZcqd3>ciA;V#cCI*lw+?2trE$c$q06KMCBnJou?4-vrdTvf$9dyc>(5 zgT=RlE9p+&bEo#@$6Q+rFzN--anLQ_?vH4vlY1}|J6s%n0+iBxL~?|!{yCrtrJ*Z=~#ae-Rvn!;reJWQdyGj9m*%#Wv==1oWzq@px<-eezc zF8=BA(cgdeewFBo0FxvLv^GE%lzaW%$A{MWmwbAw7wPulsNLeT?Giv$T>~(+1po#B zQV7iLdCrMvdwF5QY+IKrio&R_>L`wjvW${sQ*6Q{uA3T>EVE^1z*V-1r|EjLn$D)# zHk+iA)n={ZFgHzsc1`wCwR)_Icb1?1I^6zKbMYHoe^g#SClw!7?(3Xaz57o7k`M@)ZuI}qtz{*8P2P;PtJfC)$`tJM5kfAHGh{>}Em zy=-w@MR5tFPyu#s?yZeOH+DIn;rtk`$Zcg+{h{D=ploZRZK_$pm*wzs#HhGAm`?sl^6He~kt2z}J)Dqh&i zzqq`M&x0H~P*W#g(Mcq{aNpROav-8hN%WQB;p7qFpgEAZD=KhjG3EBMmI-r>WfWW} zTpp)otd5fjZnj^W9N&T9D2~(V~qjb&yH$|4(V zXDKY9_2)9@BgoWd#kiAT1!Ta+8YCz2gtk@6B->_++&~{U*3{M-cGe6AwXzIoS!-QZ zmD0Mbt0<1P+YO>pN&_QUYD`0Mke6kWq*+<$I9}yj6YJAreI44zynVMg|1~dv39I*L z{i(`-vpLH`+}NtoXq_Aav^w6<{qu}6?_L+1cbgPOvdp8sGu@OEA8KYCm<}87LAaBO zc5#Rh5S6t6%xOYLCyTfL&*z5LH0vnOM~VhHo{Zc=Z<2>!i?r=TMQMqtxh%DB+xT8p@| z4#%5v$h|TWF{EVkCHo!8iR_lX~38O34MVbtQUT0rH>hGs~N|H%wU*N;Z6y`WxXsj zgLR6Tj0{XnWRNS{Y@0%99fA&&W;VbU5X-t^2Iqv%sEo0U+$dy(yejGt>rib>eQvW0 zsvg_yVR8Kgi$}$B#Z43I=gSM7#*HzcsNH*$--i36<9=yqSA?gZnCML229qK@NV)g6 zxx31q2kTF~qeaLBU~Ov_=hF8CjN$FOi?_d{-h7Q7yuL}|EfP`;3=J}1$qg4^gL@qX!8I)NkrycC@8Df+JEai+f?oFPJM+vUV| z;?G@iyS~oj=(t|}wpIczdh)h5h&?*GB3Lr3cR+)R7`rD`FA3m$ze0VX>s)uLK z^AI1EtB-i|>&@v^l>yPUQ1`r4}BURi~zzvw9u9G;asxpbgx@m~8wuafAXOsnC#JXV) zRmRl{n|!K2xO$eQ>ci#fQrjoh>RGcb$ZnbnLRFSk5QQ~ZAYyl7=^BLx_J%GV^tJac zB#cBmc7$iUVyOk&*=oUPcCO!8`2DoCgXZ7CAN;>M0x|fSmbHq=SXB4!-TAXWkH7KF zRT^!zF55$=-!rs1CF<&B-uce&X|>xcIG#Su&b zz)O?@g8dGC+db1b7O5XDq`lt;_s##k>mpm|{lZ3zGK1}Fnb1p3u&=DT*fgjrj~n>M zpTL(5a6bU>XmXTCm(gjexP~X@PPb(&64RY*yn_2q3}7C*mAOO`q5@!xZF7qy4jQw_ z>icW{+ExDT)8>`S{QToj!$taOwR}>poI$uy8TDp*@|Af0)#&KW$o!B1`TTq%Cy@+VlZCyNDPKmk1j}n##mI))U`!7UZ8-KMO&e*OrwHelW!-} zbem^U5|w2cs-VtG6@(VJCa4hBV2S`w^JSi>U!Hwt7Rj%kJ=8~&vwUSVR%DG~P-uY( zl>s|4ECXb)-adtgEiOEAZ2lr=R%oBDwyuvz&IFX(6k_WE=LNT+`+vKg486xr7xNJS z6eFoyClCJJ56Zi*Y*06f8n3(LH$2cj!d{G&xo`Uc!hziw`v)6FCZ!__(SEDMT{Ih= zH*q+nA^|`Gz)SRm#6EG-b=0_qK>(Kt0WVlHurPtKAIwO`vd`u6D2O0HlLWb`1dJRtaP#CQHhI0h`ozUYR#m=Cx({+WGeOd7hP7sqksFJ+=A6)n%sb8Y+uy z8$)cP29H$udUEu7F#GEK_OVW)(wwLmD-)t3W6?5O2JK@(drOGB5Dq|yjkTy$(=I^AYjGMTRPtPJqN6jyb=)o@yD>@@o1^l_5} z*X2gV;l`9qpn!~Rkd$r9tt3gFHOEh z)1ZMsac$7pptdJLGQ;2)qc;|}7ZlBOIHfSCngEHbCRC~}OGFHHKtP5qGE{XHgkfVE z6$W`;L`hs#l~RhCEf63yY#QLADbvYhyID_;7pIpOlf`1SS*Nqv`DSGz^|V-Dn!F0| zbh`{D$=UKMoFrLUkXDARGf?P)eCsdd?zi6uyZP1O?e7vdgWJ_UY@O4~;2H3{30Fe$ z5f`a#2e7?Fe!BrzN?Bw32h9&sfj=zv)5PSeSZt9fPUE|;#t&XKX=)~u0@09an|=NB zMPtLdc1P29&K)}0;3!M!%iMiY%ilo6@u6g-#f5`prmX%F0A5}vC=FJ5zqFz+A#(q^ z4pKl2gGbgLGL!@WFA|5ayEh-GVUFGm9;iX|b}fSd!J`xt?C-I95zY2%acHAE$hQu@ zY%iVPJGt|rQugkr9C-B(tChRI%l{7sMqt%&V)#~RZs+E~$^;kdsn(lpQ-|t0&$AF7 ztuHb(TQaP?gOo97ZD2406r3^EY0))~uq$#V4bUr=3y3*6+>E+qt`1tANIYi;I%nGsvo5D7vsjh1Z zbYl!DY9Eb$9*@1g9d>IU-=MnyqtLsbRvX@I_Df`!yBp6Qj=x)xas#(rnHLF-F+^_c zu63qsBZ9j)MX0r!&cfTb)yYX61~noBfg8ZyDM)uqvt@T~9-F=OuS+klK3>X4)vdmM z&|XUy`gk}$(A|sn*GmA90PqqUf%b;H4n1Hm`nwmcl84vJJuB`Tf7C&}7X1A3HsFgg z37`Lsd%w4@N#M=DN-u5Jj*B3$$Gs>(xfa)rFB_V?(kQe zMu$OO7IBhXuUA15Uu;%E8m+fmih{DKk(5Qt0~h<&lAd>JEIe4WaHsS#THJB(X7kNY zN3ZYEHq$%^h#_m7y zeP6;)%aZjo?DY?Q6koIFL&8QL-Q#V`d6%aOPv?CWD$p`p>9NWl;M$kqsX22tUa9LA zicoVnJ#D9`x{{K?v?x;*1tlgIrR<)dQ@@0PTmP!}@CX_+No`mXlFY05bXwrEySH|) z-_rN${$it^`$zazJ=W*hX>+djj>X1D)rq?crz9%>U$Fc7^SK7WHq>+hfzK=Iy^?tUNDXpHX-F1MWBFKj&|K`Q`f$-96va z{~6ss8vh{dN1^$XTAJ)&*;mf{I`XSiEkF(c%>sKeAPNwxq7 + + diff --git a/projects/mila/public/mila.html b/projects/mila/public/mila.html new file mode 100644 index 0000000..f318937 --- /dev/null +++ b/projects/mila/public/mila.html @@ -0,0 +1,1185 @@ + + + + + + + + Mila — Schlaf & Entwicklung + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ Mila +
+
+
+

+ Mila Graf +

+ + 6 Monate, 4 Wochen alt + +
+

Dienstag, 13.10.2026

+
+
+ + +
+
Wach (11 h 11 min)
+ + +
+
+
+ +
+ + +
+ + +
+
+
+ ☀️ Status: Wach & Munter +
+
+ Wachfenster: 11 h 11 min +
+

+ Letztes Schläfchen beendet um 18:15 Uhr. +

+
+
+ + +
+
+
24h Schlaf Heute
+
0 h
+
Nacht + Schläfchen
+
+
+
Tagesschläfchen
+
0 Naps
+
0 min gesamt
+
+
+
Nachtschlaf
+
0 min
+
Hauptschlafphase
+
+
+
7-Tage-Schnitt
+
12.12 h
+
Alterskorridor: 12–15h
+
+
+ + +
+
+
+ 📋 +

Heutiger Tagesablauf im Detail

+
+ 2026-10-13 +
+ + +
+
+ 🌿 + Tagesschläfchen (0 erfasst) +
+
+ +
+ Heute bisher noch kein Tagesschläfchen eingetragen. +
+ +
+
+ + +
+
+ 🌙 + Nachtschlaf +
+
+ +
+ Kein Nachtschlaf für das Tagesdatum zugeordnet (Nachtstart zählt zum Vortag). +
+ +
+
+
+ + + +
+
+
+ 🍼 +

Fläschchen heute

+
+ 210 ml (1x) +
+
+ 04:15 Uhr (210 ml) +
+
+ + + +
+ + +
+
+ 📈 +

Entwicklungs-Benchmarks & Tendenzen

+
+
+
+
7-Tage-Ø Gesamtschlaf
+
12.12 h
+
Nacht: 9.93 h · Tag: 3.1 Naps (2.19 h)
+
+
+
30-Tage-Ø Gesamtschlaf
+
13.77 h
+
Stabile zirkadiane Konsolidierung
+
+
+
Altersreferenz (7 Monate)
+
12 – 15 Std
+
Typisch 2–3 Naps, Wachfenster ~2.25–3.25h
+
+
+
+ + +
+
+
+ 📅 +

Historie (Letzte 30 Tage)

+
+ DuckDB Aggregatdaten +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Datum24h GesamtNachtSchläfchenFläschchenWindeln
+ Mo, 12.10. + + 2.67 h0 min4 (160 min)540 ml (4x)1 (0 Stuhl)
+ Einzelschläfchen: 08:05–08:39 (34m) 11:32–12:02 (30m) 14:11–15:22 (71m) 17:50–18:15 (25m) +
+ So, 11.10. + + 12.22 h10 h 45 min3 (88 min)170 ml (1x)1 (1 Stuhl)
+ Einzelschläfchen: 09:10–09:35 (25m) 11:05–11:40 (35m) 13:12–13:40 (28m) 19:25–06:10 (645m) +
+ Sa, 10.10. + + 14.35 h11 h 40 min2 (161 min)——
+ Einzelschläfchen: 12:22–14:25 (123m) 16:10–16:48 (38m) 19:20–07:00 (700m) +
+ Fr, 09.10. + + 12.42 h11 h 20 min3 (65 min)——
+ Einzelschläfchen: 12:35–12:55 (20m) 15:20–15:35 (15m) 17:10–17:40 (30m) 20:00–07:20 (680m) +
+ Do, 08.10. + + 14.67 h11 h 45 min3 (175 min)——
+ Einzelschläfchen: 09:49–10:24 (35m) 11:55–12:22 (27m) 15:05–16:58 (113m) 19:15–07:00 (705m) +
+ Mi, 07.10. + + 14.13 h12 h 20 min3 (108 min)——
+ Einzelschläfchen: 08:50–09:20 (30m) 11:21–12:01 (40m) 14:20–14:58 (38m) 18:40–07:00 (740m) +
+ Di, 06.10. + + 14.38 h11 h 40 min4 (163 min)——
+ Einzelschläfchen: 08:58–09:38 (40m) 10:45–10:55 (10m) 12:08–12:41 (33m) 14:29–15:49 (80m) 19:20–07:00 (700m) +
+ Mo, 05.10. + + 4.18 h55 min4 (196 min)0 ml (2x)—
+ Einzelschläfchen: 06:20–07:15 (55m) 08:12–09:00 (48m) 10:54–12:27 (93m) 14:36–15:06 (30m) 16:29–16:54 (25m) +
+ So, 04.10. + + 1.88 h0 min4 (113 min)——
+ Einzelschläfchen: 08:10–08:50 (40m) 10:50–10:51 (1m) 13:40–14:05 (25m) 15:20–16:07 (47m) +
+ Sa, 03.10. + + 12.78 h10 h 05 min5 (162 min)——
+ Einzelschläfchen: 09:14–09:39 (25m) 10:59–12:00 (61m) 13:30–13:58 (28m) 14:52–15:20 (28m) 17:10–17:30 (20m) 20:10–06:15 (605m) +
+ Fr, 02.10. + + 13.02 h9 h 30 min4 (211 min)——
+ Einzelschläfchen: 09:00–09:30 (30m) 11:25–11:49 (24m) 13:13–13:30 (17m) 14:55–17:15 (140m) 20:30–06:00 (570m) +
+ Do, 01.10. + + 11.20 h9 h 30 min3 (102 min)——
+ Einzelschläfchen: 09:30–10:06 (36m) 11:30–12:00 (30m) 14:00–14:36 (36m) 21:00–06:30 (570m) +
+ Mi, 30.09. + + 13.13 h11 h 17 min3 (111 min)——
+ Einzelschläfchen: 09:45–10:47 (62m) 13:18–13:38 (20m) 16:07–16:36 (29m) 19:13–06:30 (677m) +
+ Di, 29.09. + + 13.83 h11 h 53 min4 (117 min)0 ml (1x)—
+ Einzelschläfchen: 09:51–10:38 (47m) 11:36–11:51 (15m) 13:35–14:05 (30m) 16:00–16:25 (25m) 18:57–06:50 (713m) +
+ Mo, 28.09. + + 26.10 h23 h 34 min4 (152 min)——
+ Einzelschläfchen: 08:27–09:17 (50m) 10:52–11:40 (48m) 13:36–14:06 (30m) 16:05–16:29 (24m) 19:13–07:00 (707m) 19:13–07:00 (707m) +
+ So, 27.09. + + 12.88 h10 h 10 min4 (163 min)——
+ Einzelschläfchen: 09:10–09:30 (20m) 10:50–11:25 (35m) 13:39–15:07 (88m) 17:50–18:10 (20m) 19:55–06:05 (610m) +
+ Sa, 26.09. + + 26.67 h23 h 50 min3 (170 min)0 ml (1x)—
+ Einzelschläfchen: 08:54–09:40 (46m) 12:38–14:07 (89m) 15:50–16:25 (35m) 18:55–06:50 (715m) 18:55–06:50 (715m) +
+ Fr, 25.09. + + 15.13 h11 h 33 min5 (215 min)——
+ Einzelschläfchen: 07:39–08:08 (29m) 10:07–10:31 (24m) 10:40–12:39 (119m) 14:40–15:01 (21m) 16:43–17:05 (22m) 19:07–06:40 (693m) +
+ Do, 24.09. + + 24.52 h23 h 02 min4 (89 min)——
+ Einzelschläfchen: 09:02–09:34 (32m) 12:31–12:55 (24m) 13:00–13:01 (1m) 14:47–15:19 (32m) 18:34–06:05 (691m) 18:34–06:05 (691m) +
+ Mi, 23.09. + + 13.68 h11 h 18 min4 (143 min)——
+ Einzelschläfchen: 08:30–08:59 (29m) 11:40–11:55 (15m) 13:40–14:50 (70m) 16:36–17:05 (29m) 19:27–06:45 (678m) +
+ Di, 22.09. + + 25.07 h23 h 12 min5 (112 min)0 ml (1x)—
+ Einzelschläfchen: 08:53–09:23 (30m) 09:53–09:59 (6m) 12:15–12:40 (25m) 14:35–15:05 (30m) 17:06–17:27 (21m) 18:51–06:27 (696m) 18:51–06:27 (696m) +
+ Mo, 21.09. + + 3.48 h0 min5 (209 min)——
+ Einzelschläfchen: 08:00–08:10 (10m) 09:47–10:19 (32m) 10:34–12:25 (111m) 14:25–14:49 (24m) 15:43–16:15 (32m) +
+ So, 20.09. + + 14.02 h10 h 55 min5 (186 min)——
+ Einzelschläfchen: 06:40–06:41 (1m) 08:50–09:30 (40m) 11:00–11:35 (35m) 14:00–15:25 (85m) 16:40–17:05 (25m) 19:30–06:25 (655m) +
+ Sa, 19.09. + + 14.02 h11 h 55 min4 (126 min)——
+ Einzelschläfchen: 06:30–06:31 (1m) 09:10–09:40 (30m) 10:55–12:00 (65m) 14:45–15:15 (30m) 18:45–06:40 (715m) +
+
+
+ + + +
+ + + + +
+ +
+ + Noch keine Messungen erfasst + +
+ + +
+ +
+ + +
+ + +
+ + Mila + + + WHO Median (P50) + + + P3–P97 Normkorridor (94%) + +
+
+ + +
+ +
+ + +
+
+

+ 📋 + Erfasste Messungen +

+ 0 Messung(en) +
+ +
+ + + + + + + + + + + + + + + + + +
DatumAlterGewichtKörpergrößeNotiz / Anlass
+ Bisher noch keine manuellen Messwerte eingetragen. Messungen können per Telegram oder CLI erfasst werden. +
+
+
+ +
+
+ + +
+ + +
+

Aktualisiert: 13.10.2026 um 05:26:47 Uhr ·

+

Tipp: Im Safari-Menü auf „Zum Home-Bildschirm" tippen für die native App-Nutzung.

+
+ + + + diff --git a/projects/mila/public/mila.webmanifest b/projects/mila/public/mila.webmanifest new file mode 100644 index 0000000..950832d --- /dev/null +++ b/projects/mila/public/mila.webmanifest @@ -0,0 +1,48 @@ +{ + "id": "/tracking/mila/", + "name": "Mila — Schlaf & Entwicklung", + "short_name": "Mila", + "description": "Schlaf-, Trink- und Windeltagebuch für Mila Graf", + "start_url": "/tracking/mila/", + "scope": "/tracking/mila/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#090A0F", + "theme_color": "#090A0F", + "icons": [ + { + "src": "/tracking/mila/mila-icon-192-v3.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/mila/mila-icon-192-v3.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/mila/mila-icon-512-v3.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/mila/mila-icon-512-v3.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/mila/mila-apple-touch-icon-v3.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/tracking/mila/mila-icon.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ] +} diff --git a/projects/mila/public/sw.js b/projects/mila/public/sw.js new file mode 100644 index 0000000..5c7ea30 --- /dev/null +++ b/projects/mila/public/sw.js @@ -0,0 +1,51 @@ +// Minimal service worker for Mila PWA with instant cache-bypassing navigation +const CACHE_NAME = 'mila-pwa-v5'; + +self.addEventListener('install', (event) => { + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keys) => + Promise.all( + keys.map((key) => { + if (key !== CACHE_NAME) return caches.delete(key); + }) + ) + ).then(() => self.clients.claim()) + ); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') return; + + // For HTML documents/navigations: ALWAYS bypass HTTP cache to get latest live server rendering + if (event.request.destination === 'document' || event.request.mode === 'navigate') { + event.respondWith( + fetch(event.request, { cache: 'no-cache' }) + .then((response) => { + if (response && response.status === 200) { + const clone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)); + } + return response; + }) + .catch(() => caches.match(event.request)) + ); + return; + } + + // Assets (images, fonts, scripts): network-first with offline cache fallback + event.respondWith( + fetch(event.request) + .then((response) => { + if (response && response.status === 200) { + const clone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)); + } + return response; + }) + .catch(() => caches.match(event.request)) + ); +}); diff --git a/projects/mila/src/App.vue b/projects/mila/src/App.vue new file mode 100644 index 0000000..1e2c45c --- /dev/null +++ b/projects/mila/src/App.vue @@ -0,0 +1,1000 @@ + + + diff --git a/projects/mila/src/api.ts b/projects/mila/src/api.ts new file mode 100644 index 0000000..4540b14 --- /dev/null +++ b/projects/mila/src/api.ts @@ -0,0 +1,84 @@ +import type { MilaDashboardData, DayDetailData } from './types' + +const API_BASE = '/duckdb-api/v1' + +export function getLocalDateString(): string { + const d = new Date() + const year = d.getFullYear() + const month = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} + +export async function fetchMilaDashboard(asOf?: string): Promise { + const url = asOf ? `${API_BASE}/mila/dashboard?as_of=${encodeURIComponent(asOf)}` : `${API_BASE}/mila/dashboard` + const res = await fetch(url) + if (!res.ok) { + throw new Error(`Failed to fetch dashboard: ${res.status} ${res.statusText}`) + } + return res.json() +} + +export async function fetchMilaDayDetail(date: string): Promise { + const res = await fetch(`${API_BASE}/mila/day/${encodeURIComponent(date)}`) + if (!res.ok) { + throw new Error(`Failed to fetch day detail for ${date}: ${res.statusText}`) + } + return res.json() +} + +export async function logEvent(payload: { + kind: string + subject: string + payload: Record + start?: string + end?: string + date?: string + since?: string + note?: string + actor?: string +}): Promise { + const res = await fetch(`${API_BASE}/events`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + }) + if (!res.ok) { + const err = await res.json().catch(() => ({ detail: res.statusText })) + throw new Error(err.detail || 'Failed to log event') + } + return res.json() +} + +export async function stopSleepEvent(payload: { + subject: string + end_time?: string + since?: string + event_id?: string +}): Promise { + const res = await fetch(`${API_BASE}/events/stop`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + kind: 'sleep.session', + ...payload, + }), + }) + if (!res.ok) { + const err = await res.json().catch(() => ({ detail: res.statusText })) + throw new Error(err.detail || 'Failed to stop sleep event') + } + return res.json() +} + +export async function deleteEvent(eventId: string): Promise { + const res = await fetch(`${API_BASE}/events/${encodeURIComponent(eventId)}`, { + method: 'DELETE', + }) + if (!res.ok) { + const err = await res.json().catch(() => ({ detail: res.statusText })) + throw new Error(err.detail || 'Failed to delete event') + } + return res.json() +} + diff --git a/projects/mila/src/components/FeedingAnalyticsTool.vue b/projects/mila/src/components/FeedingAnalyticsTool.vue new file mode 100644 index 0000000..fefa532 --- /dev/null +++ b/projects/mila/src/components/FeedingAnalyticsTool.vue @@ -0,0 +1,183 @@ + + + diff --git a/projects/mila/src/components/SleepChart.vue b/projects/mila/src/components/SleepChart.vue new file mode 100644 index 0000000..3aedad6 --- /dev/null +++ b/projects/mila/src/components/SleepChart.vue @@ -0,0 +1,589 @@ + + + diff --git a/projects/mila/src/components/TrackingModal.vue b/projects/mila/src/components/TrackingModal.vue new file mode 100644 index 0000000..9e8fbf1 --- /dev/null +++ b/projects/mila/src/components/TrackingModal.vue @@ -0,0 +1,579 @@ + + + diff --git a/projects/mila/src/components/WhoGrowthTool.vue b/projects/mila/src/components/WhoGrowthTool.vue new file mode 100644 index 0000000..6482059 --- /dev/null +++ b/projects/mila/src/components/WhoGrowthTool.vue @@ -0,0 +1,378 @@ + + + diff --git a/projects/mila/src/main.ts b/projects/mila/src/main.ts new file mode 100644 index 0000000..8ec0ac9 --- /dev/null +++ b/projects/mila/src/main.ts @@ -0,0 +1,30 @@ +/// +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +// Client-side canonical path enforcement +if (typeof window !== 'undefined' && (window.location.pathname === '' || window.location.pathname === '/')) { + window.location.replace('/tracking/mila/') +} + +createApp(App).mount('#app') + +// Reliable Service Worker registration (catches readyState complete and load) +if ('serviceWorker' in navigator) { + const registerSW = () => { + navigator.serviceWorker + .register('/tracking/mila/sw.js', { scope: '/tracking/mila/' }) + .then((reg) => { + // Check for updates + reg.update().catch(() => {}) + }) + .catch((err) => console.warn('Mila Service Worker registration failed:', err)) + } + + if (document.readyState === 'complete') { + registerSW() + } else { + window.addEventListener('load', registerSW) + } +} diff --git a/projects/mila/src/style.css b/projects/mila/src/style.css new file mode 100644 index 0000000..b55b8e1 --- /dev/null +++ b/projects/mila/src/style.css @@ -0,0 +1,16 @@ +@import "tailwindcss"; + +@layer base { + body { + font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + -webkit-tap-highlight-color: transparent; + } + + .font-heading { + font-family: 'Syne', sans-serif; + } + + .font-mono { + font-family: 'JetBrains Mono', monospace; + } +} diff --git a/projects/mila/src/types.ts b/projects/mila/src/types.ts new file mode 100644 index 0000000..11ce58b --- /dev/null +++ b/projects/mila/src/types.ts @@ -0,0 +1,159 @@ +export interface NapSession { + id: string + start: string + end: string + sleep_type: string + location: string + note: string + duration_minutes: number | null + is_open: boolean +} + +export interface FeedingItem { + id?: string + time: string + consumed_ml: number | null + milk_type: string + item: string + solid_g: number | null + kcal: number | null + kind: string + note: string +} + +export interface DiaperItem { + id?: string + time: string + pee: boolean + poo: boolean + texture: string + note: string +} + +export interface HistoryRow { + date: string + weekday: string + formatted_date: string + is_today: boolean + total_hours: number + night_duration_str: string + nap_str: string + feed_bottles_ml: number + feed_bottles_count: number + feed_solid_g: number + feed_solid_count: number + diaper_changes: number + diaper_dirty: number + sessions: { + id?: string + start: string + end: string + type: string + duration_minutes: number | null + is_open: boolean + note: string + location?: string + }[] +} + +export interface GrowthMeasurement { + id: string + date_str: string + date_pretty: string + age_str: string + age_months: number + weight_kg: number | null + weight_pct: string + height_cm: number | null + height_pct: string + head_circ_cm: number | null + note: string +} + +export interface DayDetailData { + date: string + weekday: string + sleep_sessions: NapSession[] + feedings: FeedingItem[] + diapers: DiaperItem[] + growth?: GrowthMeasurement[] +} + +export interface AgeNorms { + category: string + sweet_spot_wake_window_min: [number, number] + total_sleep_norm_hours: [number, number] + night_sleep_norm_hours: [number, number] + nap_count_norm: [number, number] + feed_interval_hours: [number, number] + guidelines_reference: string +} + +export interface MilaDashboardData { + status: string + execution_time_ms: number + git_status: string + git_conflict: boolean + metadata: { + subject: string + today_date: string + today_pretty: string + age_str: string + } + live_status: { + is_sleeping: boolean + active_sleep_id: string | null + active_sleep_duration_str: string + active_sleep_start_time: string + active_sleep_iso: string + wake_window_minutes: number | null + wake_window_str: string + last_wake_time_str: string + last_wake_iso: string + last_feed_time: string | null + last_feed_elapsed_minutes: number | null + last_feed_item: string | null + last_feed_amount: number | null + last_diaper_time: string | null + last_diaper_elapsed_minutes: number | null + last_stool_time: string | null + last_stool_elapsed_minutes: number | null + } + age_norms?: AgeNorms + today: { + total_sleep_hours_str: string + nap_count: number + nap_minutes: number + night_duration_str: string + naps: NapSession[] + nights: NapSession[] + feedings: FeedingItem[] + feeding_summary: { + bottle_count: number + total_consumed_ml: number + solid_count: number + total_solid_g: number + total_kcal: number + } + diapers: DiaperItem[] + diaper_summary: { + total_changes: number + wet_count: number + dirty_count: number + } + } + averages: { + avg_7_tot: string + avg_7_night: string + avg_7_naps: string + avg_30_tot: string + avg_7_feeding_ml?: number + avg_7_solid_g?: number + avg_7_diapers?: number + } + history: HistoryRow[] + growth: { + measurements: GrowthMeasurement[] + latest: GrowthMeasurement | null + } +} diff --git a/projects/mila/tsconfig.json b/projects/mila/tsconfig.json new file mode 100644 index 0000000..395c931 --- /dev/null +++ b/projects/mila/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/projects/mila/vite.config.ts b/projects/mila/vite.config.ts new file mode 100644 index 0000000..a25c7f7 --- /dev/null +++ b/projects/mila/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + base: '/tracking/mila/', + plugins: [ + vue(), + tailwindcss(), + ], + server: { + port: 5173, + proxy: { + '/duckdb-api': { + target: 'http://localhost:8000', + changeOrigin: true, + }, + }, + }, +}) diff --git a/projects/moritz/AGENTS.md b/projects/moritz/AGENTS.md new file mode 100644 index 0000000..2cf01d5 --- /dev/null +++ b/projects/moritz/AGENTS.md @@ -0,0 +1,9 @@ +# AGENTS.md — Moritz Tracking App + +## Development +```bash +cd projects/moritz +npm install +npm run dev +npm run build +``` diff --git a/projects/moritz/Dockerfile b/projects/moritz/Dockerfile new file mode 100644 index 0000000..5920d82 --- /dev/null +++ b/projects/moritz/Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine AS build +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist/ /usr/share/nginx/html/ +RUN mkdir -p /usr/share/nginx/html/tracking && ln -s /usr/share/nginx/html /usr/share/nginx/html/tracking/moritz +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/projects/moritz/README.md b/projects/moritz/README.md new file mode 100644 index 0000000..9a20d29 --- /dev/null +++ b/projects/moritz/README.md @@ -0,0 +1,13 @@ +# Moritz Tracking App + +Apple Health-styled personal energy balance and Garmin physiological metrics dashboard. +Built with Vue 3 (Composition API), Vite, TypeScript, and Tailwind CSS. + +## Features +- **Hero Netto-Bilanz**: 24h caloric surplus/deficit calculated by DuckDB (Intake vs. Garmin Burn). +- **Today's Intake**: Calories, macros (protein, carbs, fat), and real-time meal counter. +- **Garmin Recovery & Sleep**: Sleep score, HRV, resting heart rate, body battery, sleep stages. +- **7-Day Trend**: Daily comparative bars and rolling averages. +- **30-Day History**: Monthly summary and day-by-day table. +- **Tracking Modal**: 1-tap quick favorite meals + custom detailed logging. +- **Backend**: Direct sub-30ms analytical queries to FastAPI DuckDB backend at `/duckdb-api/v1`. diff --git a/projects/moritz/index.html b/projects/moritz/index.html new file mode 100644 index 0000000..b094f9c --- /dev/null +++ b/projects/moritz/index.html @@ -0,0 +1,37 @@ + + + + + + Moritz Health — Energiebilanz & Sport + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/projects/moritz/nginx.conf b/projects/moritz/nginx.conf new file mode 100644 index 0000000..84dac41 --- /dev/null +++ b/projects/moritz/nginx.conf @@ -0,0 +1,53 @@ +server { + listen 80; + server_name _; + absolute_redirect off; + port_in_redirect off; + + root /usr/share/nginx/html; + index index.html; + + include /etc/nginx/mime.types; + types { + application/manifest+json webmanifest; + } + + location = /tracking/moritz { + return 301 /tracking/moritz/; + } + + location /tracking/moritz/ { + try_files $uri $uri/ /tracking/moritz/index.html /index.html; + } + + location / { + try_files $uri $uri/ /index.html; + } + + # Service worker + location ~* /sw\.js$ { + default_type application/javascript; + expires -1; + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Service-Worker-Allowed "/tracking/moritz/"; + } + + # Webmanifest and manifest.json + location ~* /(?:moritz\.webmanifest|manifest\.webmanifest|manifest\.json)$ { + default_type application/manifest+json; + expires -1; + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + } + + # Static assets cache + location ~* \.(?:css|js|jpg|jpeg|gif|png|ico|svg|woff|woff2|ttf)$ { + expires 1y; + add_header Cache-Control "public"; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} + diff --git a/projects/moritz/package-lock.json b/projects/moritz/package-lock.json new file mode 100644 index 0000000..59e7cb7 --- /dev/null +++ b/projects/moritz/package-lock.json @@ -0,0 +1,2251 @@ +{ + "name": "moritz-tracking", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "moritz-tracking", + "version": "1.0.0", + "dependencies": { + "lucide-vue-next": "^0.468.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.9", + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.0.9", + "typescript": "^5.7.2", + "vite": "^6.2.0", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.6.tgz", + "integrity": "sha512-FkO19Fowv/OQeJZPVfdetJaI3/VpbZmBsnmAlR/rQ+b3QwfiGQiOpVegpSRH331kelvHTVw9hXYG3DwjAaRzyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.6.tgz", + "integrity": "sha512-si5/Etm6MphPc2xYHnk455Shls/hoMjTy3mhXge4OPmvCw7TwC4KP4fKokAlKLV4XaQvLvgSHfafPcblLMYYdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.6.tgz", + "integrity": "sha512-PQCl3q7b0BgvVt72i2xrWM6I5KliwwVe4GpWW5QDGyUQawDS9aPZss/aGyFqBmxdRxlE8wDc9CaxiQ5DHRSp/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.6.tgz", + "integrity": "sha512-l9DFl1Itb1YYdSrP1K3U8ih44AOHa/p+Q4WMMDfGvH5qVWp+ajfgS1DlYo4yCRh8wJ2ZJv0Fqccf+ULAmMFjmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.6.tgz", + "integrity": "sha512-bR4GR3205N9+od0+l5Dd9/iZTDpJkIe6d6Ydp2qbcQZJLmKBdYQQRp8gbWpbMt92twKJY66o1vK4NkoKQODIrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.6.tgz", + "integrity": "sha512-XTVNaDzcFl2TeBglvxdGgsCv9JGtAGRAoJENmGBR/XvDH2mA2K0IXc2aMfP0dR8mexSXSKifJ85FixoXX1wfTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.6.tgz", + "integrity": "sha512-qWc6qbc+25ugG9vqPR9P422KJBbVfZ05mjcMggoq8tsfWP+eRfC+/tiDdIlRF5VL2pDVZWN9zAhWsmu7R1+7Dw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.6.tgz", + "integrity": "sha512-V4Nwkp8844X/Xnww3PI1LYS0YPei8XQEVG70R+5MPZGO7AhYoun4hCN7Svs4U3wbQLZbwiz+9xRFhUZZdRl8Ww==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.6.tgz", + "integrity": "sha512-xb72A1aPaaIsp+a88VtRae/ovIEXislbUMyp7b9AQQU7ZkP2m/+ik6DW9TQcJyw5R8/RIailF9zExYwkjR++UA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.6.tgz", + "integrity": "sha512-pbcs1BVBwC43hZkjhjlF8Rx8m5G0KnhLZs9Azy/gqccP6UsNSzJr0hKGIAVPqzAH1O/NdPxxC9GVGb4msQg/aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.6.tgz", + "integrity": "sha512-EKOC8os6Vsg487ZLKUqzLF99Jsmnq6tu7O7mAELakNpcA+8KadktFf/JYdRuHe/DzCUXmN38pUKu4XBcKlqGbQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.6.tgz", + "integrity": "sha512-v/SQ68GnSlr/HyjB79sNXesGDwkOPu9JjbHfmWaymCiM+nZsQ9TstG1KfA4MuEvTr2d3PoY8PhFxj9bt0e32JA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.6.tgz", + "integrity": "sha512-G3pmliMQ7r15zFFNwBlaT/xTdSLi4lfgI7CUrQueyKYheNVhrd8JrWCE6Ll8xf4AA1RZFqq+mNJYntiElsVOyA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.6.tgz", + "integrity": "sha512-XQTB/IPoB/wG6x/wu9uomAt8YH61IAr5iZTubMiad/lu88sotq2ocz9hJd556+Jz2kIkF7ZQZIsUuWE3OWqtcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.6.tgz", + "integrity": "sha512-O5mpokth6+ydMuwiGtY8fIjvOBfH7u6SzmDNmZ3k6GK5C6iEAC2q2ZN/T5L9jYILx0IcCT0KnfMDihQ5yQFSBw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.6.tgz", + "integrity": "sha512-aIFxbAD9v3TvIaEDsKmukjcDg1JS4/tFXw8SHyQQgzOwzWCQ4cyDK7Ju1pQKqUXDFkEu/BZCFDCDATsKhQcB/Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.6.tgz", + "integrity": "sha512-fuNo1UwBc6BxnHDOxxguQL/InhheMN3RJcJMb0b4xP8r5Q3CNCrJbVg0eCIFuJ4e/zAfjR2gYbOfbzO/G7CIyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.6.tgz", + "integrity": "sha512-05v6wFKDKJPZs9xlytVrrRu6IbRuoSvlH9xNwEOafXsKyjBFZPvAcZz2VIAB/M+lblYeKa9iOYC4RDVdfcAAaw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.6.tgz", + "integrity": "sha512-wJXKcdMjvkc/FaavZXNP1yW4i0pfOmhZAIWRSLG2yJ0PB0TWi7dkLErhX0u0vptDcXKKO/m1Y/YTeuyvb2MXwg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.6.tgz", + "integrity": "sha512-cwg7/h0ThvJwy8CBkmACdiHAxRWpbsCmIsjOt+Zzx0hTnIcSUmKYEV03bGg+hD827OnwUsbKh1ZZDW754xWyBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.6.tgz", + "integrity": "sha512-T0RkYIJbdYXJEQFw+tMBO09KDFdgmNxkHsof3wWAABrvnx15Yh8RytmrgYy9+q9cBeBNZF66MMQZC+5nzEz6vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.6.tgz", + "integrity": "sha512-KlfpmF1AAIdAWxt8QQNClbpLFlAUfYOzqIuJ7IXEStMHpFRuH78RG6FjqPb3Rqhh0K89F5npvG+/i3Fjl6IveQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.6.tgz", + "integrity": "sha512-MrTLjd7Jlt9/ZavJZYG61KQv9Iy9bzbY+yXy73Xvwoa2uP66wvDShkyBr5Chz/yrE6lbD/zHMuTmKQVNQqBApg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.6.tgz", + "integrity": "sha512-8fWDH1CkPI8GdBKAxzHDza7UmgficsKo2+MVbvUgOGhB0629w5sHMg3Qu5y7TZsrYKHHWpz8fla4KvoT7WsO3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.6.tgz", + "integrity": "sha512-9/c9PWdr5GCIHkkxiHM1HjNBQMVdftP4O8QTcoUAaRza2FSqJ4axbf8QAnBuE6BIGQDl71SaRPeDdDYid5ecTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.44.tgz", + "integrity": "sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.9", + "@vue/shared": "3.5.44", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.44.tgz", + "integrity": "sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.44.tgz", + "integrity": "sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.9", + "@vue/compiler-core": "3.5.44", + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-ssr": "3.5.44", + "@vue/shared": "3.5.44", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.29", + "source-map-js": "^1.2.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.44.tgz", + "integrity": "sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.44.tgz", + "integrity": "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.44.tgz", + "integrity": "sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.44.tgz", + "integrity": "sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.44", + "@vue/runtime-core": "3.5.44", + "@vue/shared": "3.5.44", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.44.tgz", + "integrity": "sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/shared": "3.5.44" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.44.tgz", + "integrity": "sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-vue-next": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.468.0.tgz", + "integrity": "sha512-quV/6T8YB1XK0VOEnebg3Byd8Rsan5/m95cvjnuHV4vcS3qEnLAybkrSh0hk3ppavx+V7R1PjNW+mGDvcBdz4A==", + "deprecated": "Package deprecated. Please use @lucide/vue instead.", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz", + "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.64.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.6.tgz", + "integrity": "sha512-fX1Vy+UNKdXn+xKDnu/HBXbHVr1AY8cSdQj9BU4kLv5aFCMqGpvrVbyUMmjN3DdzWhSAuTbcX8PCNEVaumthYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.64.6", + "@rollup/rollup-android-arm64": "4.64.6", + "@rollup/rollup-darwin-arm64": "4.64.6", + "@rollup/rollup-darwin-x64": "4.64.6", + "@rollup/rollup-freebsd-arm64": "4.64.6", + "@rollup/rollup-freebsd-x64": "4.64.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.64.6", + "@rollup/rollup-linux-arm-musleabihf": "4.64.6", + "@rollup/rollup-linux-arm64-gnu": "4.64.6", + "@rollup/rollup-linux-arm64-musl": "4.64.6", + "@rollup/rollup-linux-loong64-gnu": "4.64.6", + "@rollup/rollup-linux-loong64-musl": "4.64.6", + "@rollup/rollup-linux-ppc64-gnu": "4.64.6", + "@rollup/rollup-linux-ppc64-musl": "4.64.6", + "@rollup/rollup-linux-riscv64-gnu": "4.64.6", + "@rollup/rollup-linux-riscv64-musl": "4.64.6", + "@rollup/rollup-linux-s390x-gnu": "4.64.6", + "@rollup/rollup-linux-x64-gnu": "4.64.6", + "@rollup/rollup-linux-x64-musl": "4.64.6", + "@rollup/rollup-openbsd-x64": "4.64.6", + "@rollup/rollup-openharmony-arm64": "4.64.6", + "@rollup/rollup-win32-arm64-msvc": "4.64.6", + "@rollup/rollup-win32-ia32-msvc": "4.64.6", + "@rollup/rollup-win32-x64-gnu": "4.64.6", + "@rollup/rollup-win32-x64-msvc": "4.64.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz", + "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.44.tgz", + "integrity": "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-sfc": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/server-renderer": "3.5.44", + "@vue/shared": "3.5.44" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/projects/moritz/package.json b/projects/moritz/package.json new file mode 100644 index 0000000..471231d --- /dev/null +++ b/projects/moritz/package.json @@ -0,0 +1,25 @@ +{ + "name": "moritz-tracking", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "typecheck": "vue-tsc --noEmit" + }, + "dependencies": { + "lucide-vue-next": "^0.468.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.9", + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.0.9", + "typescript": "^5.7.2", + "vite": "^6.2.0", + "vue-tsc": "^2.2.0" + } +} diff --git a/projects/moritz/public/favicon.ico b/projects/moritz/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a71bec9e9e6e1c74bde8612cdeabb4bf6b13e70 GIT binary patch literal 6749 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 literal 0 HcmV?d00001 diff --git a/projects/moritz/public/manifest.json b/projects/moritz/public/manifest.json new file mode 100644 index 0000000..9c174ae --- /dev/null +++ b/projects/moritz/public/manifest.json @@ -0,0 +1,48 @@ +{ + "id": "/tracking/moritz/", + "name": "Moritz Health — Energiebilanz & Sport", + "short_name": "Health", + "description": "Persönliches Dashboard für Kalorienbilanz, Ernährung und Garmin-Fitness von Moritz.", + "start_url": "/tracking/moritz/", + "scope": "/tracking/moritz/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#f8fafc", + "theme_color": "#10b981", + "icons": [ + { + "src": "/tracking/moritz/moritz-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/moritz/moritz-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/moritz/moritz-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/moritz/moritz-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/moritz/moritz-apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/tracking/moritz/moritz-icon.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ] +} diff --git a/projects/moritz/public/moritz-apple-touch-icon.png b/projects/moritz/public/moritz-apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3d841dc1e4e0e9e8e522df7bdffcc8b9beb9ac GIT binary patch literal 7904 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 Z=0A?;SZzXI$Q1wp002ovPDHLkV1iIoQTzY^ literal 0 HcmV?d00001 diff --git a/projects/moritz/public/moritz-icon-512.png b/projects/moritz/public/moritz-icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..784eeeb5783493ec41665d2761ee853e0022fe28 GIT binary patch literal 24143 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 + + + + + + + + + \ No newline at end of file diff --git a/projects/moritz/public/moritz.webmanifest b/projects/moritz/public/moritz.webmanifest new file mode 100644 index 0000000..9c174ae --- /dev/null +++ b/projects/moritz/public/moritz.webmanifest @@ -0,0 +1,48 @@ +{ + "id": "/tracking/moritz/", + "name": "Moritz Health — Energiebilanz & Sport", + "short_name": "Health", + "description": "Persönliches Dashboard für Kalorienbilanz, Ernährung und Garmin-Fitness von Moritz.", + "start_url": "/tracking/moritz/", + "scope": "/tracking/moritz/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#f8fafc", + "theme_color": "#10b981", + "icons": [ + { + "src": "/tracking/moritz/moritz-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/moritz/moritz-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/moritz/moritz-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/tracking/moritz/moritz-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/tracking/moritz/moritz-apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/tracking/moritz/moritz-icon.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ] +} diff --git a/projects/moritz/public/sw.js b/projects/moritz/public/sw.js new file mode 100644 index 0000000..0756d86 --- /dev/null +++ b/projects/moritz/public/sw.js @@ -0,0 +1,51 @@ +// Minimal service worker for Moritz Health PWA with instant cache-bypassing navigation +const CACHE_NAME = 'moritz-pwa-v5'; + +self.addEventListener('install', (event) => { + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keys) => + Promise.all( + keys.map((key) => { + if (key !== CACHE_NAME) return caches.delete(key); + }) + ) + ).then(() => self.clients.claim()) + ); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') return; + + // For HTML documents/navigations: ALWAYS bypass HTTP cache to get latest live server rendering + if (event.request.destination === 'document' || event.request.mode === 'navigate') { + event.respondWith( + fetch(event.request, { cache: 'no-cache' }) + .then((response) => { + if (response && response.status === 200) { + const clone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)); + } + return response; + }) + .catch(() => caches.match(event.request)) + ); + return; + } + + // Assets (images, fonts, scripts): network-first with offline cache fallback + event.respondWith( + fetch(event.request) + .then((response) => { + if (response && response.status === 200) { + const clone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)); + } + return response; + }) + .catch(() => caches.match(event.request)) + ); +}); diff --git a/projects/moritz/src/App.vue b/projects/moritz/src/App.vue new file mode 100644 index 0000000..8d8e9e2 --- /dev/null +++ b/projects/moritz/src/App.vue @@ -0,0 +1,763 @@ + + + diff --git a/projects/moritz/src/api.ts b/projects/moritz/src/api.ts new file mode 100644 index 0000000..35c440a --- /dev/null +++ b/projects/moritz/src/api.ts @@ -0,0 +1,96 @@ +import type { MoritzDashboardData, MoritzDayDetail, FoodEntity } from './types' + +const API_BASE = '/duckdb-api/v1' + +export async function fetchMoritzDashboard(asOf?: string): Promise { + const url = asOf ? `${API_BASE}/moritz/dashboard?as_of=${encodeURIComponent(asOf)}` : `${API_BASE}/moritz/dashboard` + const res = await fetch(url) + if (!res.ok) { + throw new Error(`Failed to fetch dashboard: ${res.status} ${res.statusText}`) + } + return res.json() +} + +export async function fetchMoritzDayDetail(date: string): Promise { + const res = await fetch(`${API_BASE}/moritz/day/${encodeURIComponent(date)}`) + if (!res.ok) { + throw new Error(`Failed to fetch day detail for ${date}: ${res.statusText}`) + } + return res.json() +} + +export async function fetchFoods(): Promise { + try { + const res = await fetch(`${API_BASE}/entities/foods`) + if (!res.ok) return [] + const json = await res.json() + return json.items || [] + } catch { + return [] + } +} + +export function getLocalDateString(): string { + const d = new Date() + const year = d.getFullYear() + const month = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} + +export async function logNutritionIntake(payload: { + item: string + qty?: number + unit?: string + kcal?: number + protein_g?: number + carbs_g?: number + fat_g?: number + meal?: string + time?: string + date?: string + note?: string +}): Promise { + const baseDate = payload.date || getLocalDateString() + const startIso = payload.time ? `${baseDate}T${payload.time}:00` : undefined + + const res = await fetch(`${API_BASE}/events`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + kind: 'nutrition.intake', + subject: 'moritz', + payload: { + item: payload.item, + qty: payload.qty, + unit: payload.unit || 'g', + kcal: payload.kcal, + protein_g: payload.protein_g, + carbs_g: payload.carbs_g, + fat_g: payload.fat_g, + }, + meal: payload.meal || 'snack', + date: baseDate, + start: startIso, + note: payload.note, + }), + }) + + if (!res.ok) { + const err = await res.json().catch(() => ({ detail: res.statusText })) + throw new Error(err.detail || 'Failed to log nutrition intake') + } + return res.json() +} + +export async function deleteNutritionEvent(eventId: string): Promise { + const res = await fetch(`${API_BASE}/events/${encodeURIComponent(eventId)}`, { + method: 'DELETE', + }) + if (!res.ok) { + const err = await res.json().catch(() => ({ detail: res.statusText })) + throw new Error(err.detail || 'Failed to delete event') + } + return res.json() +} + diff --git a/projects/moritz/src/components/EnergyBalanceChart.vue b/projects/moritz/src/components/EnergyBalanceChart.vue new file mode 100644 index 0000000..34fe0c1 --- /dev/null +++ b/projects/moritz/src/components/EnergyBalanceChart.vue @@ -0,0 +1,563 @@ + + + diff --git a/projects/moritz/src/components/MealTrackingModal.vue b/projects/moritz/src/components/MealTrackingModal.vue new file mode 100644 index 0000000..8f4d39d --- /dev/null +++ b/projects/moritz/src/components/MealTrackingModal.vue @@ -0,0 +1,429 @@ + + + diff --git a/projects/moritz/src/main.ts b/projects/moritz/src/main.ts new file mode 100644 index 0000000..d7b7e26 --- /dev/null +++ b/projects/moritz/src/main.ts @@ -0,0 +1,25 @@ +/// +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') + +// Reliable Service Worker registration (catches readyState complete and load) +if ('serviceWorker' in navigator) { + const registerSW = () => { + navigator.serviceWorker + .register('/tracking/moritz/sw.js', { scope: '/tracking/moritz/' }) + .then((reg) => { + // Check for updates + reg.update().catch(() => {}) + }) + .catch((err) => console.warn('Moritz Service Worker registration failed:', err)) + } + + if (document.readyState === 'complete') { + registerSW() + } else { + window.addEventListener('load', registerSW) + } +} diff --git a/projects/moritz/src/style.css b/projects/moritz/src/style.css new file mode 100644 index 0000000..bf370bc --- /dev/null +++ b/projects/moritz/src/style.css @@ -0,0 +1,12 @@ +@import "tailwindcss"; + +@layer base { + body { + font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + -webkit-tap-highlight-color: transparent; + } + + .font-mono { + font-family: 'JetBrains Mono', monospace; + } +} diff --git a/projects/moritz/src/types.ts b/projects/moritz/src/types.ts new file mode 100644 index 0000000..57a9843 --- /dev/null +++ b/projects/moritz/src/types.ts @@ -0,0 +1,149 @@ +export interface MealItem { + id?: string + time: string + item: string + qty: number | null + unit: string + protein_g: number + carbs_g: number + fat_g: number + fiber_g: number + kcal: number + estimated?: boolean +} + +export interface FoodEntity { + id: string + title: string + brand?: string + default_portion_g?: number + default_unit?: string + per_100g?: { + kcal?: number + protein?: number + carbs?: number + fat?: number + fiber?: number + } +} + +export interface MoritzDayDetail { + date: string + weekday: string + nutrition: { + total_kcal: number + protein_g: number + carbs_g: number + fat_g: number + meals: MealItem[] + } + garmin?: { + total_kcal?: number + active_kcal?: number + bmr_kcal?: number + steps?: number + resting_hr?: number + } + balance_kcal?: number | null +} + +export interface DayBar { + date: string + weekday: string + intake_kcal: number + expenditure_kcal: number + active_kcal: number + steps: number + balance_kcal: number | null + protein_g: number + carbs_g: number + fat_g: number + resting_hr: number | null +} + +export interface HistoryDay { + date: string + weekday: string + intake_kcal: number + expenditure_kcal: number + active_kcal: number + rmr_kcal: number + steps: number + balance_kcal: number | null + balance_status: string + protein_g: number + carbs_g: number + fat_g: number + resting_hr: number | null +} + +export interface MoritzDashboardData { + status: string + execution_time_ms: number + git_status: string + git_conflict: boolean + metadata: { + subject: string + today_date: string + today_pretty: string + yesterday_date: string + yesterday_pretty: string + sleep_date_label: string + } + today: { + total_kcal: number + protein_g: number + carbs_g: number + fat_g: number + item_count: number + meals: MealItem[] + } + yesterday: { + intake_kcal: number + expenditure_kcal: number + active_kcal: number + rmr_kcal: number + steps: number + balance_kcal: number | null + balance_status: string + protein_g: number + carbs_g: number + fat_g: number + resting_hr: number | null + meals: MealItem[] + } + garmin_recovery: { + sleep_dur_str: string + sleep_score: number | null + sleep_qualifier: string + hrv_val: number | null + hrv_status: string + bb_change: number | null + resting_hr: number | null + deep_minutes: number + light_minutes: number + rem_minutes: number + awake_minutes: number + deep_pct: number + light_pct: number + rem_pct: number + awake_pct: number + } + seven_days: { + days: DayBar[] + avg_intake_kcal: number + avg_expenditure_kcal: number + avg_balance_kcal: number + avg_steps: number + avg_protein_g: number + } + thirty_days: { + days: HistoryDay[] + avg_intake_kcal: number + avg_expenditure_kcal: number + avg_balance_kcal: number + total_balance_kcal: number + avg_steps: number + } +} + diff --git a/projects/moritz/tsconfig.json b/projects/moritz/tsconfig.json new file mode 100644 index 0000000..395c931 --- /dev/null +++ b/projects/moritz/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/projects/moritz/vite.config.ts b/projects/moritz/vite.config.ts new file mode 100644 index 0000000..3882be2 --- /dev/null +++ b/projects/moritz/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + base: '/tracking/moritz/', + plugins: [ + vue(), + tailwindcss(), + ], + server: { + port: 5174, + proxy: { + '/duckdb-api': { + target: 'http://localhost:8000', + changeOrigin: true, + }, + }, + }, +})