Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +2 -0
- Dockerfile +106 -0
- Makefile +5 -0
- README.md +345 -4
- __init__.py +37 -0
- client.py +11 -0
- docs/blog.md +128 -0
- docs/plots/README.md +16 -0
- docs/plots/loss.png +0 -0
- docs/plots/reward.png +3 -0
- docs/plots/reward_components.png +3 -0
- docs/plots/sft_loss.png +0 -0
- frontend/README.md +52 -0
- frontend/dist-ts-build/tsconfig.node.tsbuildinfo +1 -0
- frontend/dist-ts-build/vite.config.d.ts +2 -0
- frontend/dist-ts-build/vite.config.js +15 -0
- frontend/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- frontend/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- frontend/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- frontend/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- frontend/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- frontend/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- frontend/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- frontend/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- frontend/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- frontend/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- frontend/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- frontend/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- frontend/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- frontend/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- frontend/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- frontend/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- frontend/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- frontend/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- frontend/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- frontend/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- frontend/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- frontend/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- frontend/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- frontend/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
docs/plots/reward.png filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
docs/plots/reward_components.png filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# PhysiX-Live demo Space — CPU-only env + UI.
|
| 2 |
+
#
|
| 3 |
+
# What this Space hosts:
|
| 4 |
+
#
|
| 5 |
+
# :7860 uvicorn _space_app:app
|
| 6 |
+
# ├─ /reset, /step (OpenEnv stateless API)
|
| 7 |
+
# ├─ /interactive/* (browser session API)
|
| 8 |
+
# ├─ /web/ (built React SPA)
|
| 9 |
+
# └─ /interactive/.../llm-step (LLM-driven episode)
|
| 10 |
+
#
|
| 11 |
+
# What this Space does NOT host:
|
| 12 |
+
# * Inference. The demo is CPU-only — no torch, no vLLM, no GPU. When
|
| 13 |
+
# the UI calls `/interactive/.../llm-step` the server forwards to
|
| 14 |
+
# whatever OpenAI-compatible base URL the browser handed us
|
| 15 |
+
# (HF Router, OpenAI, Ollama, or our sister L4 Space at
|
| 16 |
+
# `Pratyush-01/physix-infer` for the trained 3B + Qwen baseline).
|
| 17 |
+
#
|
| 18 |
+
# Why a separate inference Space:
|
| 19 |
+
# Keeps this CPU image tiny (sub-second cold-start) so the demo URL
|
| 20 |
+
# never feels like it's stalled. The L4 Space pays GPU rates only
|
| 21 |
+
# while it's actually serving requests — its `sleep_time=300s` shuts
|
| 22 |
+
# it down between sessions. Two Spaces, two failure surfaces; if
|
| 23 |
+
# inference is broken the verifier-only demo (Custom URL → Ollama
|
| 24 |
+
# etc.) still works.
|
| 25 |
+
|
| 26 |
+
############################
|
| 27 |
+
# Stage 1: build the SPA
|
| 28 |
+
############################
|
| 29 |
+
FROM node:20-alpine AS frontend
|
| 30 |
+
WORKDIR /build
|
| 31 |
+
RUN corepack enable
|
| 32 |
+
|
| 33 |
+
COPY frontend/package.json frontend/pnpm-lock.yaml ./
|
| 34 |
+
RUN pnpm install --frozen-lockfile --silent
|
| 35 |
+
|
| 36 |
+
COPY frontend/ ./
|
| 37 |
+
# Same-origin API fetches (relative paths). The Space serves both API and UI.
|
| 38 |
+
ENV VITE_PHYSIX_API_URL=""
|
| 39 |
+
# Cache-bust marker. Bump when an SPA change isn't taking on the Space —
|
| 40 |
+
# HF BuildKit occasionally reuses stage-1 output even when sources changed.
|
| 41 |
+
# physix-spa-rebuild: 6
|
| 42 |
+
RUN pnpm exec tsc -b \
|
| 43 |
+
&& pnpm exec vite build --base=/web/
|
| 44 |
+
|
| 45 |
+
############################
|
| 46 |
+
# Stage 2: runtime (FastAPI + SPA)
|
| 47 |
+
############################
|
| 48 |
+
FROM python:3.11-slim AS runtime
|
| 49 |
+
|
| 50 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 51 |
+
PIP_NO_CACHE_DIR=1 \
|
| 52 |
+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
| 53 |
+
HOME=/tmp/home \
|
| 54 |
+
HF_HOME=/tmp/hf_cache \
|
| 55 |
+
XDG_CACHE_HOME=/tmp/xdg-cache \
|
| 56 |
+
PORT=7860 \
|
| 57 |
+
PHYSIX_HOST=0.0.0.0 \
|
| 58 |
+
PHYSIX_CORS_ORIGINS=*
|
| 59 |
+
|
| 60 |
+
# curl for healthchecks; the slim image has neither curl nor build tools
|
| 61 |
+
# by default. Everything else (numpy, scipy, sympy) is a wheel install.
|
| 62 |
+
RUN apt-get update \
|
| 63 |
+
&& apt-get install -y --no-install-recommends curl \
|
| 64 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 65 |
+
|
| 66 |
+
WORKDIR /app
|
| 67 |
+
|
| 68 |
+
# Pin the server-side runtime stack. NO torch / unsloth / trl here —
|
| 69 |
+
# this Space never trains and never runs a model locally.
|
| 70 |
+
RUN pip install \
|
| 71 |
+
"openenv-core[core]>=0.2.2" \
|
| 72 |
+
"numpy>=1.24" \
|
| 73 |
+
"scipy>=1.10" \
|
| 74 |
+
"sympy>=1.12" \
|
| 75 |
+
"fastapi>=0.110" \
|
| 76 |
+
"uvicorn[standard]>=0.29" \
|
| 77 |
+
"pydantic>=2.5" \
|
| 78 |
+
"openai>=1.40" \
|
| 79 |
+
"requests>=2.31"
|
| 80 |
+
|
| 81 |
+
COPY pyproject.toml ./
|
| 82 |
+
COPY physix ./physix
|
| 83 |
+
COPY README.md ./
|
| 84 |
+
RUN pip install --no-deps -e .
|
| 85 |
+
|
| 86 |
+
# Built SPA from stage 1.
|
| 87 |
+
COPY --from=frontend /build/dist /app/static
|
| 88 |
+
|
| 89 |
+
# Space wrapper — mounts the React SPA at /web/, registers / -> /web/
|
| 90 |
+
# redirect (OpenEnv's create_fastapi_app doesn't add one for us).
|
| 91 |
+
COPY scripts/space_app.py /app/_space_app.py
|
| 92 |
+
|
| 93 |
+
# Pre-create writable dirs. HF Spaces runs containers as a non-root UID
|
| 94 |
+
# with no /etc/passwd entry, so any cache path under $HOME must exist
|
| 95 |
+
# and be world-writable BEFORE the runtime user shows up.
|
| 96 |
+
RUN mkdir -p "$HOME" "$HF_HOME" "$XDG_CACHE_HOME" \
|
| 97 |
+
&& chmod -R 0777 /tmp /app
|
| 98 |
+
|
| 99 |
+
EXPOSE 7860
|
| 100 |
+
|
| 101 |
+
# /health is OpenEnv's stock endpoint and turns 200 once uvicorn binds.
|
| 102 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
|
| 103 |
+
CMD curl -fsS "http://127.0.0.1:${PORT}/health" || exit 1
|
| 104 |
+
|
| 105 |
+
ENV ENABLE_WEB_INTERFACE=true
|
| 106 |
+
CMD ["python3", "-m", "uvicorn", "_space_app:app", "--host", "0.0.0.0", "--port", "7860"]
|
Makefile
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
dev:
|
| 2 |
+
uv run python -m physix.server.app --host 127.0.0.1 --port 8000 &
|
| 3 |
+
cd frontend && pnpm install --frozen-lockfile --silent && pnpm dev
|
| 4 |
+
|
| 5 |
+
.PHONY: dev
|
README.md
CHANGED
|
@@ -1,10 +1,351 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: blue
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
|
|
|
| 7 |
pinned: false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: PhysiX
|
| 3 |
+
emoji: ⚛️
|
| 4 |
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
pinned: false
|
| 9 |
+
license: mit
|
| 10 |
+
short_description: Equation discovery from noisy trajectories (RLVR)
|
| 11 |
+
tags:
|
| 12 |
+
- openenv
|
| 13 |
+
- rlvr
|
| 14 |
+
- physics
|
| 15 |
+
- equation-discovery
|
| 16 |
+
- ode
|
| 17 |
+
base_path: /web
|
| 18 |
---
|
| 19 |
|
| 20 |
+
# PhysiX — Equation Discovery via RLVR
|
| 21 |
+
|
| 22 |
+
An [OpenEnv](https://github.com/openenv-hackathon/openenv) hackathon submission (Apr 2026).
|
| 23 |
+
|
| 24 |
+
Given a noisy trajectory and a one-sentence hint, a language model iteratively proposes and refines an ODE that reproduces the observed motion. Reward comes entirely from `scipy.integrate.odeint` + per-step R² — no LLM-as-judge.
|
| 25 |
+
|
| 26 |
+
---
|
| 27 |
+
|
| 28 |
+
## Links
|
| 29 |
+
|
| 30 |
+
| | |
|
| 31 |
+
|---|---|
|
| 32 |
+
| **Live demo (HF Space)** | https://huggingface.co/spaces/Pratyush-01/physix-live |
|
| 33 |
+
| **Trained model** | https://huggingface.co/Pratyush-01/physix-3b-rl |
|
| 34 |
+
| **Colab training notebook** | https://huggingface.co/spaces/Pratyush-01/physix-live/blob/main/train/physix_train_colab.ipynb |
|
| 35 |
+
| **W&B training runs** | https://wandb.ai/pratyush01/physix-live |
|
| 36 |
+
| **Blog post / writeup** | https://huggingface.co/spaces/Pratyush-01/physix-live/blob/main/docs/blog.md |
|
| 37 |
+
| **Checkpoint repo** | https://huggingface.co/Pratyush-01/physix-3b-rl-ckpt |
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
## Environment
|
| 42 |
+
|
| 43 |
+
### Physical Systems — 3 Tiers
|
| 44 |
+
|
| 45 |
+
6 training systems across 3 difficulty tiers, plus 2 held-out Tier 3 systems.
|
| 46 |
+
|
| 47 |
+
| Tier | System | Ground-truth equation | Notes |
|
| 48 |
+
|------|--------|-----------------------|-------|
|
| 49 |
+
| 1 | Free Fall | `d2y/dt2 = -g` | 1 parameter |
|
| 50 |
+
| 1 | Free Fall with Drag | `d2y/dt2 = -g + k*vy**2` | nonlinear drag |
|
| 51 |
+
| 1 | Simple Pendulum | `d2theta/dt2 = -(g/L)*sin(theta)` | transcendental |
|
| 52 |
+
| 2 | Damped Pendulum | `d2theta/dt2 = -(g/L)*sin(theta) - b*dtheta` | 3 parameters |
|
| 53 |
+
| 2 | Spring-Mass | `d2x/dt2 = -(k/m)*x` | parameter ratio |
|
| 54 |
+
| 2 | Damped Spring | `d2x/dt2 = -(k/m)*x - (b/m)*dx` | damped oscillation |
|
| 55 |
+
| 3 *(held-out)* | Projectile with Drag | 2-D coupled ODE | out-of-distribution |
|
| 56 |
+
| 3 *(held-out)* | Charged Particle in B-field | 2-D Lorentz force | cross-product coupling |
|
| 57 |
+
|
| 58 |
+
Parameters and initial conditions are randomised per episode.
|
| 59 |
+
|
| 60 |
+
### Example Task
|
| 61 |
+
|
| 62 |
+
```
|
| 63 |
+
HINT: Object dropped from altitude 58.3 m, mass 1.8 kg, in air.
|
| 64 |
+
Air resistance may be non-negligible.
|
| 65 |
+
|
| 66 |
+
TRAJECTORY (t, y, vy):
|
| 67 |
+
t=0.00 y=58.30 vy= 0.00
|
| 68 |
+
t=0.50 y=56.89 vy=-5.44
|
| 69 |
+
t=1.00 y=51.91 vy=-9.21
|
| 70 |
+
t=2.00 y=35.70 vy=-13.88
|
| 71 |
+
t=3.00 y=16.11 vy=-16.02
|
| 72 |
+
t=5.00 y=-20.42 vy=-16.49 ← terminal velocity visible
|
| 73 |
+
|
| 74 |
+
STATS: mean_vy=-10.85 std_vy=6.41 min_vy=-16.49
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
Target output:
|
| 78 |
+
|
| 79 |
+
```json
|
| 80 |
+
{
|
| 81 |
+
"equation": "d2y/dt2 = -g + k * vy**2",
|
| 82 |
+
"params": {"g": 9.81, "k": 0.047},
|
| 83 |
+
"rationale": "Quadratic drag; vy² is positive regardless of sign of vy."
|
| 84 |
+
}
|
| 85 |
+
```
|
| 86 |
+
|
| 87 |
+
**Grammar:** operators `+ - * / **`, functions `sin cos tan exp log sqrt abs`, declared state variables and parameter names. Anything outside this scores `format = 0`.
|
| 88 |
+
|
| 89 |
+
### Episode Flow
|
| 90 |
+
|
| 91 |
+
```mermaid
|
| 92 |
+
sequenceDiagram
|
| 93 |
+
participant Agent
|
| 94 |
+
participant Env as PhysiXEnvironment
|
| 95 |
+
participant Sim as scipy.odeint
|
| 96 |
+
participant Verifier
|
| 97 |
+
|
| 98 |
+
Env->>Agent: reset() → trajectory + hint
|
| 99 |
+
loop up to 8 turns
|
| 100 |
+
Agent->>Env: step(equation + params + rationale)
|
| 101 |
+
Env->>Sim: simulate hypothesis from t=0
|
| 102 |
+
Sim-->>Verifier: predicted trajectory
|
| 103 |
+
Verifier-->>Env: r_match + r_progress + r_simplicity + r_format
|
| 104 |
+
Env->>Agent: mismatch summary + reward breakdown + history
|
| 105 |
+
alt r_match > 0.93 or budget exhausted
|
| 106 |
+
Env-->>Agent: done=True
|
| 107 |
+
end
|
| 108 |
+
end
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
After each step the agent receives an English mismatch summary (e.g. *"predicted vy diverges after t=2 s; residual consistently negative"*) alongside the numeric reward breakdown, so it has something to act on in the next turn.
|
| 112 |
+
|
| 113 |
+
---
|
| 114 |
+
|
| 115 |
+
## Reward
|
| 116 |
+
|
| 117 |
+
All reward is computed from `scipy.odeint` output — no model-in-the-loop scoring.
|
| 118 |
+
|
| 119 |
+
### Step-wise (live env + GRPO)
|
| 120 |
+
|
| 121 |
+
| Component | Weight | Formula | Purpose |
|
| 122 |
+
|-----------|:------:|---------|---------|
|
| 123 |
+
| `match` | 0.50 | R² (observed vs. predicted) | primary accuracy signal |
|
| 124 |
+
| `progress` | 0.20 | `max(0, r_match − r_match_prev)` | per-turn improvement shaping |
|
| 125 |
+
| `simplicity` | 0.20 | `1 − (operator_count / 12)` | prefer shorter equations |
|
| 126 |
+
| `format` | 0.10 | 1 if parsed **and** simulated successfully | syntactic + numerical validity |
|
| 127 |
+
|
| 128 |
+
### GRPO-only additions
|
| 129 |
+
|
| 130 |
+
Two extra signals are added during training but not used in the live env:
|
| 131 |
+
|
| 132 |
+
- **`match_dense = sqrt(R²)`** — gives a non-trivial gradient when raw R² is near zero (e.g. `sqrt(0.05) ≈ 0.22`).
|
| 133 |
+
- **`correctness` = 1 if R² ≥ 0.70, else 0** — a binary bonus that helps push past R² plateaus where the dense signal flattens.
|
| 134 |
+
|
| 135 |
+
### Reward-hacking mitigations
|
| 136 |
+
|
| 137 |
+
Three failure modes found during development and how they were closed:
|
| 138 |
+
|
| 139 |
+
**1. Parse-but-crash exploit.**
|
| 140 |
+
A valid-but-explosive equation (e.g. `d2y/dt2 = exp(vy**10)`) parses but makes `odeint` produce NaN. Without a fix, it earns `format = 1`.
|
| 141 |
+
→ `format = 1` only if integration completes without NaN/inf.
|
| 142 |
+
|
| 143 |
+
**2. Trivial-equation exploit.**
|
| 144 |
+
`d2y/dt2 = 0` has zero operators, so `simplicity = 1`, earning 20% reward for a completely wrong trajectory.
|
| 145 |
+
→ `simplicity = 0` unless `r_match ≥ 0.10`.
|
| 146 |
+
|
| 147 |
+
**3. Progress signal in single-turn GRPO.**
|
| 148 |
+
Every GRPO training row starts with `previous_r_match = 0`, so `progress = r_match` — a redundant copy of the match signal that dilutes advantage estimates.
|
| 149 |
+
→ `progress` is excluded from the GRPO reward function set; it is only used in multi-turn live episodes.
|
| 150 |
+
|
| 151 |
+
---
|
| 152 |
+
|
| 153 |
+
## Training: SFT → GRPO
|
| 154 |
+
|
| 155 |
+
### Why SFT first
|
| 156 |
+
|
| 157 |
+
GRPO relies on reward variance across rollouts to estimate advantages. With a cold base model, ~80% of completions are unparseable (LaTeX, prose, malformed JSON) and most parseable ones crash the integrator, leaving near-zero variance and no useful gradient. The model needs to produce the right output format before RL can do anything meaningful with the physics signal.
|
| 158 |
+
|
| 159 |
+
SFT runs for 3 epochs on synthetic `(prompt, ground_truth_equation)` pairs generated from the environment. After SFT:
|
| 160 |
+
- >90% of completions parse and simulate successfully (up from ~20%).
|
| 161 |
+
- Equations are in the ASCII ODE grammar the verifier expects.
|
| 162 |
+
- The model has seen the right equation family for each system at least once.
|
| 163 |
+
|
| 164 |
+
SFT only establishes format. Parameter values are still wrong — that is what GRPO refines.
|
| 165 |
+
|
| 166 |
+
### Step 1 — SFT warm-start
|
| 167 |
+
|
| 168 |
+
```bash
|
| 169 |
+
python -m physix.training.sft \
|
| 170 |
+
--model Qwen/Qwen2.5-3B-Instruct \
|
| 171 |
+
--output-dir runs/physix-3b-sft \
|
| 172 |
+
--epochs 3 \
|
| 173 |
+
--lora-r 32 \
|
| 174 |
+
--instances-per-system 32 \
|
| 175 |
+
--system-ids damped_spring
|
| 176 |
+
```
|
| 177 |
+
|
| 178 |
+
Runtime: ~5 min on L40S.
|
| 179 |
+
|
| 180 |
+
### Step 2 — GRPO
|
| 181 |
+
|
| 182 |
+
```bash
|
| 183 |
+
python -m physix.training.loop \
|
| 184 |
+
--model Qwen/Qwen2.5-3B-Instruct \
|
| 185 |
+
--output-dir runs/physix-3b-rl \
|
| 186 |
+
--num-steps 200 \
|
| 187 |
+
--num-generations 4 \
|
| 188 |
+
--lora-r 32 \
|
| 189 |
+
--sft-checkpoint runs/physix-3b-sft/merged \
|
| 190 |
+
--system-ids damped_spring \
|
| 191 |
+
--push-to-hub \
|
| 192 |
+
--hub-repo-id Pratyush-01/physix-3b-rl
|
| 193 |
+
```
|
| 194 |
+
|
| 195 |
+
Runtime: ~45 min on L40S.
|
| 196 |
+
|
| 197 |
+
### Full cloud job
|
| 198 |
+
|
| 199 |
+
```bash
|
| 200 |
+
hf jobs uv run train/job_train_single.py \
|
| 201 |
+
--image unsloth/unsloth:2026.3.8-pt2.9.0-vllm-0.16.0-cu12.8-studio-release \
|
| 202 |
+
--flavor l40sx1 \
|
| 203 |
+
--secrets HF_TOKEN \
|
| 204 |
+
--secrets WANDB_API_KEY \
|
| 205 |
+
-v hf://datasets/Pratyush-01/physix-live-src:/physix-live \
|
| 206 |
+
--timeout 2h
|
| 207 |
+
```
|
| 208 |
+
|
| 209 |
+
---
|
| 210 |
+
|
| 211 |
+
## Training Results
|
| 212 |
+
|
| 213 |
+
| GRPO Loss (↓) | Total Reward (↑) |
|
| 214 |
+
|:---:|:---:|
|
| 215 |
+
|  |  |
|
| 216 |
+
|
| 217 |
+
| Per-component reward breakdown |
|
| 218 |
+
|:---:|
|
| 219 |
+
|  |
|
| 220 |
+
|
| 221 |
+
W&B runs: [pratyush01/physix-live](https://wandb.ai/pratyush01/physix-live)
|
| 222 |
+
|
| 223 |
+
Key observations from the run:
|
| 224 |
+
- `reward/format` jumps to ~0.9 in the first 10 steps and holds there — the SFT warm-start does its job.
|
| 225 |
+
- `reward/match_dense` (√R²) and `reward/correctness` both trend from ~0.6 to ~0.9–1.0 over 200 steps — the physics simulation is driving the gradient.
|
| 226 |
+
- `reward/match` (raw R²) tracks match_dense and converges to ~0.95+ by step 150, indicating the model reliably proposes equations that fit the trajectory.
|
| 227 |
+
- `reward/simplicity` rises gradually; the gate at R²≥0.10 prevents trivial-equation gaming (`d2y/dt2 = 0` can't earn simplicity reward).
|
| 228 |
+
- Total mean reward rises from ~3.3 to ~4.8 (+45%) with ±1σ variance shrinking — the policy is both improving and becoming more consistent.
|
| 229 |
+
|
| 230 |
+
What we don't claim:
|
| 231 |
+
- The model generalises well to Tier 3 systems without further training.
|
| 232 |
+
- A 3B model is competitive with frontier models on this task.
|
| 233 |
+
- The reward improvements translate to meaningful physics understanding beyond the training distribution.
|
| 234 |
+
|
| 235 |
+
---
|
| 236 |
+
|
| 237 |
+
## Repository Layout
|
| 238 |
+
|
| 239 |
+
```
|
| 240 |
+
physix-live/
|
| 241 |
+
├── physix/
|
| 242 |
+
│ ├── models.py # Pydantic Action / Observation / State
|
| 243 |
+
│ ├── client.py # OpenEnv WebSocket client
|
| 244 |
+
│ ├── systems/ # physical systems
|
| 245 |
+
│ │ ├── base.py # PhysicalSystem ABC
|
| 246 |
+
│ │ ├── tier1.py # FreeFall, FreeFallWithDrag, SimplePendulum
|
| 247 |
+
│ │ ├── tier2.py # DampedPendulum, SpringMass, DampedSpring
|
| 248 |
+
│ │ ├── tier3.py # ProjectileWithDrag, ChargedInBField (held out)
|
| 249 |
+
│ │ └── registry.py
|
| 250 |
+
│ ├── verifier/
|
| 251 |
+
│ │ ├── parser.py # SymPy whitelisted grammar
|
| 252 |
+
│ │ ├── simulator.py # scipy.odeint forward simulation
|
| 253 |
+
│ │ ├── metrics.py # per-step R²
|
| 254 |
+
│ │ ├── mismatch.py # English residual summary
|
| 255 |
+
│ │ └── reward.py # reward composition + hacking mitigations
|
| 256 |
+
│ ├── server/
|
| 257 |
+
│ │ ├── environment.py # PhysiXEnvironment (OpenEnv subclass)
|
| 258 |
+
│ │ ├── interactive.py # session-based REST router for the UI
|
| 259 |
+
│ │ └── app.py
|
| 260 |
+
│ └── training/
|
| 261 |
+
│ ├── prompt.py # observation → prompt
|
| 262 |
+
│ ├── scorer.py # cached single-completion scorer
|
| 263 |
+
│ ├── reward_fns.py # TRL-compatible reward callables
|
| 264 |
+
│ ├── dataset.py # GRPO dataset builder
|
| 265 |
+
│ ├── sft.py # SFT warm-start
|
| 266 |
+
│ └── loop.py # Unsloth + TRL GRPO loop
|
| 267 |
+
├── frontend/ # React + TS + Tailwind demo UI
|
| 268 |
+
├── train/ # HF Jobs launcher + Colab notebook
|
| 269 |
+
│ ├── submit.py # submit job via HfApi.run_uv_job
|
| 270 |
+
│ ├── job_train.py # multi-system driver (in-container)
|
| 271 |
+
│ ├── job_train_single.py # single-system driver (in-container)
|
| 272 |
+
│ ├── physix_train_colab.ipynb # SFT → GRPO end-to-end notebook
|
| 273 |
+
│ └── sync-plots.sh # mirror plots from model repo
|
| 274 |
+
├── tests/ # ~30 tests
|
| 275 |
+
├── docs/
|
| 276 |
+
│ ├── plots/ # committed loss / reward / per-component PNGs
|
| 277 |
+
│ └── writeup.md
|
| 278 |
+
├── Dockerfile # env Space build (FastAPI + built React UI)
|
| 279 |
+
├── openenv.yaml # OpenEnv manifest (name, runtime, app entrypoint)
|
| 280 |
+
└── pyproject.toml
|
| 281 |
+
```
|
| 282 |
+
|
| 283 |
+
---
|
| 284 |
+
|
| 285 |
+
## Quick Start
|
| 286 |
+
|
| 287 |
+
One command from the repo root:
|
| 288 |
+
|
| 289 |
+
```bash
|
| 290 |
+
make dev
|
| 291 |
+
```
|
| 292 |
+
|
| 293 |
+
This starts the FastAPI backend on `:8000` (deps auto-resolved by `uv`) and the Vite frontend on `:5173`. Open [http://localhost:5173](http://localhost:5173).
|
| 294 |
+
|
| 295 |
+
### Connecting an LLM
|
| 296 |
+
|
| 297 |
+
The demo speaks to **any OpenAI-compatible `/v1/chat/completions` endpoint** — local Ollama, Hugging Face Inference Providers, OpenAI, vLLM, OpenRouter, etc. The "Connect an LLM" panel exposes:
|
| 298 |
+
|
| 299 |
+
| Field | Purpose |
|
| 300 |
+
|-------|---------|
|
| 301 |
+
| **Endpoint** | Preset dropdown. Picks `base_url` + a default model id. |
|
| 302 |
+
| **Model** | Provider-native id (HF repo, Ollama tag, OpenAI name). Free-form. |
|
| 303 |
+
| **Custom base URL** | Shown when `Custom` is selected. Anything ending in `/v1`. |
|
| 304 |
+
| **API key** | Bearer token. Persisted per `base_url` in `localStorage`, never sent unless an episode runs. |
|
| 305 |
+
|
| 306 |
+
Server-side env-var fallback (lets a deployed Space ship a sensible default without leaking secrets in the bundle):
|
| 307 |
+
|
| 308 |
+
| URL family | Env var |
|
| 309 |
+
|---|---|
|
| 310 |
+
| `*huggingface*` | `HF_TOKEN`, then `HUGGINGFACE_API_KEY` |
|
| 311 |
+
| `*openai.com*` | `OPENAI_API_KEY` |
|
| 312 |
+
| `*openrouter*` | `OPENROUTER_API_KEY` |
|
| 313 |
+
| `localhost` / `127.0.0.1` | none (Ollama needs no key) |
|
| 314 |
+
|
| 315 |
+
### Side-by-side comparison
|
| 316 |
+
|
| 317 |
+
The default page is a **two-column comparison**: same trajectory, same hint, same seed, same verifier — two different models. The presets are wired to make the headline story self-evident:
|
| 318 |
+
|
| 319 |
+
- **A** = `Pratyush-01/physix-3b-rl` via HF Inference Providers (the GRPO-trained model)
|
| 320 |
+
- **B** = `Qwen/Qwen2.5-3B-Instruct` via HF Inference Providers (untrained baseline)
|
| 321 |
+
|
| 322 |
+
Drop in `gpt-4o-mini` on either side as a frontier reference, or swap to local Ollama for offline dev. The reward delta between the two columns is exactly what GRPO bought — no benchmark-prose necessary.
|
| 323 |
+
|
| 324 |
+
> **For the trained model on HF Inference Providers**: weights are public, but the repo card needs `inference: true` and a serving provider (Featherless/Together/etc.) to have it loaded. If a visitor sees a 404 from the trained side, they can either bring up `ollama serve` locally and pull a quantised version, or fall back to `Qwen/Qwen2.5-3B-Instruct` on both sides.
|
| 325 |
+
|
| 326 |
+
### Programmatic use
|
| 327 |
+
|
| 328 |
+
```python
|
| 329 |
+
import asyncio
|
| 330 |
+
from physix import PhysiXEnv, PhysiXAction
|
| 331 |
+
|
| 332 |
+
async def main():
|
| 333 |
+
async with PhysiXEnv(base_url="http://127.0.0.1:8000") as env:
|
| 334 |
+
obs = await env.reset(system_id="free_fall_drag", seed=42)
|
| 335 |
+
result = await env.step(
|
| 336 |
+
PhysiXAction(equation="d2y/dt2 = -g + k * vy**2", params={"g": 9.81, "k": 0.05})
|
| 337 |
+
)
|
| 338 |
+
print(result.observation.reward_breakdown)
|
| 339 |
+
|
| 340 |
+
asyncio.run(main())
|
| 341 |
+
```
|
| 342 |
+
|
| 343 |
+
```bash
|
| 344 |
+
pytest tests/
|
| 345 |
+
```
|
| 346 |
+
|
| 347 |
+
---
|
| 348 |
+
|
| 349 |
+
## License
|
| 350 |
+
|
| 351 |
+
MIT.
|
__init__.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""OpenEnv root package shim.
|
| 2 |
+
|
| 3 |
+
The OpenEnv CLI's ``validate_env_structure`` expects ``__init__.py``,
|
| 4 |
+
``client.py``, and ``models.py`` to exist at the env-directory root —
|
| 5 |
+
the convention where "the env *is* the package". Our actual code lives
|
| 6 |
+
under ``physix/`` so the wheel builds cleanly and tests / training
|
| 7 |
+
imports stay at ``from physix.* import ...``. These root shims simply
|
| 8 |
+
re-export from ``physix`` so OpenEnv's auto-discovery (which Pascal-
|
| 9 |
+
cases ``name: physix`` to ``Physix*`` in client.py) finds the symbols
|
| 10 |
+
it expects without duplicating any implementation.
|
| 11 |
+
|
| 12 |
+
NOTE: Inside the deployed Space the package installed via
|
| 13 |
+
``pip install -e .`` is ``physix`` (see ``[tool.hatch.build.targets.wheel]``
|
| 14 |
+
in pyproject.toml). These root files are *only* loaded by the OpenEnv
|
| 15 |
+
CLI's local validator and by users who import the env-directory as a
|
| 16 |
+
package; they are never imported at runtime by the FastAPI server.
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
from physix import ( # noqa: F401
|
| 20 |
+
GRAMMAR_HINT,
|
| 21 |
+
PhysiXAction,
|
| 22 |
+
PhysiXEnv,
|
| 23 |
+
PhysiXObservation,
|
| 24 |
+
PhysiXState,
|
| 25 |
+
RewardBreakdown,
|
| 26 |
+
__version__,
|
| 27 |
+
)
|
| 28 |
+
|
| 29 |
+
__all__ = [
|
| 30 |
+
"PhysiXEnv",
|
| 31 |
+
"PhysiXAction",
|
| 32 |
+
"PhysiXObservation",
|
| 33 |
+
"PhysiXState",
|
| 34 |
+
"RewardBreakdown",
|
| 35 |
+
"GRAMMAR_HINT",
|
| 36 |
+
"__version__",
|
| 37 |
+
]
|
client.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""OpenEnv root client shim — re-exports ``physix.client``.
|
| 2 |
+
|
| 3 |
+
OpenEnv's CLI validator and auto-discovery expect ``client.py`` at the
|
| 4 |
+
env-directory root. The real implementation lives in
|
| 5 |
+
``physix/client.py``; this file just re-exports it so the OpenEnv
|
| 6 |
+
contract is satisfied without duplicating any code.
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
from physix.client import PhysiXEnv, PhysixEnv # noqa: F401
|
| 10 |
+
|
| 11 |
+
__all__ = ["PhysiXEnv", "PhysixEnv"]
|
docs/blog.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# PhysiX — Equation Discovery from Noisy Trajectories via RLVR
|
| 2 |
+
|
| 3 |
+
**OpenEnv India Hackathon 2026** · [Live Space](https://huggingface.co/spaces/Pratyush-01/physix-live) · [Trained Model](https://huggingface.co/Pratyush-01/physix-3b-rl) · [W&B Runs](https://wandb.ai/pratyush01/physix-live)
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## The Problem
|
| 8 |
+
|
| 9 |
+
Given a short, noisy trajectory of a physical system — positions and velocities over time — can a language model discover the underlying equation of motion?
|
| 10 |
+
|
| 11 |
+
This is symbolic regression meets agentic RL. The challenge: the equation space is vast, noise means no trajectory perfectly fits any ODE, and the agent must learn to iterate — propose, simulate, compare residuals, refine. Classical tools (genetic programming, sparse regression) can do this, but they can't read a natural language hint or reason about failure in English. We train a 3B LLM to do it using RLVR.
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## The Environment
|
| 16 |
+
|
| 17 |
+
**PhysiXEnvironment** gives the agent a noisy trajectory from a physical system and asks it to output an ODE that reproduces the motion. All reward comes from `scipy.odeint` — no LLM-as-judge.
|
| 18 |
+
|
| 19 |
+
### Systems
|
| 20 |
+
|
| 21 |
+
Three systems were used for training:
|
| 22 |
+
|
| 23 |
+
| System | Ground-truth ODE |
|
| 24 |
+
|--------|-----------------|
|
| 25 |
+
| Free Fall | `d2y/dt2 = -g` |
|
| 26 |
+
| Simple Pendulum | `d2theta/dt2 = -(g/L)*sin(theta)` |
|
| 27 |
+
| Damped Spring | `d2x/dt2 = -(k/m)*x - (b/m)*dx` |
|
| 28 |
+
|
| 29 |
+
Parameters and initial conditions are randomised per episode.
|
| 30 |
+
|
| 31 |
+
### Episode flow
|
| 32 |
+
|
| 33 |
+
1. `reset()` → agent receives a noisy trajectory + a one-sentence physical hint
|
| 34 |
+
2. Agent proposes an ODE in JSON: `{"equation": "...", "params": {...}}`
|
| 35 |
+
3. Environment simulates it via `scipy.odeint` and computes R²
|
| 36 |
+
4. Agent receives a residual summary in English + numeric reward breakdown
|
| 37 |
+
5. Repeat up to 8 turns
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
## Reward Design
|
| 42 |
+
|
| 43 |
+
All reward is computed from `scipy.odeint` — no model-in-the-loop scoring.
|
| 44 |
+
|
| 45 |
+
**R²** (coefficient of determination): R² = 1 is a perfect match, R² = 0 means no better than predicting the mean, R² < 0 is actively wrong.
|
| 46 |
+
|
| 47 |
+
| Component | Formula | What it rewards | Why it's needed |
|
| 48 |
+
|-----------|---------|-----------------|-----------------|
|
| 49 |
+
| `match` | R² | Continuous fit quality | Primary learning signal |
|
| 50 |
+
| `match_dense` | √R² | Same, stretched | R² ≈ 0 early on; √R² gives non-zero gradient (√0.05 ≈ 0.22) so GRPO isn't blind in early steps |
|
| 51 |
+
| `correctness` | 1 if R² ≥ 0.70 else 0 | Binary "good enough" | Creates a cliff the policy climbs; helps escape plateaus |
|
| 52 |
+
| `simplicity` | 1 − operators/12, gated on R² ≥ 0.10 | Shorter equations | Without the gate, `d2y/dt2 = 0` scores simplicity = 1 for free |
|
| 53 |
+
| `format` | 1 if parses **and** `odeint` runs without NaN | Valid, simulatable output | Without the NaN check, explosive equations like `exp(vy**10)` claim reward |
|
| 54 |
+
|
| 55 |
+
---
|
| 56 |
+
|
| 57 |
+
## Training: SFT → GRPO
|
| 58 |
+
|
| 59 |
+
### Why SFT first
|
| 60 |
+
|
| 61 |
+
Qwen2.5-3B out of the box produces LaTeX, prose, or malformed JSON on ~80% of turns — the verifier can't parse any of it. GRPO needs *variance in reward* across rollouts to estimate advantages; if every rollout scores ~0 because nothing parses, the gradient is zero and nothing learns.
|
| 62 |
+
|
| 63 |
+
SFT on synthetic `(prompt, ground_truth_equation)` pairs teaches the model the output format before RL begins. 4 epochs, ~5 min on L40S. After SFT, >90% of completions parse and simulate successfully — GRPO now has a signal to work with.
|
| 64 |
+
|
| 65 |
+
### GRPO
|
| 66 |
+
|
| 67 |
+
- **Model:** Qwen/Qwen2.5-3B-Instruct + LoRA-32
|
| 68 |
+
- **Systems:** free_fall, simple_pendulum, damped_spring
|
| 69 |
+
- **Steps:** 200 (early stopping on reward convergence)
|
| 70 |
+
- **LR:** 1e-5
|
| 71 |
+
- **Generations:** 4 per prompt
|
| 72 |
+
- **Framework:** Unsloth + TRL GRPOTrainer
|
| 73 |
+
|
| 74 |
+
---
|
| 75 |
+
|
| 76 |
+
## Results
|
| 77 |
+
|
| 78 |
+
| SFT Loss (↓) | GRPO Loss (↓) |
|
| 79 |
+
|:---:|:---:|
|
| 80 |
+
|  |  |
|
| 81 |
+
|
| 82 |
+
| GRPO Total Reward (↑) |
|
| 83 |
+
|:---:|
|
| 84 |
+
|  |
|
| 85 |
+
|
| 86 |
+
| Per-component reward breakdown |
|
| 87 |
+
|:---:|
|
| 88 |
+
|  |
|
| 89 |
+
|
| 90 |
+
Key observations:
|
| 91 |
+
- `reward_format` jumps to ~0.9 in the first 10 steps — the SFT warm-start does its job immediately
|
| 92 |
+
- `reward_match_dense` (√R²) and `reward_correctness` climb from ~0.6 → ~0.95 over 200 steps
|
| 93 |
+
- `reward_match` (raw R²) converges to ~0.95+ by step 150
|
| 94 |
+
- Total mean reward rises from ~3.3 → ~4.8 (+45%) with ±1σ variance shrinking
|
| 95 |
+
- GRPO loss near zero is **expected** — it's the KL regularisation term; the real signal is the reward curves
|
| 96 |
+
|
| 97 |
+
Full runs: [wandb.ai/pratyush01/physix-live](https://wandb.ai/pratyush01/physix-live)
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
|
| 101 |
+
## What's Novel
|
| 102 |
+
|
| 103 |
+
1. **Verifiable reward without a judge** — R² from `scipy.odeint` is ground truth, not a proxy
|
| 104 |
+
2. **Iterative refinement loop** — the environment feeds residual summaries back in English so the agent can reason about what went wrong and refine
|
| 105 |
+
3. **Reward hacking case study** — three exploits found and patched during development: parse-but-crash equations, trivial-equation simplicity farming, duplicate progress signal
|
| 106 |
+
4. **SFT → GRPO pipeline** — shows how a cold 3B model can be made RL-trainable in under 10 minutes of SFT
|
| 107 |
+
|
| 108 |
+
---
|
| 109 |
+
|
| 110 |
+
## Future Scope
|
| 111 |
+
|
| 112 |
+
The framework is system-agnostic — adding a new physical system means subclassing `PhysicalSystem`, implementing `simulate` and `ground_truth_equation`, and registering it. The verifier, reward function, and training loop need no changes.
|
| 113 |
+
|
| 114 |
+
Natural extensions:
|
| 115 |
+
|
| 116 |
+
- **More complex dynamics** — coupled oscillators, Lorenz attractor, reaction-diffusion, N-body gravity
|
| 117 |
+
- **Larger models** — the same pipeline runs on 7B; LoRA rank and LR need tuning but the reward design transfers directly
|
| 118 |
+
- **Multi-turn curriculum** — currently trains on turn-0 only; training on full refinement trajectories would teach the model to use residual feedback more effectively
|
| 119 |
+
- **Noisier / sparser observations** — current trajectories have moderate Gaussian noise; testing on sparser or higher-noise regimes would stress-test the R² reward
|
| 120 |
+
|
| 121 |
+
---
|
| 122 |
+
|
| 123 |
+
## Links
|
| 124 |
+
|
| 125 |
+
- **Live demo:** https://huggingface.co/spaces/Pratyush-01/physix-live
|
| 126 |
+
- **Trained model:** https://huggingface.co/Pratyush-01/physix-3b-rl
|
| 127 |
+
- **Training notebook:** https://huggingface.co/spaces/Pratyush-01/physix-live/blob/main/train/physix_train_colab.ipynb
|
| 128 |
+
- **W&B project:** https://wandb.ai/pratyush01/physix-live
|
docs/plots/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Training Curves
|
| 2 |
+
|
| 3 |
+
PNGs in this directory are auto-generated by
|
| 4 |
+
`physix.training.loop._render_training_curves` at end of every GRPO run, then
|
| 5 |
+
mirrored from the HF model repo via `train/sync-plots.sh`.
|
| 6 |
+
|
| 7 |
+
Files:
|
| 8 |
+
|
| 9 |
+
- `loss.png` — GRPO surrogate loss over training steps.
|
| 10 |
+
- `reward.png` — Mean reward (with ±1σ band) over training steps.
|
| 11 |
+
- `reward_components.png` — Per-component reward (`match`, `match_dense`,
|
| 12 |
+
`correctness`, `simplicity`, `format`).
|
| 13 |
+
|
| 14 |
+
To regenerate locally after a job:
|
| 15 |
+
|
| 16 |
+
./train/sync-plots.sh Pratyush-01/physix-3b-rl
|
docs/plots/loss.png
ADDED
|
docs/plots/reward.png
ADDED
|
Git LFS Details
|
docs/plots/reward_components.png
ADDED
|
Git LFS Details
|
docs/plots/sft_loss.png
ADDED
|
frontend/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# PhysiX-Live frontend
|
| 2 |
+
|
| 3 |
+
React + TypeScript + Tailwind UI for the PhysiX-Live demo. Two tabs:
|
| 4 |
+
|
| 5 |
+
- **Run with LLM** — drives a live episode via `POST /interactive/sessions/:id/llm-step`. Server calls a local Ollama daemon, parses the reply, scores it, returns the turn. The UI streams turn cards as they arrive.
|
| 6 |
+
- **Manual** — `/interactive/sessions/:id/step`: you submit equations yourself.
|
| 7 |
+
|
| 8 |
+
## Stack
|
| 9 |
+
|
| 10 |
+
- React 18 with strict TypeScript (`exactOptionalPropertyTypes: true`).
|
| 11 |
+
- Tailwind CSS 3 (warm dark palette, custom tokens in `tailwind.config.js`).
|
| 12 |
+
- Vite 5 dev server / bundler.
|
| 13 |
+
- KaTeX for live equation rendering.
|
| 14 |
+
- Plain HTML5 canvas for trajectory plots — no chart library.
|
| 15 |
+
|
| 16 |
+
## Layout
|
| 17 |
+
|
| 18 |
+
```
|
| 19 |
+
src/
|
| 20 |
+
├── App.tsx # tab switch
|
| 21 |
+
├── main.tsx # ReactDOM root
|
| 22 |
+
├── components/
|
| 23 |
+
│ ├── HeroIntro.tsx # 3-step "Observe / Hypothesise / Verify"
|
| 24 |
+
│ ├── RunWithLlmPane.tsx # LLM-driven episode + turn-by-turn stream
|
| 25 |
+
│ ├── InteractivePane.tsx # manual equation submission
|
| 26 |
+
│ ├── EquationInput.tsx # textarea + KaTeX preview + starter chips
|
| 27 |
+
│ ├── EquationDisplay.tsx # KaTeX render of one equation
|
| 28 |
+
│ ├── TrajectoryCanvas.tsx # observed (cyan) + predicted (coral)
|
| 29 |
+
│ ├── RewardGauge.tsx # 4-bar breakdown with tooltips
|
| 30 |
+
│ └── Skeleton.tsx # loading shimmer
|
| 31 |
+
├── hooks/
|
| 32 |
+
│ ├── useInteractiveSession.ts # manual-mode session lifecycle
|
| 33 |
+
│ └── useLlmEpisodeRunner.ts # LLM run / pause / step-once orchestration
|
| 34 |
+
├── lib/
|
| 35 |
+
│ ├── interactiveClient.ts # typed fetch over /interactive/*
|
| 36 |
+
│ ├── trajectory.ts # canvas projection helpers
|
| 37 |
+
│ ├── format.ts # SymPy -> KaTeX
|
| 38 |
+
│ └── cn.ts # classnames joiner
|
| 39 |
+
└── types/physix.ts # mirrors the Pydantic wire schema
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
## Scripts
|
| 43 |
+
|
| 44 |
+
```bash
|
| 45 |
+
pnpm install # install deps
|
| 46 |
+
pnpm dev # vite dev server on http://localhost:5173
|
| 47 |
+
pnpm typecheck # strict tsc --noEmit
|
| 48 |
+
pnpm build # production build into dist/
|
| 49 |
+
pnpm preview # serve the production build locally
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
The UI expects `VITE_PHYSIX_API_URL` (default `http://localhost:8000`) to point at a running env server (`python -m physix.server.app`). For the LLM tab you also need `ollama serve` and the model tag pulled.
|
frontend/dist-ts-build/tsconfig.node.tsbuildinfo
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"fileNames":["../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es5.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/globals.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/blob.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/console.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/encoding.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/events.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/utility.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/header.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/readable.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/fetch.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/formdata.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/connector.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/client-stats.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/client.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/errors.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/global-dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/global-origin.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/pool-stats.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/pool.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/handlers.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/balanced-pool.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/round-robin-pool.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/h2c-client.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-call-history.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-client.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-pool.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/snapshot-agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/mock-errors.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/retry-handler.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/retry-agent.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/api.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/cache-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/interceptors.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/util.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/cookies.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/patch.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/websocket.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/eventsource.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/content-type.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/cache.d.ts","../node_modules/.pnpm/undici-types@7.19.2/node_modules/undici-types/index.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/importmeta.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/messaging.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/performance.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/storage.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/streams.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/timers.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/web-globals/url.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/assert.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/assert/strict.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/async_hooks.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/buffer.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/child_process.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/cluster.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/console.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/constants.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/crypto.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/dgram.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/dns.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/dns/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/domain.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/events.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/fs.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/fs/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/http.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/http2.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/https.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/inspector.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/inspector.generated.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/inspector/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/module.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/net.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/os.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/path.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/path/posix.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/path/win32.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/perf_hooks.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/process.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/punycode.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/querystring.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/quic.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/readline.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/readline/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/repl.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/sea.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/sqlite.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/stream.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/stream/consumers.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/stream/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/stream/web.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/string_decoder.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/test.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/test/reporters.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/timers.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/timers/promises.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/tls.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/trace_events.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/tty.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/url.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/util.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/util/types.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/v8.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/vm.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/wasi.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/worker_threads.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/zlib.d.ts","../node_modules/.pnpm/@types+node@25.6.0/node_modules/@types/node/ts5.6/index.d.ts","../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../node_modules/.pnpm/rollup@4.60.2/node_modules/rollup/dist/rollup.d.ts","../node_modules/.pnpm/rollup@4.60.2/node_modules/rollup/dist/parseast.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/types/hmrpayload.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/types/customevent.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/types/hot.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/dist/node/types.d-agj9qkwt.d.ts","../node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts","../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/previous-map.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/input.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/declaration.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/root.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/warning.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/lazy-result.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/no-work-result.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/processor.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/result.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/document.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/rule.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/node.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/comment.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/container.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/at-rule.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/list.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/postcss.d.ts","../node_modules/.pnpm/postcss@8.5.10/node_modules/postcss/lib/postcss.d.mts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/dist/node/runtime.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/types/importglob.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/types/metadata.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@25.6.0/node_modules/vite/dist/node/index.d.ts","../node_modules/.pnpm/@babel+types@7.29.0/node_modules/@babel/types/lib/index.d.ts","../node_modules/.pnpm/@types+babel__generator@7.27.0/node_modules/@types/babel__generator/index.d.ts","../node_modules/.pnpm/@babel+parser@7.29.2/node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/.pnpm/@types+babel__template@7.4.4/node_modules/@types/babel__template/index.d.ts","../node_modules/.pnpm/@types+babel__traverse@7.28.0/node_modules/@types/babel__traverse/index.d.ts","../node_modules/.pnpm/@types+babel__core@7.20.5/node_modules/@types/babel__core/index.d.ts","../node_modules/.pnpm/@vitejs+plugin-react@4.7.0_vite@5.4.21_@types+node@25.6.0_/node_modules/@vitejs/plugin-react/dist/index.d.ts","../vite.config.ts"],"fileIdsList":[[62,125,133,137,140,142,143,144,156,214],[62,125,133,137,140,142,143,144,156],[62,125,133,137,140,142,143,144,156,214,215,216,217,218],[62,125,133,137,140,142,143,144,156,214,216],[62,122,123,125,133,137,140,142,143,144,156],[62,124,125,133,137,140,142,143,144,156],[62,125,133,137,140,142,143,144,156,164],[62,125,126,131,133,136,137,140,142,143,144,146,156,161,173],[62,125,126,127,133,136,137,140,142,143,144,156],[62,125,128,133,137,140,142,143,144,156,174],[62,125,129,130,133,137,140,142,143,144,147,156],[62,125,130,133,137,140,142,143,144,156,161,170],[62,125,131,133,136,137,140,142,143,144,146,156],[62,124,125,132,133,137,140,142,143,144,156],[62,125,133,134,137,140,142,143,144,156],[62,125,133,135,136,137,140,142,143,144,156],[62,124,125,133,136,137,140,142,143,144,156],[62,125,133,136,137,138,140,142,143,144,156,161,173],[62,125,133,136,137,138,140,142,143,144,156,161,164],[62,112,125,133,136,137,139,140,142,143,144,146,156,161,173],[62,125,133,136,137,139,140,142,143,144,146,156,161,170,173],[62,125,133,137,139,140,141,142,143,144,156,161,170,173],[62,125,133,136,137,140,142,143,144,156],[62,125,133,137,140,142,144,156],[62,125,133,137,140,142,143,144,145,156,173],[62,125,133,136,137,140,142,143,144,146,156,161],[62,125,133,137,140,142,143,144,147,156],[62,125,133,137,140,142,143,144,148,156],[62,125,133,136,137,140,142,143,144,151,156],[62,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180],[62,125,133,137,140,142,143,144,153,156],[62,125,133,137,140,142,143,144,154,156],[62,125,130,133,137,140,142,143,144,146,156,164],[62,125,133,136,137,140,142,143,144,156,157],[62,125,133,137,140,142,143,144,156,158,174,177],[62,125,133,136,137,140,142,143,144,156,161,163,164],[62,125,133,137,140,142,143,144,156,162,164],[62,125,133,137,140,142,143,144,156,164,174],[62,125,133,137,140,142,143,144,156,165],[62,122,125,133,137,140,142,143,144,156,161,167,173],[62,125,133,137,140,142,143,144,156,161,166],[62,125,133,136,137,140,142,143,144,156,168,169],[62,125,133,137,140,142,143,144,156,168,169],[62,125,130,133,137,140,142,143,144,146,156,161,170],[62,125,133,137,140,142,143,144,156,171],[125,133,137,140,142,143,144,156],[59,60,61,62,63,64,65,66,67,68,69,70,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180],[62,125,133,137,140,142,143,144,146,156,172],[62,125,133,137,139,140,142,143,144,154,156,173],[62,125,133,137,140,142,143,144,156,174,175],[62,125,130,133,137,140,142,143,144,156,175],[62,125,133,137,140,142,143,144,156,161,176],[62,125,133,137,140,142,143,144,145,156,177],[62,125,133,137,140,142,143,144,156,178],[62,125,128,133,137,140,142,143,144,156],[62,125,130,133,137,140,142,143,144,156],[62,125,133,137,140,142,143,144,156,174],[62,112,125,133,137,140,142,143,144,156],[62,125,133,137,140,142,143,144,156,173],[62,125,133,137,140,142,143,144,156,179],[62,125,133,137,140,142,143,144,151,156],[62,125,133,137,140,142,143,144,156,169],[62,112,125,133,136,137,138,140,142,143,144,151,156,161,164,173,176,177,179],[62,125,133,137,140,142,143,144,156,161,180],[62,125,133,137,140,142,143,144,156,213,219],[62,125,133,137,140,142,143,144,156,205],[62,125,133,137,140,142,143,144,156,203,205],[62,125,133,137,140,142,143,144,156,194,202,203,204,206,208],[62,125,133,137,140,142,143,144,156,192],[62,125,133,137,140,142,143,144,156,195,200,205,208],[62,125,133,137,140,142,143,144,156,191,208],[62,125,133,137,140,142,143,144,156,195,196,199,200,201,208],[62,125,133,137,140,142,143,144,156,195,196,197,199,200,208],[62,125,133,137,140,142,143,144,156,192,193,194,195,196,200,201,202,204,205,206,208],[62,125,133,137,140,142,143,144,156,208],[62,125,133,137,140,142,143,144,156,190,192,193,194,195,196,197,199,200,201,202,203,204,205,206,207],[62,125,133,137,140,142,143,144,156,190,208],[62,125,133,137,140,142,143,144,156,195,197,198,200,201,208],[62,125,133,137,140,142,143,144,156,199,208],[62,125,133,137,140,142,143,144,156,200,201,205,208],[62,125,133,137,140,142,143,144,156,193,203],[62,125,133,137,140,142,143,144,156,183,212],[62,125,133,137,140,142,143,144,156,182,183],[62,77,80,83,84,125,133,137,140,142,143,144,156,173],[62,80,125,133,137,140,142,143,144,156,161,173],[62,80,84,125,133,137,140,142,143,144,156,173],[62,125,133,137,140,142,143,144,156,161],[62,74,125,133,137,140,142,143,144,156],[62,78,125,133,137,140,142,143,144,156],[62,76,77,80,125,133,137,140,142,143,144,156,173],[62,125,133,137,140,142,143,144,146,156,170],[62,125,133,137,140,142,143,144,156,181],[62,74,125,133,137,140,142,143,144,156,181],[62,76,80,125,133,137,140,142,143,144,146,156,173],[62,71,72,73,75,79,125,133,136,137,140,142,143,144,156,161,173],[62,80,89,97,125,133,137,140,142,143,144,156],[62,72,78,125,133,137,140,142,143,144,156],[62,80,106,107,125,133,137,140,142,143,144,156],[62,72,75,80,125,133,137,140,142,143,144,156,164,173,181],[62,80,125,133,137,140,142,143,144,156],[62,76,80,125,133,137,140,142,143,144,156,173],[62,71,125,133,137,140,142,143,144,156],[62,74,75,76,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,107,108,109,110,111,125,133,137,140,142,143,144,156],[62,80,99,102,125,133,137,140,142,143,144,156],[62,80,89,90,91,125,133,137,140,142,143,144,156],[62,78,80,90,92,125,133,137,140,142,143,144,156],[62,79,125,133,137,140,142,143,144,156],[62,72,74,80,125,133,137,140,142,143,144,156],[62,80,84,90,92,125,133,137,140,142,143,144,156],[62,84,125,133,137,140,142,143,144,156],[62,78,80,83,125,133,137,140,142,143,144,156,173],[62,72,76,80,89,125,133,137,140,142,143,144,156],[62,80,99,125,133,137,140,142,143,144,156],[62,92,125,133,137,140,142,143,144,156],[62,74,80,106,125,133,137,140,142,143,144,156,164,179,181],[62,125,133,136,137,139,140,141,142,143,144,146,156,161,170,173,180,181,183,184,185,186,187,188,189,209,210,211,212],[62,125,133,137,140,142,143,144,156,185,186,187,188],[62,125,133,137,140,142,143,144,156,185,186,187],[62,125,133,137,140,142,143,144,156,185],[62,125,133,137,140,142,143,144,156,186],[62,125,133,137,140,142,143,144,156,183],[62,125,133,137,140,142,143,144,148,156,213,220]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"15c1c3d7b2e46e0025417ed6d5f03f419e57e6751f87925ca19dc88297053fe6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"394fda71d5d6bd00a372437dff510feab37b92f345861e592f956d6995e9c1ce","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f2442c0ca5e7fcb9d51ebbd7d43079844bcbfd947bb679b9419900745f871d5","affectsGlobalScope":true,"impliedFormat":1},{"version":"30c0b4546bd5c91429fffc790aa835c7a60cd9d5bcd23e2373a416fbbb75d1f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"4137ebf04166f3a325f056aa56101adc75e9dceb30404a1844eb8604d89770e2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2ae155afe8a01cc0ae612d99117cf8ef16692ba7c4366590156fdec1bcf2d8c","impliedFormat":1},{"version":"3f5e5d9be35913db9fea42a63f3df0b7e3c8703b97670a2125587b4dbbd56d7c","impliedFormat":1},{"version":"8caeb65fdc3bfe0d13f86f67324fcb2d858ed1c55f1f0cce892eb1acfb9f3239","impliedFormat":1},{"version":"57c23df0b5f7a8e26363a3849b0bc7763f6b241207157c8e40089d1df4116f35","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b8bc0c17b54081b0878673989216229e575d67a10874e84566a21025a2461ee","impliedFormat":1},{"version":"5b0db5a58b73498792a29bfebc333438e61906fef75da898b410e24e52229e6f","impliedFormat":1},{"version":"dbe055b2b29a7bab2c1ca8f259436306adb43f469dca7e639a02cd3695d3f621","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"e3905f6902f0b69e5eefc230daa69fdd4ab707a973ec2d086d65af1b3ea47ef0","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"9ec87fea42b92894b0f209931a880789d43c3397d09dd99c631ae40a2f7071d1","impliedFormat":1},{"version":"c68e88cdfadfb6c8ba5fc38e58a3a166b0beae77b1f05b7d921150a32a5ffb8d","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"07e4e61e946a9c15045539ecd5f5d2d02e7aab6fa82567826857e09cf0f37c2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c4714ccc29149efb8777a1da0b04b8d2258f5d13ddbf4cd3c3d361fb531ac86","impliedFormat":1},{"version":"3ff275f84f89f8a7c0543da838f9da9614201abc4ce74c533029825adfb4433d","impliedFormat":1},{"version":"0eb5d0cbf09de5d34542b977fd6a933bb2e0817bffe8e1a541b2f1ad1b9af1ff","impliedFormat":1},{"version":"f9713757bcdfa4d58b48c0fb249e752c94a3eee8bf4532b906094246ac49ef88","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"c32c840c62d8bd7aeb3147aa6754cd2d922b990a6b6634530cb2ebdce5adc8e9","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"6fe28249ac0c7bc19a79aa9264baf00efbd080e868dbe1d3052033ad1c64f206","affectsGlobalScope":true,"impliedFormat":1},{"version":"cbed824fec91efefc7bbdcb8b43d1a531fdbebd0e2ef19481501ff365a93cb70","impliedFormat":1},{"version":"d0716593b3f2b0451bcf0c24cfa86dec2235c325c89f201934248b7c742715fc","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"2991bca2cc0f0628a278df2a2ccdb8d6cbcb700f3761abbed62bba137d5b1790","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"a74edb3bab7394a9dbde529d60632be590def2f5f01024dbd85441587fbfbbe0","impliedFormat":1},{"version":"0ea59f7d3e51440baa64f429253759b106cfcbaf51e474cae606e02265b37cf8","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"00049ccc87f3f37726db03c01ca68fe74fd9c0109b68c29eb9923ebec2c76b13","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"68d3f35108e2608b1f2f28b36d19d7055f31c4465cc5692cbd06c716a9fe7973","impliedFormat":1},{"version":"a6d543044570fbeed13a7f9925a868081cd2b14ef59cdd9da6ae76d41cab03d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"eab2f3179607acb3d44b2db2a76dd7d621c5039b145dc160a1ee733963f9d2f5","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"6f5383b3df1cdf4ff1aa7fb0850f77042b5786b5e65ec9a9b6be56ebfe4d9036","impliedFormat":1},{"version":"62fc21ed9ccbd83bd1166de277a4b5daaa8d15b5fa614c75610d20f3b73fba87","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"9d3821bc75c59577e52643324cec92fc2145642e8d17cf7ee07a3181f21d985d","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"c77fb31bc17fd241d3922a9f88c59e3361cdf76d1328ba9412fc6bf7310b638d","impliedFormat":1},{"version":"0a20eaf2e4b1e3c1e1f87f7bccb0c936375b23b022baeea750519b7c9bc6ce83","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"a16b91b27bd6b706c687c88cbc8a7d4ee98e5ed6043026d6b84bda923c0aed67","impliedFormat":1},{"version":"694b812e0ed11285e8822cf8131e3ce7083a500b3b1d185fff9ed1089677bd0a","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"6eeded8c7e352be6e0efb83f4935ec752513c4d22043b52522b90849a49a3a11","impliedFormat":1},{"version":"6c1ad90050ffbb151cacc68e2d06ea1a26a945659391e32651f5d42b86fd7f2c","impliedFormat":1},{"version":"c28690b16de19870684ec3b78b87d9198e3c2bf5171b66ab3f353dfa935483ec","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"282f98006ed7fa9bb2cd9bdbe2524595cfc4bcd58a0bb3232e4519f2138df811","impliedFormat":1},{"version":"6222e987b58abfe92597e1273ad7233626285bc2d78409d4a7b113d81a83496b","impliedFormat":1},{"version":"cbe726263ae9a7bf32352380f7e8ab66ee25b3457137e316929269c19e18a2be","impliedFormat":1},{"version":"8b96046bf5fb0a815cba6b0880d9f97b7f3a93cf187e8dcfe8e2792e97f38f87","impliedFormat":99},{"version":"bacf2c84cf448b2cd02c717ad46c3d7fd530e0c91282888c923ad64810a4d511","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"00cf4001e0d9c6e5e036bc545b9d73e2b8b84cddb02e61ad05bab3752b1d4522","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"82e687ebd99518bc63ea04b0c3810fb6e50aa6942decd0ca6f7a56d9b9a212a6","impliedFormat":99},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"8f07f2b6514744ac96e51d7cb8518c0f4de319471237ea10cf688b8d0e9d0225","impliedFormat":1},{"version":"257b83faa134d971c738a6b9e4c47e59bb7b23274719d92197580dd662bfafc3","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"a5732558040f85d91bf862dbc1b644c525f151c2b498062540d78f8d1ee366a2","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"}],"root":[221],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[216,1],[214,2],[219,3],[215,1],[217,4],[218,1],[182,2],[122,5],[123,5],[124,6],[125,7],[126,8],[127,9],[60,2],[128,10],[129,11],[130,12],[131,13],[132,14],[133,15],[134,15],[135,16],[136,17],[137,18],[138,19],[63,2],[139,20],[140,21],[141,22],[142,23],[143,24],[144,23],[145,25],[146,26],[147,27],[148,28],[149,28],[150,28],[151,29],[152,30],[153,31],[154,32],[155,33],[156,34],[157,34],[158,35],[159,2],[160,2],[161,36],[162,37],[163,36],[164,38],[165,39],[166,40],[167,41],[168,42],[169,43],[170,44],[171,45],[62,46],[59,2],[61,2],[181,47],[172,48],[173,49],[174,50],[175,51],[176,52],[177,53],[178,54],[64,23],[65,2],[66,55],[67,56],[68,2],[69,57],[70,2],[113,58],[114,59],[115,60],[116,60],[117,61],[118,2],[119,7],[120,62],[121,59],[179,63],[180,64],[220,65],[189,2],[206,66],[204,67],[205,68],[193,69],[194,67],[201,70],[192,71],[197,72],[207,2],[198,73],[203,74],[209,75],[208,76],[191,77],[199,78],[200,79],[195,80],[202,66],[196,81],[184,82],[183,83],[190,2],[57,2],[58,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[4,2],[21,2],[25,2],[22,2],[23,2],[24,2],[26,2],[27,2],[28,2],[5,2],[29,2],[30,2],[31,2],[32,2],[6,2],[36,2],[33,2],[34,2],[35,2],[37,2],[7,2],[38,2],[43,2],[44,2],[39,2],[40,2],[41,2],[42,2],[8,2],[48,2],[45,2],[46,2],[47,2],[49,2],[9,2],[50,2],[51,2],[52,2],[55,2],[53,2],[54,2],[1,2],[56,2],[89,84],[101,85],[86,86],[102,87],[111,88],[77,89],[78,90],[76,91],[110,92],[105,93],[109,94],[80,95],[98,96],[79,97],[108,98],[74,99],[75,93],[81,100],[82,2],[88,101],[85,100],[72,102],[112,103],[103,104],[92,105],[91,100],[93,106],[96,107],[90,108],[94,109],[106,92],[83,110],[84,111],[97,112],[73,87],[100,113],[99,100],[87,111],[95,114],[104,2],[71,2],[107,115],[213,116],[210,117],[188,118],[186,119],[185,2],[187,120],[211,2],[212,121],[221,122]],"latestChangedDtsFile":"./vite.config.d.ts","version":"5.6.3"}
|
frontend/dist-ts-build/vite.config.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
declare const _default: import("vite").UserConfig;
|
| 2 |
+
export default _default;
|
frontend/dist-ts-build/vite.config.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { defineConfig } from "vite";
|
| 2 |
+
import react from "@vitejs/plugin-react";
|
| 3 |
+
import path from "node:path";
|
| 4 |
+
export default defineConfig({
|
| 5 |
+
plugins: [react()],
|
| 6 |
+
resolve: {
|
| 7 |
+
alias: {
|
| 8 |
+
"@": path.resolve(__dirname, "./src"),
|
| 9 |
+
},
|
| 10 |
+
},
|
| 11 |
+
server: {
|
| 12 |
+
port: 5173,
|
| 13 |
+
open: false,
|
| 14 |
+
},
|
| 15 |
+
});
|
frontend/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2
ADDED
|
Binary file (28.1 kB). View file
|
|
|
frontend/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff
ADDED
|
Binary file (33.5 kB). View file
|
|
|
frontend/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf
ADDED
|
Binary file (63.6 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf
ADDED
|
Binary file (12.4 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff
ADDED
|
Binary file (7.72 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2
ADDED
|
Binary file (6.91 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff
ADDED
|
Binary file (7.66 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2
ADDED
|
Binary file (6.91 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf
ADDED
|
Binary file (12.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf
ADDED
|
Binary file (19.6 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff
ADDED
|
Binary file (13.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2
ADDED
|
Binary file (11.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf
ADDED
|
Binary file (19.6 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2
ADDED
|
Binary file (11.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff
ADDED
|
Binary file (13.2 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2
ADDED
|
Binary file (25.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff
ADDED
|
Binary file (29.9 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf
ADDED
|
Binary file (51.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2
ADDED
|
Binary file (16.8 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf
ADDED
|
Binary file (33 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff
ADDED
|
Binary file (19.4 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf
ADDED
|
Binary file (33.6 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff
ADDED
|
Binary file (19.7 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2
ADDED
|
Binary file (17 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2
ADDED
|
Binary file (26.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff
ADDED
|
Binary file (30.8 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf
ADDED
|
Binary file (53.6 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf
ADDED
|
Binary file (31.2 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2
ADDED
|
Binary file (16.4 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff
ADDED
|
Binary file (18.7 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff
ADDED
|
Binary file (18.7 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf
ADDED
|
Binary file (31.3 kB). View file
|
|
|
frontend/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2
ADDED
|
Binary file (16.4 kB). View file
|
|
|
frontend/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf
ADDED
|
Binary file (24.5 kB). View file
|
|
|