soumi guria commited on
Commit
b8dbf99
·
1 Parent(s): 76e92b7
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ .env
2
+ node_modules
3
+ __pycache__
Dockerfile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY backend/requirements.txt .
6
+ RUN pip install uv && uv pip install --system --no-cache -r requirements.txt
7
+
8
+ COPY backend/ /app/backend/
9
+ COPY models.py /app/models.py
10
+
11
+ EXPOSE 8000
12
+
13
+ CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"]
backend/main.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import uuid
2
+ from typing import Dict, Any, Optional
3
+
4
+ from fastapi import FastAPI, HTTPException
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+ from pydantic import BaseModel
7
+
8
+ import sys
9
+ import os
10
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
11
+
12
+ from models import Action, Observation, generate_tasks, deterministic_grader, CLMEnvironment
13
+
14
+ app = FastAPI(title="Cognitive Load Manager (CLM) Environment API")
15
+
16
+ app.add_middleware(
17
+ CORSMiddleware,
18
+ allow_origins=["*"],
19
+ allow_credentials=True,
20
+ allow_methods=["*"],
21
+ allow_headers=["*"],
22
+ )
23
+
24
+ # In-memory session store
25
+ sessions: Dict[str, CLMEnvironment] = {}
26
+
27
+ class ResetRequest(BaseModel):
28
+ level: str = "easy" # easy, medium, hard
29
+ session_id: Optional[str] = None
30
+
31
+ class ResetResponse(BaseModel):
32
+ session_id: str
33
+ observation: Observation
34
+
35
+ class StepRequest(BaseModel):
36
+ session_id: str
37
+ action: Action
38
+
39
+ class StepResponse(BaseModel):
40
+ observation: Observation
41
+ reward: float
42
+ done: bool
43
+ info: Dict[str, Any]
44
+
45
+ @app.post("/reset", response_model=ResetResponse)
46
+ def reset_env(req: ResetRequest):
47
+ if req.level not in ["easy", "medium", "hard"]:
48
+ raise HTTPException(status_code=400, detail="Invalid level")
49
+
50
+ tasks = generate_tasks(req.level)
51
+ env = CLMEnvironment(tasks=tasks, max_steps=50) # Max 50 steps
52
+ obs = env.reset()
53
+
54
+ sess_id = req.session_id or str(uuid.uuid4())
55
+ sessions[sess_id] = env
56
+
57
+ return ResetResponse(session_id=sess_id, observation=obs)
58
+
59
+ @app.post("/step", response_model=StepResponse)
60
+ def step_env(req: StepRequest):
61
+ if req.session_id not in sessions:
62
+ raise HTTPException(status_code=404, detail="Session not found")
63
+
64
+ env = sessions[req.session_id]
65
+ obs, reward, done, info = env.step(req.action)
66
+
67
+ if done:
68
+ score = deterministic_grader(env.state.tasks, env.state.time_step, env.state.energy)
69
+ info["final_score"] = score
70
+
71
+ return StepResponse(observation=obs, reward=reward, done=done, info=info)
72
+
73
+ @app.get("/state")
74
+ def get_state(session_id: str):
75
+ if session_id not in sessions:
76
+ raise HTTPException(status_code=404, detail="Session not found")
77
+
78
+ return sessions[session_id].state_dict()
backend/requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ pydantic
baseline/inference.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ import json
4
+ from dotenv import load_dotenv
5
+
6
+ load_dotenv()
7
+
8
+ API_BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000")
9
+ HF_ROUTER_URL = os.getenv(
10
+ "HF_ROUTER_URL",
11
+ "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3-70B-Instruct"
12
+ )
13
+ HF_TOKEN = os.getenv("HF_TOKEN")
14
+
15
+ def call_hf_router(prompt: str) -> dict:
16
+ if not HF_TOKEN:
17
+ return None
18
+
19
+ headers = {
20
+ "Authorization": f"Bearer {HF_TOKEN}",
21
+ "Content-Type": "application/json"
22
+ }
23
+
24
+ payload = {
25
+ "inputs": prompt,
26
+ "parameters": {
27
+ "max_new_tokens": 150,
28
+ "temperature": 0.1,
29
+ "return_full_text": False
30
+ }
31
+ }
32
+
33
+ try:
34
+ response = requests.post(HF_ROUTER_URL, headers=headers, json=payload)
35
+ if response.status_code == 200:
36
+ result = response.json()
37
+ if isinstance(result, list) and len(result) > 0:
38
+ text = result[0].get("generated_text", "")
39
+
40
+ # Extract JSON block
41
+ start_idx = text.find("{")
42
+ end_idx = text.rfind("}")
43
+ if start_idx != -1 and end_idx != -1:
44
+ json_str = text[start_idx:end_idx+1]
45
+ return json.loads(json_str)
46
+ return None
47
+ except Exception as e:
48
+ print(f"Error calling HF Router: {e}")
49
+ return None
50
+
51
+ def run_level(level: str):
52
+ print(f"\n{'='*40}")
53
+ print(f"--- Running Level: {level.upper()} ---")
54
+ print(f"{'='*40}")
55
+
56
+ # 1. Reset Environment
57
+ res = requests.post(f"{API_BASE_URL}/reset", json={"level": level})
58
+ if res.status_code != 200:
59
+ print(f"Failed to reset: {res.text}")
60
+ return
61
+
62
+ data = res.json()
63
+ session_id = data["session_id"]
64
+ observation = data["observation"]
65
+
66
+ done = False
67
+ step = 0
68
+ total_reward = 0.0
69
+ info = {}
70
+
71
+ while not done:
72
+ step += 1
73
+ print(f"\nStep {step}")
74
+
75
+ # 2. Call LLM for next action
76
+ prompt = f"""<|begin_of_text|><|start_header_id|>system<|end_header_id|>
77
+ You are an AI agent managing tasks with deadlines under cognitive load.
78
+ Your goals: Complete all tasks efficiently, avoiding burnout and minimizing stress.
79
+ Respond ONLY with a valid JSON object representing your chosen action, with no extra text surrounding it.
80
+ <|eot_id|><|start_header_id|>user<|end_header_id|>
81
+ Current Observation:
82
+ {json.dumps(observation, indent=2)}
83
+
84
+ Available Actions:
85
+ - {{"type": "work", "task_id": "<id>"}} - work on a specific task
86
+ - {{"type": "break"}} - increases energy, decreases stress
87
+ - {{"type": "switch", "task_id": "<id>"}} - switch focus without working
88
+ - {{"type": "delay"}} - delays actions slightly reducing stress
89
+ <|eot_id|><|start_header_id|>assistant<|end_header_id|>"""
90
+
91
+ action = call_hf_router(prompt)
92
+
93
+ # Fallback heuristic logic if HF router fails or no token
94
+ if not action:
95
+ tasks = observation.get("tasks", [])
96
+ incomp = [t for t in tasks if t.get("progress", 0.0) < 1.0]
97
+ if observation.get("visible_state", {}).get("fatigue_level") == "high":
98
+ action = {"type": "break"}
99
+ elif incomp:
100
+ action = {"type": "work", "task_id": incomp[0]["id"]}
101
+ else:
102
+ action = {"type": "delay"}
103
+
104
+ print(f"Agent Action: {action}")
105
+
106
+ # 3. Step Environment
107
+ res = requests.post(f"{API_BASE_URL}/step", json={
108
+ "session_id": session_id,
109
+ "action": action
110
+ })
111
+
112
+ if res.status_code != 200:
113
+ print(f"Failed to step: {res.text}")
114
+ break
115
+
116
+ step_data = res.json()
117
+ observation = step_data["observation"]
118
+ reward = step_data["reward"]
119
+ done = step_data["done"]
120
+ info = step_data["info"]
121
+
122
+ total_reward += reward
123
+ print(f"Reward: {reward:.2f}")
124
+
125
+ print("\n--- Episode Finished ---")
126
+ print(f"Total Reward: {total_reward:.2f}")
127
+ if "final_score" in info:
128
+ print(f"Final Score (Grader): {info['final_score']:.2f}")
129
+
130
+ # Get final state
131
+ state_res = requests.get(f"{API_BASE_URL}/state", params={"session_id": session_id})
132
+ if state_res.status_code == 200:
133
+ st = state_res.json()
134
+ print(f"Final Energy: {st.get('energy', 0):.2f}, Final Stress: {st.get('stress', 0):.2f}")
135
+
136
+ if __name__ == "__main__":
137
+ if not HF_TOKEN:
138
+ print("Warning: HF_TOKEN not set. Using fallback heuristic agent.")
139
+
140
+ for level in ["easy", "medium", "hard"]:
141
+ run_level(level)
baseline/requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ openai
2
+ python-dotenv
3
+ requests
frontend/index.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>CLM Dashboard</title>
7
+ </head>
8
+ <body class="bg-slate-900 text-slate-100 font-sans">
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.jsx"></script>
11
+ </body>
12
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,2448 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "clm-frontend",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "clm-frontend",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "lucide-react": "^1.7.0",
12
+ "react": "^18.2.0",
13
+ "react-dom": "^18.2.0"
14
+ },
15
+ "devDependencies": {
16
+ "@vitejs/plugin-react": "^4.2.1",
17
+ "autoprefixer": "^10.4.16",
18
+ "postcss": "^8.4.31",
19
+ "tailwindcss": "^3.3.5",
20
+ "vite": "^5.0.0"
21
+ }
22
+ },
23
+ "node_modules/@alloc/quick-lru": {
24
+ "version": "5.2.0",
25
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
26
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
27
+ "dev": true,
28
+ "engines": {
29
+ "node": ">=10"
30
+ },
31
+ "funding": {
32
+ "url": "https://github.com/sponsors/sindresorhus"
33
+ }
34
+ },
35
+ "node_modules/@babel/code-frame": {
36
+ "version": "7.29.0",
37
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
38
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
39
+ "dev": true,
40
+ "dependencies": {
41
+ "@babel/helper-validator-identifier": "^7.28.5",
42
+ "js-tokens": "^4.0.0",
43
+ "picocolors": "^1.1.1"
44
+ },
45
+ "engines": {
46
+ "node": ">=6.9.0"
47
+ }
48
+ },
49
+ "node_modules/@babel/compat-data": {
50
+ "version": "7.29.0",
51
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
52
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
53
+ "dev": true,
54
+ "engines": {
55
+ "node": ">=6.9.0"
56
+ }
57
+ },
58
+ "node_modules/@babel/core": {
59
+ "version": "7.29.0",
60
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
61
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
62
+ "dev": true,
63
+ "dependencies": {
64
+ "@babel/code-frame": "^7.29.0",
65
+ "@babel/generator": "^7.29.0",
66
+ "@babel/helper-compilation-targets": "^7.28.6",
67
+ "@babel/helper-module-transforms": "^7.28.6",
68
+ "@babel/helpers": "^7.28.6",
69
+ "@babel/parser": "^7.29.0",
70
+ "@babel/template": "^7.28.6",
71
+ "@babel/traverse": "^7.29.0",
72
+ "@babel/types": "^7.29.0",
73
+ "@jridgewell/remapping": "^2.3.5",
74
+ "convert-source-map": "^2.0.0",
75
+ "debug": "^4.1.0",
76
+ "gensync": "^1.0.0-beta.2",
77
+ "json5": "^2.2.3",
78
+ "semver": "^6.3.1"
79
+ },
80
+ "engines": {
81
+ "node": ">=6.9.0"
82
+ },
83
+ "funding": {
84
+ "type": "opencollective",
85
+ "url": "https://opencollective.com/babel"
86
+ }
87
+ },
88
+ "node_modules/@babel/generator": {
89
+ "version": "7.29.1",
90
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
91
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
92
+ "dev": true,
93
+ "dependencies": {
94
+ "@babel/parser": "^7.29.0",
95
+ "@babel/types": "^7.29.0",
96
+ "@jridgewell/gen-mapping": "^0.3.12",
97
+ "@jridgewell/trace-mapping": "^0.3.28",
98
+ "jsesc": "^3.0.2"
99
+ },
100
+ "engines": {
101
+ "node": ">=6.9.0"
102
+ }
103
+ },
104
+ "node_modules/@babel/helper-compilation-targets": {
105
+ "version": "7.28.6",
106
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
107
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
108
+ "dev": true,
109
+ "dependencies": {
110
+ "@babel/compat-data": "^7.28.6",
111
+ "@babel/helper-validator-option": "^7.27.1",
112
+ "browserslist": "^4.24.0",
113
+ "lru-cache": "^5.1.1",
114
+ "semver": "^6.3.1"
115
+ },
116
+ "engines": {
117
+ "node": ">=6.9.0"
118
+ }
119
+ },
120
+ "node_modules/@babel/helper-globals": {
121
+ "version": "7.28.0",
122
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
123
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
124
+ "dev": true,
125
+ "engines": {
126
+ "node": ">=6.9.0"
127
+ }
128
+ },
129
+ "node_modules/@babel/helper-module-imports": {
130
+ "version": "7.28.6",
131
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
132
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
133
+ "dev": true,
134
+ "dependencies": {
135
+ "@babel/traverse": "^7.28.6",
136
+ "@babel/types": "^7.28.6"
137
+ },
138
+ "engines": {
139
+ "node": ">=6.9.0"
140
+ }
141
+ },
142
+ "node_modules/@babel/helper-module-transforms": {
143
+ "version": "7.28.6",
144
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
145
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
146
+ "dev": true,
147
+ "dependencies": {
148
+ "@babel/helper-module-imports": "^7.28.6",
149
+ "@babel/helper-validator-identifier": "^7.28.5",
150
+ "@babel/traverse": "^7.28.6"
151
+ },
152
+ "engines": {
153
+ "node": ">=6.9.0"
154
+ },
155
+ "peerDependencies": {
156
+ "@babel/core": "^7.0.0"
157
+ }
158
+ },
159
+ "node_modules/@babel/helper-plugin-utils": {
160
+ "version": "7.28.6",
161
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
162
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
163
+ "dev": true,
164
+ "engines": {
165
+ "node": ">=6.9.0"
166
+ }
167
+ },
168
+ "node_modules/@babel/helper-string-parser": {
169
+ "version": "7.27.1",
170
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
171
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
172
+ "dev": true,
173
+ "engines": {
174
+ "node": ">=6.9.0"
175
+ }
176
+ },
177
+ "node_modules/@babel/helper-validator-identifier": {
178
+ "version": "7.28.5",
179
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
180
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
181
+ "dev": true,
182
+ "engines": {
183
+ "node": ">=6.9.0"
184
+ }
185
+ },
186
+ "node_modules/@babel/helper-validator-option": {
187
+ "version": "7.27.1",
188
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
189
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
190
+ "dev": true,
191
+ "engines": {
192
+ "node": ">=6.9.0"
193
+ }
194
+ },
195
+ "node_modules/@babel/helpers": {
196
+ "version": "7.29.2",
197
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
198
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
199
+ "dev": true,
200
+ "dependencies": {
201
+ "@babel/template": "^7.28.6",
202
+ "@babel/types": "^7.29.0"
203
+ },
204
+ "engines": {
205
+ "node": ">=6.9.0"
206
+ }
207
+ },
208
+ "node_modules/@babel/parser": {
209
+ "version": "7.29.2",
210
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
211
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
212
+ "dev": true,
213
+ "dependencies": {
214
+ "@babel/types": "^7.29.0"
215
+ },
216
+ "bin": {
217
+ "parser": "bin/babel-parser.js"
218
+ },
219
+ "engines": {
220
+ "node": ">=6.0.0"
221
+ }
222
+ },
223
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
224
+ "version": "7.27.1",
225
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
226
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
227
+ "dev": true,
228
+ "dependencies": {
229
+ "@babel/helper-plugin-utils": "^7.27.1"
230
+ },
231
+ "engines": {
232
+ "node": ">=6.9.0"
233
+ },
234
+ "peerDependencies": {
235
+ "@babel/core": "^7.0.0-0"
236
+ }
237
+ },
238
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
239
+ "version": "7.27.1",
240
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
241
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
242
+ "dev": true,
243
+ "dependencies": {
244
+ "@babel/helper-plugin-utils": "^7.27.1"
245
+ },
246
+ "engines": {
247
+ "node": ">=6.9.0"
248
+ },
249
+ "peerDependencies": {
250
+ "@babel/core": "^7.0.0-0"
251
+ }
252
+ },
253
+ "node_modules/@babel/template": {
254
+ "version": "7.28.6",
255
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
256
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
257
+ "dev": true,
258
+ "dependencies": {
259
+ "@babel/code-frame": "^7.28.6",
260
+ "@babel/parser": "^7.28.6",
261
+ "@babel/types": "^7.28.6"
262
+ },
263
+ "engines": {
264
+ "node": ">=6.9.0"
265
+ }
266
+ },
267
+ "node_modules/@babel/traverse": {
268
+ "version": "7.29.0",
269
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
270
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
271
+ "dev": true,
272
+ "dependencies": {
273
+ "@babel/code-frame": "^7.29.0",
274
+ "@babel/generator": "^7.29.0",
275
+ "@babel/helper-globals": "^7.28.0",
276
+ "@babel/parser": "^7.29.0",
277
+ "@babel/template": "^7.28.6",
278
+ "@babel/types": "^7.29.0",
279
+ "debug": "^4.3.1"
280
+ },
281
+ "engines": {
282
+ "node": ">=6.9.0"
283
+ }
284
+ },
285
+ "node_modules/@babel/types": {
286
+ "version": "7.29.0",
287
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
288
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
289
+ "dev": true,
290
+ "dependencies": {
291
+ "@babel/helper-string-parser": "^7.27.1",
292
+ "@babel/helper-validator-identifier": "^7.28.5"
293
+ },
294
+ "engines": {
295
+ "node": ">=6.9.0"
296
+ }
297
+ },
298
+ "node_modules/@esbuild/aix-ppc64": {
299
+ "version": "0.21.5",
300
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
301
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
302
+ "cpu": [
303
+ "ppc64"
304
+ ],
305
+ "dev": true,
306
+ "optional": true,
307
+ "os": [
308
+ "aix"
309
+ ],
310
+ "engines": {
311
+ "node": ">=12"
312
+ }
313
+ },
314
+ "node_modules/@esbuild/android-arm": {
315
+ "version": "0.21.5",
316
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
317
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
318
+ "cpu": [
319
+ "arm"
320
+ ],
321
+ "dev": true,
322
+ "optional": true,
323
+ "os": [
324
+ "android"
325
+ ],
326
+ "engines": {
327
+ "node": ">=12"
328
+ }
329
+ },
330
+ "node_modules/@esbuild/android-arm64": {
331
+ "version": "0.21.5",
332
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
333
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
334
+ "cpu": [
335
+ "arm64"
336
+ ],
337
+ "dev": true,
338
+ "optional": true,
339
+ "os": [
340
+ "android"
341
+ ],
342
+ "engines": {
343
+ "node": ">=12"
344
+ }
345
+ },
346
+ "node_modules/@esbuild/android-x64": {
347
+ "version": "0.21.5",
348
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
349
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
350
+ "cpu": [
351
+ "x64"
352
+ ],
353
+ "dev": true,
354
+ "optional": true,
355
+ "os": [
356
+ "android"
357
+ ],
358
+ "engines": {
359
+ "node": ">=12"
360
+ }
361
+ },
362
+ "node_modules/@esbuild/darwin-arm64": {
363
+ "version": "0.21.5",
364
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
365
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
366
+ "cpu": [
367
+ "arm64"
368
+ ],
369
+ "dev": true,
370
+ "optional": true,
371
+ "os": [
372
+ "darwin"
373
+ ],
374
+ "engines": {
375
+ "node": ">=12"
376
+ }
377
+ },
378
+ "node_modules/@esbuild/darwin-x64": {
379
+ "version": "0.21.5",
380
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
381
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
382
+ "cpu": [
383
+ "x64"
384
+ ],
385
+ "dev": true,
386
+ "optional": true,
387
+ "os": [
388
+ "darwin"
389
+ ],
390
+ "engines": {
391
+ "node": ">=12"
392
+ }
393
+ },
394
+ "node_modules/@esbuild/freebsd-arm64": {
395
+ "version": "0.21.5",
396
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
397
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
398
+ "cpu": [
399
+ "arm64"
400
+ ],
401
+ "dev": true,
402
+ "optional": true,
403
+ "os": [
404
+ "freebsd"
405
+ ],
406
+ "engines": {
407
+ "node": ">=12"
408
+ }
409
+ },
410
+ "node_modules/@esbuild/freebsd-x64": {
411
+ "version": "0.21.5",
412
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
413
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
414
+ "cpu": [
415
+ "x64"
416
+ ],
417
+ "dev": true,
418
+ "optional": true,
419
+ "os": [
420
+ "freebsd"
421
+ ],
422
+ "engines": {
423
+ "node": ">=12"
424
+ }
425
+ },
426
+ "node_modules/@esbuild/linux-arm": {
427
+ "version": "0.21.5",
428
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
429
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
430
+ "cpu": [
431
+ "arm"
432
+ ],
433
+ "dev": true,
434
+ "optional": true,
435
+ "os": [
436
+ "linux"
437
+ ],
438
+ "engines": {
439
+ "node": ">=12"
440
+ }
441
+ },
442
+ "node_modules/@esbuild/linux-arm64": {
443
+ "version": "0.21.5",
444
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
445
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
446
+ "cpu": [
447
+ "arm64"
448
+ ],
449
+ "dev": true,
450
+ "optional": true,
451
+ "os": [
452
+ "linux"
453
+ ],
454
+ "engines": {
455
+ "node": ">=12"
456
+ }
457
+ },
458
+ "node_modules/@esbuild/linux-ia32": {
459
+ "version": "0.21.5",
460
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
461
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
462
+ "cpu": [
463
+ "ia32"
464
+ ],
465
+ "dev": true,
466
+ "optional": true,
467
+ "os": [
468
+ "linux"
469
+ ],
470
+ "engines": {
471
+ "node": ">=12"
472
+ }
473
+ },
474
+ "node_modules/@esbuild/linux-loong64": {
475
+ "version": "0.21.5",
476
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
477
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
478
+ "cpu": [
479
+ "loong64"
480
+ ],
481
+ "dev": true,
482
+ "optional": true,
483
+ "os": [
484
+ "linux"
485
+ ],
486
+ "engines": {
487
+ "node": ">=12"
488
+ }
489
+ },
490
+ "node_modules/@esbuild/linux-mips64el": {
491
+ "version": "0.21.5",
492
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
493
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
494
+ "cpu": [
495
+ "mips64el"
496
+ ],
497
+ "dev": true,
498
+ "optional": true,
499
+ "os": [
500
+ "linux"
501
+ ],
502
+ "engines": {
503
+ "node": ">=12"
504
+ }
505
+ },
506
+ "node_modules/@esbuild/linux-ppc64": {
507
+ "version": "0.21.5",
508
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
509
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
510
+ "cpu": [
511
+ "ppc64"
512
+ ],
513
+ "dev": true,
514
+ "optional": true,
515
+ "os": [
516
+ "linux"
517
+ ],
518
+ "engines": {
519
+ "node": ">=12"
520
+ }
521
+ },
522
+ "node_modules/@esbuild/linux-riscv64": {
523
+ "version": "0.21.5",
524
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
525
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
526
+ "cpu": [
527
+ "riscv64"
528
+ ],
529
+ "dev": true,
530
+ "optional": true,
531
+ "os": [
532
+ "linux"
533
+ ],
534
+ "engines": {
535
+ "node": ">=12"
536
+ }
537
+ },
538
+ "node_modules/@esbuild/linux-s390x": {
539
+ "version": "0.21.5",
540
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
541
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
542
+ "cpu": [
543
+ "s390x"
544
+ ],
545
+ "dev": true,
546
+ "optional": true,
547
+ "os": [
548
+ "linux"
549
+ ],
550
+ "engines": {
551
+ "node": ">=12"
552
+ }
553
+ },
554
+ "node_modules/@esbuild/linux-x64": {
555
+ "version": "0.21.5",
556
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
557
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
558
+ "cpu": [
559
+ "x64"
560
+ ],
561
+ "dev": true,
562
+ "optional": true,
563
+ "os": [
564
+ "linux"
565
+ ],
566
+ "engines": {
567
+ "node": ">=12"
568
+ }
569
+ },
570
+ "node_modules/@esbuild/netbsd-x64": {
571
+ "version": "0.21.5",
572
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
573
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
574
+ "cpu": [
575
+ "x64"
576
+ ],
577
+ "dev": true,
578
+ "optional": true,
579
+ "os": [
580
+ "netbsd"
581
+ ],
582
+ "engines": {
583
+ "node": ">=12"
584
+ }
585
+ },
586
+ "node_modules/@esbuild/openbsd-x64": {
587
+ "version": "0.21.5",
588
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
589
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
590
+ "cpu": [
591
+ "x64"
592
+ ],
593
+ "dev": true,
594
+ "optional": true,
595
+ "os": [
596
+ "openbsd"
597
+ ],
598
+ "engines": {
599
+ "node": ">=12"
600
+ }
601
+ },
602
+ "node_modules/@esbuild/sunos-x64": {
603
+ "version": "0.21.5",
604
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
605
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
606
+ "cpu": [
607
+ "x64"
608
+ ],
609
+ "dev": true,
610
+ "optional": true,
611
+ "os": [
612
+ "sunos"
613
+ ],
614
+ "engines": {
615
+ "node": ">=12"
616
+ }
617
+ },
618
+ "node_modules/@esbuild/win32-arm64": {
619
+ "version": "0.21.5",
620
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
621
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
622
+ "cpu": [
623
+ "arm64"
624
+ ],
625
+ "dev": true,
626
+ "optional": true,
627
+ "os": [
628
+ "win32"
629
+ ],
630
+ "engines": {
631
+ "node": ">=12"
632
+ }
633
+ },
634
+ "node_modules/@esbuild/win32-ia32": {
635
+ "version": "0.21.5",
636
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
637
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
638
+ "cpu": [
639
+ "ia32"
640
+ ],
641
+ "dev": true,
642
+ "optional": true,
643
+ "os": [
644
+ "win32"
645
+ ],
646
+ "engines": {
647
+ "node": ">=12"
648
+ }
649
+ },
650
+ "node_modules/@esbuild/win32-x64": {
651
+ "version": "0.21.5",
652
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
653
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
654
+ "cpu": [
655
+ "x64"
656
+ ],
657
+ "dev": true,
658
+ "optional": true,
659
+ "os": [
660
+ "win32"
661
+ ],
662
+ "engines": {
663
+ "node": ">=12"
664
+ }
665
+ },
666
+ "node_modules/@jridgewell/gen-mapping": {
667
+ "version": "0.3.13",
668
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
669
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
670
+ "dev": true,
671
+ "dependencies": {
672
+ "@jridgewell/sourcemap-codec": "^1.5.0",
673
+ "@jridgewell/trace-mapping": "^0.3.24"
674
+ }
675
+ },
676
+ "node_modules/@jridgewell/remapping": {
677
+ "version": "2.3.5",
678
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
679
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
680
+ "dev": true,
681
+ "dependencies": {
682
+ "@jridgewell/gen-mapping": "^0.3.5",
683
+ "@jridgewell/trace-mapping": "^0.3.24"
684
+ }
685
+ },
686
+ "node_modules/@jridgewell/resolve-uri": {
687
+ "version": "3.1.2",
688
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
689
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
690
+ "dev": true,
691
+ "engines": {
692
+ "node": ">=6.0.0"
693
+ }
694
+ },
695
+ "node_modules/@jridgewell/sourcemap-codec": {
696
+ "version": "1.5.5",
697
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
698
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
699
+ "dev": true
700
+ },
701
+ "node_modules/@jridgewell/trace-mapping": {
702
+ "version": "0.3.31",
703
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
704
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
705
+ "dev": true,
706
+ "dependencies": {
707
+ "@jridgewell/resolve-uri": "^3.1.0",
708
+ "@jridgewell/sourcemap-codec": "^1.4.14"
709
+ }
710
+ },
711
+ "node_modules/@nodelib/fs.scandir": {
712
+ "version": "2.1.5",
713
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
714
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
715
+ "dev": true,
716
+ "dependencies": {
717
+ "@nodelib/fs.stat": "2.0.5",
718
+ "run-parallel": "^1.1.9"
719
+ },
720
+ "engines": {
721
+ "node": ">= 8"
722
+ }
723
+ },
724
+ "node_modules/@nodelib/fs.stat": {
725
+ "version": "2.0.5",
726
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
727
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
728
+ "dev": true,
729
+ "engines": {
730
+ "node": ">= 8"
731
+ }
732
+ },
733
+ "node_modules/@nodelib/fs.walk": {
734
+ "version": "1.2.8",
735
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
736
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
737
+ "dev": true,
738
+ "dependencies": {
739
+ "@nodelib/fs.scandir": "2.1.5",
740
+ "fastq": "^1.6.0"
741
+ },
742
+ "engines": {
743
+ "node": ">= 8"
744
+ }
745
+ },
746
+ "node_modules/@rolldown/pluginutils": {
747
+ "version": "1.0.0-beta.27",
748
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
749
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
750
+ "dev": true
751
+ },
752
+ "node_modules/@rollup/rollup-android-arm-eabi": {
753
+ "version": "4.60.0",
754
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz",
755
+ "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==",
756
+ "cpu": [
757
+ "arm"
758
+ ],
759
+ "dev": true,
760
+ "optional": true,
761
+ "os": [
762
+ "android"
763
+ ]
764
+ },
765
+ "node_modules/@rollup/rollup-android-arm64": {
766
+ "version": "4.60.0",
767
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz",
768
+ "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==",
769
+ "cpu": [
770
+ "arm64"
771
+ ],
772
+ "dev": true,
773
+ "optional": true,
774
+ "os": [
775
+ "android"
776
+ ]
777
+ },
778
+ "node_modules/@rollup/rollup-darwin-arm64": {
779
+ "version": "4.60.0",
780
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz",
781
+ "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==",
782
+ "cpu": [
783
+ "arm64"
784
+ ],
785
+ "dev": true,
786
+ "optional": true,
787
+ "os": [
788
+ "darwin"
789
+ ]
790
+ },
791
+ "node_modules/@rollup/rollup-darwin-x64": {
792
+ "version": "4.60.0",
793
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz",
794
+ "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==",
795
+ "cpu": [
796
+ "x64"
797
+ ],
798
+ "dev": true,
799
+ "optional": true,
800
+ "os": [
801
+ "darwin"
802
+ ]
803
+ },
804
+ "node_modules/@rollup/rollup-freebsd-arm64": {
805
+ "version": "4.60.0",
806
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz",
807
+ "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==",
808
+ "cpu": [
809
+ "arm64"
810
+ ],
811
+ "dev": true,
812
+ "optional": true,
813
+ "os": [
814
+ "freebsd"
815
+ ]
816
+ },
817
+ "node_modules/@rollup/rollup-freebsd-x64": {
818
+ "version": "4.60.0",
819
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz",
820
+ "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==",
821
+ "cpu": [
822
+ "x64"
823
+ ],
824
+ "dev": true,
825
+ "optional": true,
826
+ "os": [
827
+ "freebsd"
828
+ ]
829
+ },
830
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
831
+ "version": "4.60.0",
832
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz",
833
+ "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==",
834
+ "cpu": [
835
+ "arm"
836
+ ],
837
+ "dev": true,
838
+ "optional": true,
839
+ "os": [
840
+ "linux"
841
+ ]
842
+ },
843
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
844
+ "version": "4.60.0",
845
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz",
846
+ "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==",
847
+ "cpu": [
848
+ "arm"
849
+ ],
850
+ "dev": true,
851
+ "optional": true,
852
+ "os": [
853
+ "linux"
854
+ ]
855
+ },
856
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
857
+ "version": "4.60.0",
858
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz",
859
+ "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==",
860
+ "cpu": [
861
+ "arm64"
862
+ ],
863
+ "dev": true,
864
+ "optional": true,
865
+ "os": [
866
+ "linux"
867
+ ]
868
+ },
869
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
870
+ "version": "4.60.0",
871
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz",
872
+ "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==",
873
+ "cpu": [
874
+ "arm64"
875
+ ],
876
+ "dev": true,
877
+ "optional": true,
878
+ "os": [
879
+ "linux"
880
+ ]
881
+ },
882
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
883
+ "version": "4.60.0",
884
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz",
885
+ "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==",
886
+ "cpu": [
887
+ "loong64"
888
+ ],
889
+ "dev": true,
890
+ "optional": true,
891
+ "os": [
892
+ "linux"
893
+ ]
894
+ },
895
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
896
+ "version": "4.60.0",
897
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz",
898
+ "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==",
899
+ "cpu": [
900
+ "loong64"
901
+ ],
902
+ "dev": true,
903
+ "optional": true,
904
+ "os": [
905
+ "linux"
906
+ ]
907
+ },
908
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
909
+ "version": "4.60.0",
910
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz",
911
+ "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==",
912
+ "cpu": [
913
+ "ppc64"
914
+ ],
915
+ "dev": true,
916
+ "optional": true,
917
+ "os": [
918
+ "linux"
919
+ ]
920
+ },
921
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
922
+ "version": "4.60.0",
923
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz",
924
+ "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==",
925
+ "cpu": [
926
+ "ppc64"
927
+ ],
928
+ "dev": true,
929
+ "optional": true,
930
+ "os": [
931
+ "linux"
932
+ ]
933
+ },
934
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
935
+ "version": "4.60.0",
936
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz",
937
+ "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==",
938
+ "cpu": [
939
+ "riscv64"
940
+ ],
941
+ "dev": true,
942
+ "optional": true,
943
+ "os": [
944
+ "linux"
945
+ ]
946
+ },
947
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
948
+ "version": "4.60.0",
949
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz",
950
+ "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==",
951
+ "cpu": [
952
+ "riscv64"
953
+ ],
954
+ "dev": true,
955
+ "optional": true,
956
+ "os": [
957
+ "linux"
958
+ ]
959
+ },
960
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
961
+ "version": "4.60.0",
962
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz",
963
+ "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==",
964
+ "cpu": [
965
+ "s390x"
966
+ ],
967
+ "dev": true,
968
+ "optional": true,
969
+ "os": [
970
+ "linux"
971
+ ]
972
+ },
973
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
974
+ "version": "4.60.0",
975
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz",
976
+ "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==",
977
+ "cpu": [
978
+ "x64"
979
+ ],
980
+ "dev": true,
981
+ "optional": true,
982
+ "os": [
983
+ "linux"
984
+ ]
985
+ },
986
+ "node_modules/@rollup/rollup-linux-x64-musl": {
987
+ "version": "4.60.0",
988
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz",
989
+ "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==",
990
+ "cpu": [
991
+ "x64"
992
+ ],
993
+ "dev": true,
994
+ "optional": true,
995
+ "os": [
996
+ "linux"
997
+ ]
998
+ },
999
+ "node_modules/@rollup/rollup-openbsd-x64": {
1000
+ "version": "4.60.0",
1001
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz",
1002
+ "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==",
1003
+ "cpu": [
1004
+ "x64"
1005
+ ],
1006
+ "dev": true,
1007
+ "optional": true,
1008
+ "os": [
1009
+ "openbsd"
1010
+ ]
1011
+ },
1012
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1013
+ "version": "4.60.0",
1014
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz",
1015
+ "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==",
1016
+ "cpu": [
1017
+ "arm64"
1018
+ ],
1019
+ "dev": true,
1020
+ "optional": true,
1021
+ "os": [
1022
+ "openharmony"
1023
+ ]
1024
+ },
1025
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1026
+ "version": "4.60.0",
1027
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz",
1028
+ "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==",
1029
+ "cpu": [
1030
+ "arm64"
1031
+ ],
1032
+ "dev": true,
1033
+ "optional": true,
1034
+ "os": [
1035
+ "win32"
1036
+ ]
1037
+ },
1038
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1039
+ "version": "4.60.0",
1040
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz",
1041
+ "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==",
1042
+ "cpu": [
1043
+ "ia32"
1044
+ ],
1045
+ "dev": true,
1046
+ "optional": true,
1047
+ "os": [
1048
+ "win32"
1049
+ ]
1050
+ },
1051
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1052
+ "version": "4.60.0",
1053
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz",
1054
+ "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==",
1055
+ "cpu": [
1056
+ "x64"
1057
+ ],
1058
+ "dev": true,
1059
+ "optional": true,
1060
+ "os": [
1061
+ "win32"
1062
+ ]
1063
+ },
1064
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1065
+ "version": "4.60.0",
1066
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz",
1067
+ "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==",
1068
+ "cpu": [
1069
+ "x64"
1070
+ ],
1071
+ "dev": true,
1072
+ "optional": true,
1073
+ "os": [
1074
+ "win32"
1075
+ ]
1076
+ },
1077
+ "node_modules/@types/babel__core": {
1078
+ "version": "7.20.5",
1079
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1080
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1081
+ "dev": true,
1082
+ "dependencies": {
1083
+ "@babel/parser": "^7.20.7",
1084
+ "@babel/types": "^7.20.7",
1085
+ "@types/babel__generator": "*",
1086
+ "@types/babel__template": "*",
1087
+ "@types/babel__traverse": "*"
1088
+ }
1089
+ },
1090
+ "node_modules/@types/babel__generator": {
1091
+ "version": "7.27.0",
1092
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1093
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1094
+ "dev": true,
1095
+ "dependencies": {
1096
+ "@babel/types": "^7.0.0"
1097
+ }
1098
+ },
1099
+ "node_modules/@types/babel__template": {
1100
+ "version": "7.4.4",
1101
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1102
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1103
+ "dev": true,
1104
+ "dependencies": {
1105
+ "@babel/parser": "^7.1.0",
1106
+ "@babel/types": "^7.0.0"
1107
+ }
1108
+ },
1109
+ "node_modules/@types/babel__traverse": {
1110
+ "version": "7.28.0",
1111
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1112
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1113
+ "dev": true,
1114
+ "dependencies": {
1115
+ "@babel/types": "^7.28.2"
1116
+ }
1117
+ },
1118
+ "node_modules/@types/estree": {
1119
+ "version": "1.0.8",
1120
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1121
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1122
+ "dev": true
1123
+ },
1124
+ "node_modules/@vitejs/plugin-react": {
1125
+ "version": "4.7.0",
1126
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1127
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1128
+ "dev": true,
1129
+ "dependencies": {
1130
+ "@babel/core": "^7.28.0",
1131
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1132
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1133
+ "@rolldown/pluginutils": "1.0.0-beta.27",
1134
+ "@types/babel__core": "^7.20.5",
1135
+ "react-refresh": "^0.17.0"
1136
+ },
1137
+ "engines": {
1138
+ "node": "^14.18.0 || >=16.0.0"
1139
+ },
1140
+ "peerDependencies": {
1141
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1142
+ }
1143
+ },
1144
+ "node_modules/any-promise": {
1145
+ "version": "1.3.0",
1146
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1147
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1148
+ "dev": true
1149
+ },
1150
+ "node_modules/anymatch": {
1151
+ "version": "3.1.3",
1152
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1153
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1154
+ "dev": true,
1155
+ "dependencies": {
1156
+ "normalize-path": "^3.0.0",
1157
+ "picomatch": "^2.0.4"
1158
+ },
1159
+ "engines": {
1160
+ "node": ">= 8"
1161
+ }
1162
+ },
1163
+ "node_modules/arg": {
1164
+ "version": "5.0.2",
1165
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1166
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1167
+ "dev": true
1168
+ },
1169
+ "node_modules/autoprefixer": {
1170
+ "version": "10.4.27",
1171
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz",
1172
+ "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==",
1173
+ "dev": true,
1174
+ "funding": [
1175
+ {
1176
+ "type": "opencollective",
1177
+ "url": "https://opencollective.com/postcss/"
1178
+ },
1179
+ {
1180
+ "type": "tidelift",
1181
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1182
+ },
1183
+ {
1184
+ "type": "github",
1185
+ "url": "https://github.com/sponsors/ai"
1186
+ }
1187
+ ],
1188
+ "dependencies": {
1189
+ "browserslist": "^4.28.1",
1190
+ "caniuse-lite": "^1.0.30001774",
1191
+ "fraction.js": "^5.3.4",
1192
+ "picocolors": "^1.1.1",
1193
+ "postcss-value-parser": "^4.2.0"
1194
+ },
1195
+ "bin": {
1196
+ "autoprefixer": "bin/autoprefixer"
1197
+ },
1198
+ "engines": {
1199
+ "node": "^10 || ^12 || >=14"
1200
+ },
1201
+ "peerDependencies": {
1202
+ "postcss": "^8.1.0"
1203
+ }
1204
+ },
1205
+ "node_modules/baseline-browser-mapping": {
1206
+ "version": "2.10.12",
1207
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz",
1208
+ "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==",
1209
+ "dev": true,
1210
+ "bin": {
1211
+ "baseline-browser-mapping": "dist/cli.cjs"
1212
+ },
1213
+ "engines": {
1214
+ "node": ">=6.0.0"
1215
+ }
1216
+ },
1217
+ "node_modules/binary-extensions": {
1218
+ "version": "2.3.0",
1219
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1220
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1221
+ "dev": true,
1222
+ "engines": {
1223
+ "node": ">=8"
1224
+ },
1225
+ "funding": {
1226
+ "url": "https://github.com/sponsors/sindresorhus"
1227
+ }
1228
+ },
1229
+ "node_modules/braces": {
1230
+ "version": "3.0.3",
1231
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1232
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1233
+ "dev": true,
1234
+ "dependencies": {
1235
+ "fill-range": "^7.1.1"
1236
+ },
1237
+ "engines": {
1238
+ "node": ">=8"
1239
+ }
1240
+ },
1241
+ "node_modules/browserslist": {
1242
+ "version": "4.28.1",
1243
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
1244
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
1245
+ "dev": true,
1246
+ "funding": [
1247
+ {
1248
+ "type": "opencollective",
1249
+ "url": "https://opencollective.com/browserslist"
1250
+ },
1251
+ {
1252
+ "type": "tidelift",
1253
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1254
+ },
1255
+ {
1256
+ "type": "github",
1257
+ "url": "https://github.com/sponsors/ai"
1258
+ }
1259
+ ],
1260
+ "dependencies": {
1261
+ "baseline-browser-mapping": "^2.9.0",
1262
+ "caniuse-lite": "^1.0.30001759",
1263
+ "electron-to-chromium": "^1.5.263",
1264
+ "node-releases": "^2.0.27",
1265
+ "update-browserslist-db": "^1.2.0"
1266
+ },
1267
+ "bin": {
1268
+ "browserslist": "cli.js"
1269
+ },
1270
+ "engines": {
1271
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1272
+ }
1273
+ },
1274
+ "node_modules/camelcase-css": {
1275
+ "version": "2.0.1",
1276
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1277
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1278
+ "dev": true,
1279
+ "engines": {
1280
+ "node": ">= 6"
1281
+ }
1282
+ },
1283
+ "node_modules/caniuse-lite": {
1284
+ "version": "1.0.30001782",
1285
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz",
1286
+ "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==",
1287
+ "dev": true,
1288
+ "funding": [
1289
+ {
1290
+ "type": "opencollective",
1291
+ "url": "https://opencollective.com/browserslist"
1292
+ },
1293
+ {
1294
+ "type": "tidelift",
1295
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1296
+ },
1297
+ {
1298
+ "type": "github",
1299
+ "url": "https://github.com/sponsors/ai"
1300
+ }
1301
+ ]
1302
+ },
1303
+ "node_modules/chokidar": {
1304
+ "version": "3.6.0",
1305
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1306
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1307
+ "dev": true,
1308
+ "dependencies": {
1309
+ "anymatch": "~3.1.2",
1310
+ "braces": "~3.0.2",
1311
+ "glob-parent": "~5.1.2",
1312
+ "is-binary-path": "~2.1.0",
1313
+ "is-glob": "~4.0.1",
1314
+ "normalize-path": "~3.0.0",
1315
+ "readdirp": "~3.6.0"
1316
+ },
1317
+ "engines": {
1318
+ "node": ">= 8.10.0"
1319
+ },
1320
+ "funding": {
1321
+ "url": "https://paulmillr.com/funding/"
1322
+ },
1323
+ "optionalDependencies": {
1324
+ "fsevents": "~2.3.2"
1325
+ }
1326
+ },
1327
+ "node_modules/chokidar/node_modules/glob-parent": {
1328
+ "version": "5.1.2",
1329
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1330
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1331
+ "dev": true,
1332
+ "dependencies": {
1333
+ "is-glob": "^4.0.1"
1334
+ },
1335
+ "engines": {
1336
+ "node": ">= 6"
1337
+ }
1338
+ },
1339
+ "node_modules/commander": {
1340
+ "version": "4.1.1",
1341
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1342
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1343
+ "dev": true,
1344
+ "engines": {
1345
+ "node": ">= 6"
1346
+ }
1347
+ },
1348
+ "node_modules/convert-source-map": {
1349
+ "version": "2.0.0",
1350
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1351
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1352
+ "dev": true
1353
+ },
1354
+ "node_modules/cssesc": {
1355
+ "version": "3.0.0",
1356
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1357
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1358
+ "dev": true,
1359
+ "bin": {
1360
+ "cssesc": "bin/cssesc"
1361
+ },
1362
+ "engines": {
1363
+ "node": ">=4"
1364
+ }
1365
+ },
1366
+ "node_modules/debug": {
1367
+ "version": "4.4.3",
1368
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1369
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1370
+ "dev": true,
1371
+ "dependencies": {
1372
+ "ms": "^2.1.3"
1373
+ },
1374
+ "engines": {
1375
+ "node": ">=6.0"
1376
+ },
1377
+ "peerDependenciesMeta": {
1378
+ "supports-color": {
1379
+ "optional": true
1380
+ }
1381
+ }
1382
+ },
1383
+ "node_modules/didyoumean": {
1384
+ "version": "1.2.2",
1385
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1386
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1387
+ "dev": true
1388
+ },
1389
+ "node_modules/dlv": {
1390
+ "version": "1.1.3",
1391
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1392
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1393
+ "dev": true
1394
+ },
1395
+ "node_modules/electron-to-chromium": {
1396
+ "version": "1.5.328",
1397
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz",
1398
+ "integrity": "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==",
1399
+ "dev": true
1400
+ },
1401
+ "node_modules/esbuild": {
1402
+ "version": "0.21.5",
1403
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1404
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1405
+ "dev": true,
1406
+ "hasInstallScript": true,
1407
+ "bin": {
1408
+ "esbuild": "bin/esbuild"
1409
+ },
1410
+ "engines": {
1411
+ "node": ">=12"
1412
+ },
1413
+ "optionalDependencies": {
1414
+ "@esbuild/aix-ppc64": "0.21.5",
1415
+ "@esbuild/android-arm": "0.21.5",
1416
+ "@esbuild/android-arm64": "0.21.5",
1417
+ "@esbuild/android-x64": "0.21.5",
1418
+ "@esbuild/darwin-arm64": "0.21.5",
1419
+ "@esbuild/darwin-x64": "0.21.5",
1420
+ "@esbuild/freebsd-arm64": "0.21.5",
1421
+ "@esbuild/freebsd-x64": "0.21.5",
1422
+ "@esbuild/linux-arm": "0.21.5",
1423
+ "@esbuild/linux-arm64": "0.21.5",
1424
+ "@esbuild/linux-ia32": "0.21.5",
1425
+ "@esbuild/linux-loong64": "0.21.5",
1426
+ "@esbuild/linux-mips64el": "0.21.5",
1427
+ "@esbuild/linux-ppc64": "0.21.5",
1428
+ "@esbuild/linux-riscv64": "0.21.5",
1429
+ "@esbuild/linux-s390x": "0.21.5",
1430
+ "@esbuild/linux-x64": "0.21.5",
1431
+ "@esbuild/netbsd-x64": "0.21.5",
1432
+ "@esbuild/openbsd-x64": "0.21.5",
1433
+ "@esbuild/sunos-x64": "0.21.5",
1434
+ "@esbuild/win32-arm64": "0.21.5",
1435
+ "@esbuild/win32-ia32": "0.21.5",
1436
+ "@esbuild/win32-x64": "0.21.5"
1437
+ }
1438
+ },
1439
+ "node_modules/escalade": {
1440
+ "version": "3.2.0",
1441
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1442
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1443
+ "dev": true,
1444
+ "engines": {
1445
+ "node": ">=6"
1446
+ }
1447
+ },
1448
+ "node_modules/fast-glob": {
1449
+ "version": "3.3.3",
1450
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1451
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1452
+ "dev": true,
1453
+ "dependencies": {
1454
+ "@nodelib/fs.stat": "^2.0.2",
1455
+ "@nodelib/fs.walk": "^1.2.3",
1456
+ "glob-parent": "^5.1.2",
1457
+ "merge2": "^1.3.0",
1458
+ "micromatch": "^4.0.8"
1459
+ },
1460
+ "engines": {
1461
+ "node": ">=8.6.0"
1462
+ }
1463
+ },
1464
+ "node_modules/fast-glob/node_modules/glob-parent": {
1465
+ "version": "5.1.2",
1466
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1467
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1468
+ "dev": true,
1469
+ "dependencies": {
1470
+ "is-glob": "^4.0.1"
1471
+ },
1472
+ "engines": {
1473
+ "node": ">= 6"
1474
+ }
1475
+ },
1476
+ "node_modules/fastq": {
1477
+ "version": "1.20.1",
1478
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
1479
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
1480
+ "dev": true,
1481
+ "dependencies": {
1482
+ "reusify": "^1.0.4"
1483
+ }
1484
+ },
1485
+ "node_modules/fill-range": {
1486
+ "version": "7.1.1",
1487
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1488
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1489
+ "dev": true,
1490
+ "dependencies": {
1491
+ "to-regex-range": "^5.0.1"
1492
+ },
1493
+ "engines": {
1494
+ "node": ">=8"
1495
+ }
1496
+ },
1497
+ "node_modules/fraction.js": {
1498
+ "version": "5.3.4",
1499
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
1500
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
1501
+ "dev": true,
1502
+ "engines": {
1503
+ "node": "*"
1504
+ },
1505
+ "funding": {
1506
+ "type": "github",
1507
+ "url": "https://github.com/sponsors/rawify"
1508
+ }
1509
+ },
1510
+ "node_modules/fsevents": {
1511
+ "version": "2.3.3",
1512
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1513
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1514
+ "dev": true,
1515
+ "hasInstallScript": true,
1516
+ "optional": true,
1517
+ "os": [
1518
+ "darwin"
1519
+ ],
1520
+ "engines": {
1521
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1522
+ }
1523
+ },
1524
+ "node_modules/function-bind": {
1525
+ "version": "1.1.2",
1526
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1527
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1528
+ "dev": true,
1529
+ "funding": {
1530
+ "url": "https://github.com/sponsors/ljharb"
1531
+ }
1532
+ },
1533
+ "node_modules/gensync": {
1534
+ "version": "1.0.0-beta.2",
1535
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1536
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1537
+ "dev": true,
1538
+ "engines": {
1539
+ "node": ">=6.9.0"
1540
+ }
1541
+ },
1542
+ "node_modules/glob-parent": {
1543
+ "version": "6.0.2",
1544
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1545
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1546
+ "dev": true,
1547
+ "dependencies": {
1548
+ "is-glob": "^4.0.3"
1549
+ },
1550
+ "engines": {
1551
+ "node": ">=10.13.0"
1552
+ }
1553
+ },
1554
+ "node_modules/hasown": {
1555
+ "version": "2.0.2",
1556
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1557
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1558
+ "dev": true,
1559
+ "dependencies": {
1560
+ "function-bind": "^1.1.2"
1561
+ },
1562
+ "engines": {
1563
+ "node": ">= 0.4"
1564
+ }
1565
+ },
1566
+ "node_modules/is-binary-path": {
1567
+ "version": "2.1.0",
1568
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1569
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1570
+ "dev": true,
1571
+ "dependencies": {
1572
+ "binary-extensions": "^2.0.0"
1573
+ },
1574
+ "engines": {
1575
+ "node": ">=8"
1576
+ }
1577
+ },
1578
+ "node_modules/is-core-module": {
1579
+ "version": "2.16.1",
1580
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1581
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
1582
+ "dev": true,
1583
+ "dependencies": {
1584
+ "hasown": "^2.0.2"
1585
+ },
1586
+ "engines": {
1587
+ "node": ">= 0.4"
1588
+ },
1589
+ "funding": {
1590
+ "url": "https://github.com/sponsors/ljharb"
1591
+ }
1592
+ },
1593
+ "node_modules/is-extglob": {
1594
+ "version": "2.1.1",
1595
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1596
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1597
+ "dev": true,
1598
+ "engines": {
1599
+ "node": ">=0.10.0"
1600
+ }
1601
+ },
1602
+ "node_modules/is-glob": {
1603
+ "version": "4.0.3",
1604
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1605
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1606
+ "dev": true,
1607
+ "dependencies": {
1608
+ "is-extglob": "^2.1.1"
1609
+ },
1610
+ "engines": {
1611
+ "node": ">=0.10.0"
1612
+ }
1613
+ },
1614
+ "node_modules/is-number": {
1615
+ "version": "7.0.0",
1616
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1617
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1618
+ "dev": true,
1619
+ "engines": {
1620
+ "node": ">=0.12.0"
1621
+ }
1622
+ },
1623
+ "node_modules/jiti": {
1624
+ "version": "1.21.7",
1625
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
1626
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
1627
+ "dev": true,
1628
+ "bin": {
1629
+ "jiti": "bin/jiti.js"
1630
+ }
1631
+ },
1632
+ "node_modules/js-tokens": {
1633
+ "version": "4.0.0",
1634
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1635
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1636
+ },
1637
+ "node_modules/jsesc": {
1638
+ "version": "3.1.0",
1639
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1640
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1641
+ "dev": true,
1642
+ "bin": {
1643
+ "jsesc": "bin/jsesc"
1644
+ },
1645
+ "engines": {
1646
+ "node": ">=6"
1647
+ }
1648
+ },
1649
+ "node_modules/json5": {
1650
+ "version": "2.2.3",
1651
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1652
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1653
+ "dev": true,
1654
+ "bin": {
1655
+ "json5": "lib/cli.js"
1656
+ },
1657
+ "engines": {
1658
+ "node": ">=6"
1659
+ }
1660
+ },
1661
+ "node_modules/lilconfig": {
1662
+ "version": "3.1.3",
1663
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1664
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1665
+ "dev": true,
1666
+ "engines": {
1667
+ "node": ">=14"
1668
+ },
1669
+ "funding": {
1670
+ "url": "https://github.com/sponsors/antonk52"
1671
+ }
1672
+ },
1673
+ "node_modules/lines-and-columns": {
1674
+ "version": "1.2.4",
1675
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1676
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1677
+ "dev": true
1678
+ },
1679
+ "node_modules/loose-envify": {
1680
+ "version": "1.4.0",
1681
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1682
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1683
+ "dependencies": {
1684
+ "js-tokens": "^3.0.0 || ^4.0.0"
1685
+ },
1686
+ "bin": {
1687
+ "loose-envify": "cli.js"
1688
+ }
1689
+ },
1690
+ "node_modules/lru-cache": {
1691
+ "version": "5.1.1",
1692
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1693
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1694
+ "dev": true,
1695
+ "dependencies": {
1696
+ "yallist": "^3.0.2"
1697
+ }
1698
+ },
1699
+ "node_modules/lucide-react": {
1700
+ "version": "1.7.0",
1701
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.7.0.tgz",
1702
+ "integrity": "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==",
1703
+ "peerDependencies": {
1704
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
1705
+ }
1706
+ },
1707
+ "node_modules/merge2": {
1708
+ "version": "1.4.1",
1709
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1710
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1711
+ "dev": true,
1712
+ "engines": {
1713
+ "node": ">= 8"
1714
+ }
1715
+ },
1716
+ "node_modules/micromatch": {
1717
+ "version": "4.0.8",
1718
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1719
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1720
+ "dev": true,
1721
+ "dependencies": {
1722
+ "braces": "^3.0.3",
1723
+ "picomatch": "^2.3.1"
1724
+ },
1725
+ "engines": {
1726
+ "node": ">=8.6"
1727
+ }
1728
+ },
1729
+ "node_modules/ms": {
1730
+ "version": "2.1.3",
1731
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1732
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1733
+ "dev": true
1734
+ },
1735
+ "node_modules/mz": {
1736
+ "version": "2.7.0",
1737
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1738
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1739
+ "dev": true,
1740
+ "dependencies": {
1741
+ "any-promise": "^1.0.0",
1742
+ "object-assign": "^4.0.1",
1743
+ "thenify-all": "^1.0.0"
1744
+ }
1745
+ },
1746
+ "node_modules/nanoid": {
1747
+ "version": "3.3.11",
1748
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1749
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1750
+ "dev": true,
1751
+ "funding": [
1752
+ {
1753
+ "type": "github",
1754
+ "url": "https://github.com/sponsors/ai"
1755
+ }
1756
+ ],
1757
+ "bin": {
1758
+ "nanoid": "bin/nanoid.cjs"
1759
+ },
1760
+ "engines": {
1761
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1762
+ }
1763
+ },
1764
+ "node_modules/node-releases": {
1765
+ "version": "2.0.36",
1766
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
1767
+ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
1768
+ "dev": true
1769
+ },
1770
+ "node_modules/normalize-path": {
1771
+ "version": "3.0.0",
1772
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1773
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1774
+ "dev": true,
1775
+ "engines": {
1776
+ "node": ">=0.10.0"
1777
+ }
1778
+ },
1779
+ "node_modules/object-assign": {
1780
+ "version": "4.1.1",
1781
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1782
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1783
+ "dev": true,
1784
+ "engines": {
1785
+ "node": ">=0.10.0"
1786
+ }
1787
+ },
1788
+ "node_modules/object-hash": {
1789
+ "version": "3.0.0",
1790
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1791
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1792
+ "dev": true,
1793
+ "engines": {
1794
+ "node": ">= 6"
1795
+ }
1796
+ },
1797
+ "node_modules/path-parse": {
1798
+ "version": "1.0.7",
1799
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1800
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1801
+ "dev": true
1802
+ },
1803
+ "node_modules/picocolors": {
1804
+ "version": "1.1.1",
1805
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1806
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1807
+ "dev": true
1808
+ },
1809
+ "node_modules/picomatch": {
1810
+ "version": "2.3.2",
1811
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
1812
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
1813
+ "dev": true,
1814
+ "engines": {
1815
+ "node": ">=8.6"
1816
+ },
1817
+ "funding": {
1818
+ "url": "https://github.com/sponsors/jonschlinkert"
1819
+ }
1820
+ },
1821
+ "node_modules/pify": {
1822
+ "version": "2.3.0",
1823
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1824
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1825
+ "dev": true,
1826
+ "engines": {
1827
+ "node": ">=0.10.0"
1828
+ }
1829
+ },
1830
+ "node_modules/pirates": {
1831
+ "version": "4.0.7",
1832
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
1833
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
1834
+ "dev": true,
1835
+ "engines": {
1836
+ "node": ">= 6"
1837
+ }
1838
+ },
1839
+ "node_modules/postcss": {
1840
+ "version": "8.5.8",
1841
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
1842
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
1843
+ "dev": true,
1844
+ "funding": [
1845
+ {
1846
+ "type": "opencollective",
1847
+ "url": "https://opencollective.com/postcss/"
1848
+ },
1849
+ {
1850
+ "type": "tidelift",
1851
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1852
+ },
1853
+ {
1854
+ "type": "github",
1855
+ "url": "https://github.com/sponsors/ai"
1856
+ }
1857
+ ],
1858
+ "dependencies": {
1859
+ "nanoid": "^3.3.11",
1860
+ "picocolors": "^1.1.1",
1861
+ "source-map-js": "^1.2.1"
1862
+ },
1863
+ "engines": {
1864
+ "node": "^10 || ^12 || >=14"
1865
+ }
1866
+ },
1867
+ "node_modules/postcss-import": {
1868
+ "version": "15.1.0",
1869
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
1870
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
1871
+ "dev": true,
1872
+ "dependencies": {
1873
+ "postcss-value-parser": "^4.0.0",
1874
+ "read-cache": "^1.0.0",
1875
+ "resolve": "^1.1.7"
1876
+ },
1877
+ "engines": {
1878
+ "node": ">=14.0.0"
1879
+ },
1880
+ "peerDependencies": {
1881
+ "postcss": "^8.0.0"
1882
+ }
1883
+ },
1884
+ "node_modules/postcss-js": {
1885
+ "version": "4.1.0",
1886
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
1887
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
1888
+ "dev": true,
1889
+ "funding": [
1890
+ {
1891
+ "type": "opencollective",
1892
+ "url": "https://opencollective.com/postcss/"
1893
+ },
1894
+ {
1895
+ "type": "github",
1896
+ "url": "https://github.com/sponsors/ai"
1897
+ }
1898
+ ],
1899
+ "dependencies": {
1900
+ "camelcase-css": "^2.0.1"
1901
+ },
1902
+ "engines": {
1903
+ "node": "^12 || ^14 || >= 16"
1904
+ },
1905
+ "peerDependencies": {
1906
+ "postcss": "^8.4.21"
1907
+ }
1908
+ },
1909
+ "node_modules/postcss-load-config": {
1910
+ "version": "6.0.1",
1911
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
1912
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
1913
+ "dev": true,
1914
+ "funding": [
1915
+ {
1916
+ "type": "opencollective",
1917
+ "url": "https://opencollective.com/postcss/"
1918
+ },
1919
+ {
1920
+ "type": "github",
1921
+ "url": "https://github.com/sponsors/ai"
1922
+ }
1923
+ ],
1924
+ "dependencies": {
1925
+ "lilconfig": "^3.1.1"
1926
+ },
1927
+ "engines": {
1928
+ "node": ">= 18"
1929
+ },
1930
+ "peerDependencies": {
1931
+ "jiti": ">=1.21.0",
1932
+ "postcss": ">=8.0.9",
1933
+ "tsx": "^4.8.1",
1934
+ "yaml": "^2.4.2"
1935
+ },
1936
+ "peerDependenciesMeta": {
1937
+ "jiti": {
1938
+ "optional": true
1939
+ },
1940
+ "postcss": {
1941
+ "optional": true
1942
+ },
1943
+ "tsx": {
1944
+ "optional": true
1945
+ },
1946
+ "yaml": {
1947
+ "optional": true
1948
+ }
1949
+ }
1950
+ },
1951
+ "node_modules/postcss-nested": {
1952
+ "version": "6.2.0",
1953
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
1954
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
1955
+ "dev": true,
1956
+ "funding": [
1957
+ {
1958
+ "type": "opencollective",
1959
+ "url": "https://opencollective.com/postcss/"
1960
+ },
1961
+ {
1962
+ "type": "github",
1963
+ "url": "https://github.com/sponsors/ai"
1964
+ }
1965
+ ],
1966
+ "dependencies": {
1967
+ "postcss-selector-parser": "^6.1.1"
1968
+ },
1969
+ "engines": {
1970
+ "node": ">=12.0"
1971
+ },
1972
+ "peerDependencies": {
1973
+ "postcss": "^8.2.14"
1974
+ }
1975
+ },
1976
+ "node_modules/postcss-selector-parser": {
1977
+ "version": "6.1.2",
1978
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
1979
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
1980
+ "dev": true,
1981
+ "dependencies": {
1982
+ "cssesc": "^3.0.0",
1983
+ "util-deprecate": "^1.0.2"
1984
+ },
1985
+ "engines": {
1986
+ "node": ">=4"
1987
+ }
1988
+ },
1989
+ "node_modules/postcss-value-parser": {
1990
+ "version": "4.2.0",
1991
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1992
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1993
+ "dev": true
1994
+ },
1995
+ "node_modules/queue-microtask": {
1996
+ "version": "1.2.3",
1997
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1998
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1999
+ "dev": true,
2000
+ "funding": [
2001
+ {
2002
+ "type": "github",
2003
+ "url": "https://github.com/sponsors/feross"
2004
+ },
2005
+ {
2006
+ "type": "patreon",
2007
+ "url": "https://www.patreon.com/feross"
2008
+ },
2009
+ {
2010
+ "type": "consulting",
2011
+ "url": "https://feross.org/support"
2012
+ }
2013
+ ]
2014
+ },
2015
+ "node_modules/react": {
2016
+ "version": "18.3.1",
2017
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2018
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2019
+ "dependencies": {
2020
+ "loose-envify": "^1.1.0"
2021
+ },
2022
+ "engines": {
2023
+ "node": ">=0.10.0"
2024
+ }
2025
+ },
2026
+ "node_modules/react-dom": {
2027
+ "version": "18.3.1",
2028
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2029
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2030
+ "dependencies": {
2031
+ "loose-envify": "^1.1.0",
2032
+ "scheduler": "^0.23.2"
2033
+ },
2034
+ "peerDependencies": {
2035
+ "react": "^18.3.1"
2036
+ }
2037
+ },
2038
+ "node_modules/react-refresh": {
2039
+ "version": "0.17.0",
2040
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2041
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2042
+ "dev": true,
2043
+ "engines": {
2044
+ "node": ">=0.10.0"
2045
+ }
2046
+ },
2047
+ "node_modules/read-cache": {
2048
+ "version": "1.0.0",
2049
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2050
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2051
+ "dev": true,
2052
+ "dependencies": {
2053
+ "pify": "^2.3.0"
2054
+ }
2055
+ },
2056
+ "node_modules/readdirp": {
2057
+ "version": "3.6.0",
2058
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2059
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2060
+ "dev": true,
2061
+ "dependencies": {
2062
+ "picomatch": "^2.2.1"
2063
+ },
2064
+ "engines": {
2065
+ "node": ">=8.10.0"
2066
+ }
2067
+ },
2068
+ "node_modules/resolve": {
2069
+ "version": "1.22.11",
2070
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
2071
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
2072
+ "dev": true,
2073
+ "dependencies": {
2074
+ "is-core-module": "^2.16.1",
2075
+ "path-parse": "^1.0.7",
2076
+ "supports-preserve-symlinks-flag": "^1.0.0"
2077
+ },
2078
+ "bin": {
2079
+ "resolve": "bin/resolve"
2080
+ },
2081
+ "engines": {
2082
+ "node": ">= 0.4"
2083
+ },
2084
+ "funding": {
2085
+ "url": "https://github.com/sponsors/ljharb"
2086
+ }
2087
+ },
2088
+ "node_modules/reusify": {
2089
+ "version": "1.1.0",
2090
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2091
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2092
+ "dev": true,
2093
+ "engines": {
2094
+ "iojs": ">=1.0.0",
2095
+ "node": ">=0.10.0"
2096
+ }
2097
+ },
2098
+ "node_modules/rollup": {
2099
+ "version": "4.60.0",
2100
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz",
2101
+ "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==",
2102
+ "dev": true,
2103
+ "dependencies": {
2104
+ "@types/estree": "1.0.8"
2105
+ },
2106
+ "bin": {
2107
+ "rollup": "dist/bin/rollup"
2108
+ },
2109
+ "engines": {
2110
+ "node": ">=18.0.0",
2111
+ "npm": ">=8.0.0"
2112
+ },
2113
+ "optionalDependencies": {
2114
+ "@rollup/rollup-android-arm-eabi": "4.60.0",
2115
+ "@rollup/rollup-android-arm64": "4.60.0",
2116
+ "@rollup/rollup-darwin-arm64": "4.60.0",
2117
+ "@rollup/rollup-darwin-x64": "4.60.0",
2118
+ "@rollup/rollup-freebsd-arm64": "4.60.0",
2119
+ "@rollup/rollup-freebsd-x64": "4.60.0",
2120
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.0",
2121
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.0",
2122
+ "@rollup/rollup-linux-arm64-gnu": "4.60.0",
2123
+ "@rollup/rollup-linux-arm64-musl": "4.60.0",
2124
+ "@rollup/rollup-linux-loong64-gnu": "4.60.0",
2125
+ "@rollup/rollup-linux-loong64-musl": "4.60.0",
2126
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.0",
2127
+ "@rollup/rollup-linux-ppc64-musl": "4.60.0",
2128
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.0",
2129
+ "@rollup/rollup-linux-riscv64-musl": "4.60.0",
2130
+ "@rollup/rollup-linux-s390x-gnu": "4.60.0",
2131
+ "@rollup/rollup-linux-x64-gnu": "4.60.0",
2132
+ "@rollup/rollup-linux-x64-musl": "4.60.0",
2133
+ "@rollup/rollup-openbsd-x64": "4.60.0",
2134
+ "@rollup/rollup-openharmony-arm64": "4.60.0",
2135
+ "@rollup/rollup-win32-arm64-msvc": "4.60.0",
2136
+ "@rollup/rollup-win32-ia32-msvc": "4.60.0",
2137
+ "@rollup/rollup-win32-x64-gnu": "4.60.0",
2138
+ "@rollup/rollup-win32-x64-msvc": "4.60.0",
2139
+ "fsevents": "~2.3.2"
2140
+ }
2141
+ },
2142
+ "node_modules/run-parallel": {
2143
+ "version": "1.2.0",
2144
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2145
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2146
+ "dev": true,
2147
+ "funding": [
2148
+ {
2149
+ "type": "github",
2150
+ "url": "https://github.com/sponsors/feross"
2151
+ },
2152
+ {
2153
+ "type": "patreon",
2154
+ "url": "https://www.patreon.com/feross"
2155
+ },
2156
+ {
2157
+ "type": "consulting",
2158
+ "url": "https://feross.org/support"
2159
+ }
2160
+ ],
2161
+ "dependencies": {
2162
+ "queue-microtask": "^1.2.2"
2163
+ }
2164
+ },
2165
+ "node_modules/scheduler": {
2166
+ "version": "0.23.2",
2167
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2168
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2169
+ "dependencies": {
2170
+ "loose-envify": "^1.1.0"
2171
+ }
2172
+ },
2173
+ "node_modules/semver": {
2174
+ "version": "6.3.1",
2175
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2176
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2177
+ "dev": true,
2178
+ "bin": {
2179
+ "semver": "bin/semver.js"
2180
+ }
2181
+ },
2182
+ "node_modules/source-map-js": {
2183
+ "version": "1.2.1",
2184
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2185
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2186
+ "dev": true,
2187
+ "engines": {
2188
+ "node": ">=0.10.0"
2189
+ }
2190
+ },
2191
+ "node_modules/sucrase": {
2192
+ "version": "3.35.1",
2193
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
2194
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
2195
+ "dev": true,
2196
+ "dependencies": {
2197
+ "@jridgewell/gen-mapping": "^0.3.2",
2198
+ "commander": "^4.0.0",
2199
+ "lines-and-columns": "^1.1.6",
2200
+ "mz": "^2.7.0",
2201
+ "pirates": "^4.0.1",
2202
+ "tinyglobby": "^0.2.11",
2203
+ "ts-interface-checker": "^0.1.9"
2204
+ },
2205
+ "bin": {
2206
+ "sucrase": "bin/sucrase",
2207
+ "sucrase-node": "bin/sucrase-node"
2208
+ },
2209
+ "engines": {
2210
+ "node": ">=16 || 14 >=14.17"
2211
+ }
2212
+ },
2213
+ "node_modules/supports-preserve-symlinks-flag": {
2214
+ "version": "1.0.0",
2215
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2216
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2217
+ "dev": true,
2218
+ "engines": {
2219
+ "node": ">= 0.4"
2220
+ },
2221
+ "funding": {
2222
+ "url": "https://github.com/sponsors/ljharb"
2223
+ }
2224
+ },
2225
+ "node_modules/tailwindcss": {
2226
+ "version": "3.4.19",
2227
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
2228
+ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
2229
+ "dev": true,
2230
+ "dependencies": {
2231
+ "@alloc/quick-lru": "^5.2.0",
2232
+ "arg": "^5.0.2",
2233
+ "chokidar": "^3.6.0",
2234
+ "didyoumean": "^1.2.2",
2235
+ "dlv": "^1.1.3",
2236
+ "fast-glob": "^3.3.2",
2237
+ "glob-parent": "^6.0.2",
2238
+ "is-glob": "^4.0.3",
2239
+ "jiti": "^1.21.7",
2240
+ "lilconfig": "^3.1.3",
2241
+ "micromatch": "^4.0.8",
2242
+ "normalize-path": "^3.0.0",
2243
+ "object-hash": "^3.0.0",
2244
+ "picocolors": "^1.1.1",
2245
+ "postcss": "^8.4.47",
2246
+ "postcss-import": "^15.1.0",
2247
+ "postcss-js": "^4.0.1",
2248
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
2249
+ "postcss-nested": "^6.2.0",
2250
+ "postcss-selector-parser": "^6.1.2",
2251
+ "resolve": "^1.22.8",
2252
+ "sucrase": "^3.35.0"
2253
+ },
2254
+ "bin": {
2255
+ "tailwind": "lib/cli.js",
2256
+ "tailwindcss": "lib/cli.js"
2257
+ },
2258
+ "engines": {
2259
+ "node": ">=14.0.0"
2260
+ }
2261
+ },
2262
+ "node_modules/thenify": {
2263
+ "version": "3.3.1",
2264
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2265
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2266
+ "dev": true,
2267
+ "dependencies": {
2268
+ "any-promise": "^1.0.0"
2269
+ }
2270
+ },
2271
+ "node_modules/thenify-all": {
2272
+ "version": "1.6.0",
2273
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2274
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2275
+ "dev": true,
2276
+ "dependencies": {
2277
+ "thenify": ">= 3.1.0 < 4"
2278
+ },
2279
+ "engines": {
2280
+ "node": ">=0.8"
2281
+ }
2282
+ },
2283
+ "node_modules/tinyglobby": {
2284
+ "version": "0.2.15",
2285
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2286
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2287
+ "dev": true,
2288
+ "dependencies": {
2289
+ "fdir": "^6.5.0",
2290
+ "picomatch": "^4.0.3"
2291
+ },
2292
+ "engines": {
2293
+ "node": ">=12.0.0"
2294
+ },
2295
+ "funding": {
2296
+ "url": "https://github.com/sponsors/SuperchupuDev"
2297
+ }
2298
+ },
2299
+ "node_modules/tinyglobby/node_modules/fdir": {
2300
+ "version": "6.5.0",
2301
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2302
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2303
+ "dev": true,
2304
+ "engines": {
2305
+ "node": ">=12.0.0"
2306
+ },
2307
+ "peerDependencies": {
2308
+ "picomatch": "^3 || ^4"
2309
+ },
2310
+ "peerDependenciesMeta": {
2311
+ "picomatch": {
2312
+ "optional": true
2313
+ }
2314
+ }
2315
+ },
2316
+ "node_modules/tinyglobby/node_modules/picomatch": {
2317
+ "version": "4.0.4",
2318
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
2319
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
2320
+ "dev": true,
2321
+ "engines": {
2322
+ "node": ">=12"
2323
+ },
2324
+ "funding": {
2325
+ "url": "https://github.com/sponsors/jonschlinkert"
2326
+ }
2327
+ },
2328
+ "node_modules/to-regex-range": {
2329
+ "version": "5.0.1",
2330
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2331
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2332
+ "dev": true,
2333
+ "dependencies": {
2334
+ "is-number": "^7.0.0"
2335
+ },
2336
+ "engines": {
2337
+ "node": ">=8.0"
2338
+ }
2339
+ },
2340
+ "node_modules/ts-interface-checker": {
2341
+ "version": "0.1.13",
2342
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2343
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2344
+ "dev": true
2345
+ },
2346
+ "node_modules/update-browserslist-db": {
2347
+ "version": "1.2.3",
2348
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
2349
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
2350
+ "dev": true,
2351
+ "funding": [
2352
+ {
2353
+ "type": "opencollective",
2354
+ "url": "https://opencollective.com/browserslist"
2355
+ },
2356
+ {
2357
+ "type": "tidelift",
2358
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2359
+ },
2360
+ {
2361
+ "type": "github",
2362
+ "url": "https://github.com/sponsors/ai"
2363
+ }
2364
+ ],
2365
+ "dependencies": {
2366
+ "escalade": "^3.2.0",
2367
+ "picocolors": "^1.1.1"
2368
+ },
2369
+ "bin": {
2370
+ "update-browserslist-db": "cli.js"
2371
+ },
2372
+ "peerDependencies": {
2373
+ "browserslist": ">= 4.21.0"
2374
+ }
2375
+ },
2376
+ "node_modules/util-deprecate": {
2377
+ "version": "1.0.2",
2378
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2379
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2380
+ "dev": true
2381
+ },
2382
+ "node_modules/vite": {
2383
+ "version": "5.4.21",
2384
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
2385
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
2386
+ "dev": true,
2387
+ "dependencies": {
2388
+ "esbuild": "^0.21.3",
2389
+ "postcss": "^8.4.43",
2390
+ "rollup": "^4.20.0"
2391
+ },
2392
+ "bin": {
2393
+ "vite": "bin/vite.js"
2394
+ },
2395
+ "engines": {
2396
+ "node": "^18.0.0 || >=20.0.0"
2397
+ },
2398
+ "funding": {
2399
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2400
+ },
2401
+ "optionalDependencies": {
2402
+ "fsevents": "~2.3.3"
2403
+ },
2404
+ "peerDependencies": {
2405
+ "@types/node": "^18.0.0 || >=20.0.0",
2406
+ "less": "*",
2407
+ "lightningcss": "^1.21.0",
2408
+ "sass": "*",
2409
+ "sass-embedded": "*",
2410
+ "stylus": "*",
2411
+ "sugarss": "*",
2412
+ "terser": "^5.4.0"
2413
+ },
2414
+ "peerDependenciesMeta": {
2415
+ "@types/node": {
2416
+ "optional": true
2417
+ },
2418
+ "less": {
2419
+ "optional": true
2420
+ },
2421
+ "lightningcss": {
2422
+ "optional": true
2423
+ },
2424
+ "sass": {
2425
+ "optional": true
2426
+ },
2427
+ "sass-embedded": {
2428
+ "optional": true
2429
+ },
2430
+ "stylus": {
2431
+ "optional": true
2432
+ },
2433
+ "sugarss": {
2434
+ "optional": true
2435
+ },
2436
+ "terser": {
2437
+ "optional": true
2438
+ }
2439
+ }
2440
+ },
2441
+ "node_modules/yallist": {
2442
+ "version": "3.1.1",
2443
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2444
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2445
+ "dev": true
2446
+ }
2447
+ }
2448
+ }
frontend/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "clm-frontend",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "lucide-react": "^1.7.0",
13
+ "react": "^18.2.0",
14
+ "react-dom": "^18.2.0"
15
+ },
16
+ "devDependencies": {
17
+ "@vitejs/plugin-react": "^4.2.1",
18
+ "autoprefixer": "^10.4.16",
19
+ "postcss": "^8.4.31",
20
+ "tailwindcss": "^3.3.5",
21
+ "vite": "^5.0.0"
22
+ }
23
+ }
frontend/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
frontend/src/App.jsx ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react'
2
+ import Dashboard from './components/Dashboard'
3
+
4
+ function App() {
5
+ return (
6
+ <div className="min-h-screen bg-slate-900 text-slate-100 selection:bg-indigo-500/30">
7
+ <header className="border-b border-slate-800 bg-slate-900/50 backdrop-blur top-0 sticky z-10 px-6 py-4 flex items-center justify-between">
8
+ <h1 className="text-xl font-bold bg-gradient-to-r from-indigo-400 to-cyan-400 bg-clip-text text-transparent">
9
+ Cognitive Load Manager
10
+ </h1>
11
+ <div className="text-sm text-slate-400">OpenEnv Compliant Environment Dashboard</div>
12
+ </header>
13
+ <main className="p-6 max-w-7xl mx-auto">
14
+ <Dashboard />
15
+ </main>
16
+ </div>
17
+ )
18
+ }
19
+
20
+ export default App
frontend/src/components/Dashboard.jsx ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+ import { RefreshCw, Briefcase, Coffee, Clock } from 'lucide-react';
3
+
4
+ const API_BASE = 'http://localhost:8000';
5
+
6
+ export default function Dashboard() {
7
+ const [level, setLevel] = useState('medium');
8
+ const [sessionId, setSessionId] = useState(null);
9
+ const [obs, setObs] = useState(null);
10
+ const [stateData, setStateData] = useState(null);
11
+ const [logs, setLogs] = useState([]);
12
+ const [loading, setLoading] = useState(false);
13
+ const [error, setError] = useState(null);
14
+ const scrollRef = useRef(null);
15
+
16
+ const fetchState = async (sid) => {
17
+ try {
18
+ const res = await fetch(`${API_BASE}/state?session_id=${sid}`);
19
+ if (res.ok) {
20
+ const data = await res.json();
21
+ setStateData(data);
22
+ }
23
+ } catch(e) { console.error("State fetch error", e); }
24
+ };
25
+
26
+ const handleReset = async () => {
27
+ setLoading(true);
28
+ setError(null);
29
+ try {
30
+ const res = await fetch(`${API_BASE}/reset`, {
31
+ method: 'POST',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body: JSON.stringify({ level })
34
+ });
35
+ const data = await res.json();
36
+ setSessionId(data.session_id);
37
+ setObs(data.observation);
38
+ setLogs([{ type: 'system', msg: `Environment reset: ${level} level` }]);
39
+ await fetchState(data.session_id);
40
+ } catch (err) {
41
+ setError(err.message || "Failed to connect to backend");
42
+ } finally {
43
+ setLoading(false);
44
+ }
45
+ };
46
+
47
+ const handleAction = async (actionType, taskId = null) => {
48
+ if (!sessionId) return;
49
+ setLoading(true);
50
+
51
+ const action = { type: actionType };
52
+ if (taskId) action.task_id = taskId;
53
+
54
+ try {
55
+ const res = await fetch(`${API_BASE}/step`, {
56
+ method: 'POST',
57
+ headers: { 'Content-Type': 'application/json' },
58
+ body: JSON.stringify({ session_id: sessionId, action })
59
+ });
60
+ const data = await res.json();
61
+ setObs(data.observation);
62
+
63
+ let logMsg = `Action: ${actionType}${taskId ? ' ('+taskId+')' : ''} | Reward: ${data.reward.toFixed(2)}`;
64
+ if (data.done) {
65
+ logMsg += ` | DONE. Final Score: ${data.info?.final_score?.toFixed(2) || 'N/A'}`;
66
+ }
67
+
68
+ setLogs(prev => [...prev, { type: 'action', msg: logMsg, reward: data.reward }]);
69
+ await fetchState(sessionId);
70
+
71
+ setTimeout(() => {
72
+ if(scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
73
+ }, 50);
74
+
75
+ } catch (err) {
76
+ setError(err.message);
77
+ } finally {
78
+ setLoading(false);
79
+ }
80
+ };
81
+
82
+ useEffect(() => {
83
+ handleReset();
84
+ }, [level]);
85
+
86
+ return (
87
+ <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
88
+ <div className="lg:col-span-2 space-y-6">
89
+ <div className="bg-slate-800 p-4 rounded-xl border border-slate-700 flex items-center gap-4">
90
+ <select
91
+ value={level}
92
+ onChange={e => setLevel(e.target.value)}
93
+ className="bg-slate-900 border border-slate-700 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-indigo-500 outline-none"
94
+ >
95
+ <option value="easy">Easy</option>
96
+ <option value="medium">Medium</option>
97
+ <option value="hard">Hard</option>
98
+ </select>
99
+ <button
100
+ onClick={handleReset}
101
+ disabled={loading}
102
+ className="flex items-center gap-2 bg-slate-700 hover:bg-slate-600 transition-colors px-4 py-2 rounded-lg text-sm font-medium"
103
+ >
104
+ <RefreshCw size={16} className={loading ? "animate-spin" : ""} /> Reset Env
105
+ </button>
106
+ <div className="ml-auto text-sm text-slate-400">
107
+ Time Step: <span className="font-mono text-white bg-slate-900 px-2 py-1 rounded">{obs?.time_step || 0}</span>
108
+ </div>
109
+ {error && <span className="text-red-400 text-sm ml-4">{error}</span>}
110
+ </div>
111
+
112
+ <div className="grid grid-cols-2 gap-4">
113
+ <div className="bg-slate-800 p-5 rounded-xl border border-slate-700 hover:border-slate-600 transition-colors">
114
+ <div className="flex justify-between items-center mb-2">
115
+ <span className="text-slate-400 text-sm">Energy</span>
116
+ <span className="font-bold">{stateData ? (stateData.energy * 100).toFixed(0) : 0}%</span>
117
+ </div>
118
+ <div className="w-full bg-slate-900 rounded-full h-3">
119
+ <div
120
+ className={`h-3 rounded-full transition-all duration-500 ease-out ${stateData?.energy > 0.5 ? 'bg-emerald-500' : stateData?.energy > 0.2 ? 'bg-amber-500' : 'bg-red-500'}`}
121
+ style={{ width: `${stateData ? stateData.energy * 100 : 0}%` }}
122
+ ></div>
123
+ </div>
124
+ <div className="mt-3 text-xs text-slate-500 text-right">
125
+ Obs: <span className="text-slate-300 capitalize">{obs?.visible_state?.fatigue_level || 'N/A'}</span>
126
+ </div>
127
+ </div>
128
+
129
+ <div className="bg-slate-800 p-5 rounded-xl border border-slate-700 hover:border-slate-600 transition-colors">
130
+ <div className="flex justify-between items-center mb-2">
131
+ <span className="text-slate-400 text-sm">Stress</span>
132
+ <span className="font-bold">{stateData ? (stateData.stress * 100).toFixed(0) : 0}%</span>
133
+ </div>
134
+ <div className="w-full bg-slate-900 rounded-full h-3">
135
+ <div
136
+ className={`h-3 rounded-full transition-all duration-500 ease-out ${stateData?.stress > 0.7 ? 'bg-red-500 w-full animate-pulse' : stateData?.stress > 0.4 ? 'bg-amber-500' : 'bg-emerald-500'}`}
137
+ style={{ width: `${stateData ? stateData.stress * 100 : 0}%` }}
138
+ ></div>
139
+ </div>
140
+ <div className="mt-3 text-xs text-slate-500 text-right">
141
+ Warning: {obs?.visible_state?.stress_warning ? <span className="text-red-400 font-bold">YES</span> : <span className="text-emerald-400">NO</span>}
142
+ </div>
143
+ </div>
144
+ </div>
145
+
146
+ <div className="bg-slate-800 p-5 rounded-xl border border-slate-700">
147
+ <h3 className="text-slate-400 text-sm mb-4">Environment Actions</h3>
148
+ <div className="flex gap-4">
149
+ <button disabled={loading} onClick={() => handleAction('break')} className="flex-1 flex flex-col items-center justify-center p-4 rounded-xl bg-indigo-500/10 hover:bg-indigo-500/20 border border-indigo-500/30 text-indigo-400 transition-all hover:scale-105 active:scale-95">
150
+ <Coffee size={24} className="mb-2" />
151
+ <span className="text-sm font-medium">Take Break</span>
152
+ </button>
153
+ <button disabled={loading} onClick={() => handleAction('delay')} className="flex-1 flex flex-col items-center justify-center p-4 rounded-xl bg-emerald-500/10 hover:bg-emerald-500/20 border border-emerald-500/30 text-emerald-400 transition-all hover:scale-105 active:scale-95">
154
+ <Clock size={24} className="mb-2" />
155
+ <span className="text-sm font-medium">Delay / Idle</span>
156
+ </button>
157
+ </div>
158
+ </div>
159
+
160
+ <div className="space-y-4">
161
+ <h2 className="text-lg font-bold flex items-center gap-2 px-1">
162
+ <Briefcase size={20} className="text-indigo-400" /> Active Tasks
163
+ </h2>
164
+ <div className="space-y-3">
165
+ {obs?.tasks?.map(t => {
166
+ const isCurrent = stateData?.current_task_id === t.id;
167
+ const isDone = t.progress >= 1.0;
168
+ const isLate = !isDone && t.deadline && obs.time_step > t.deadline;
169
+ const isUrgent = !isDone && t.deadline && (t.deadline - obs.time_step <= 3) && (t.deadline - obs.time_step >= 0);
170
+
171
+ return (
172
+ <div key={t.id} className={`p-4 rounded-xl border transition-all ${isCurrent && !isDone ? 'bg-indigo-900/40 border-indigo-500/50 shadow-[0_0_15px_rgba(99,102,241,0.15)]' : 'bg-slate-800 border-slate-700 hover:border-slate-500'} ${isDone ? 'opacity-50' : ''}`}>
173
+ <div className="flex justify-between items-start mb-3">
174
+ <div>
175
+ <h4 className="font-semibold flex items-center gap-2">
176
+ {t.id}
177
+ {isDone && <span className="text-xs bg-emerald-500/20 text-emerald-400 px-2 py-0.5 rounded-full">Done</span>}
178
+ {isLate && <span className="text-xs bg-red-500/20 text-red-400 px-2 py-0.5 rounded-full">Late</span>}
179
+ {isUrgent && <span className="text-xs bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full">Urgent</span>}
180
+ </h4>
181
+ <div className="text-xs text-slate-400 mt-1 flex gap-3">
182
+ <span>Diff: <span className="capitalize text-slate-300">{t.difficulty}</span></span>
183
+ {t.deadline && <span>Deadline: <span className="font-mono text-slate-300">{t.deadline}</span></span>}
184
+ </div>
185
+ </div>
186
+ <div className="flex gap-2">
187
+ <button
188
+ onClick={() => handleAction('work', t.id)}
189
+ disabled={loading || isDone}
190
+ className="px-4 py-1.5 bg-indigo-600 hover:bg-indigo-500 disabled:opacity-50 disabled:hover:bg-indigo-600 rounded text-sm font-medium transition-colors shadow-sm"
191
+ >
192
+ Work
193
+ </button>
194
+ {!isCurrent && (
195
+ <button
196
+ onClick={() => handleAction('switch', t.id)}
197
+ disabled={loading || isDone}
198
+ className="px-4 py-1.5 bg-slate-700 hover:bg-slate-600 disabled:opacity-50 disabled:hover:bg-slate-700 rounded text-sm font-medium transition-colors shadow-sm"
199
+ >
200
+ Switch
201
+ </button>
202
+ )}
203
+ </div>
204
+ </div>
205
+ <div className="w-full bg-slate-900 mb-1 rounded-full h-2 overflow-hidden shadow-inner">
206
+ <div
207
+ className={`h-2 rounded-full transition-all duration-300 ease-out ${isDone ? 'bg-emerald-500' : 'bg-indigo-500'}`}
208
+ style={{ width: `${Math.min(100, t.progress * 100)}%` }}
209
+ ></div>
210
+ </div>
211
+ </div>
212
+ );
213
+ })}
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <div className="bg-slate-800 rounded-xl border border-slate-700 flex flex-col h-[calc(100vh-6rem)] sticky top-6 shadow-xl">
219
+ <div className="p-4 border-b border-slate-700 bg-slate-900/50 rounded-t-xl">
220
+ <h3 className="font-bold text-slate-200">Activity Log</h3>
221
+ </div>
222
+ <div className="p-4 overflow-y-auto flex-1 space-y-3 font-mono text-xs" ref={scrollRef}>
223
+ {logs.length === 0 && <div className="text-slate-500 text-center mt-10">No activity yet.</div>}
224
+ {logs.map((log, i) => (
225
+ <div key={i} className={`p-2.5 rounded border ${log.type === 'system' ? 'text-slate-400 border-slate-700/50 bg-slate-800/50' : log.reward > 0 ? 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20' : log.reward < 0 ? 'text-red-400 bg-red-500/10 border-red-500/20' : 'text-slate-300 border-slate-700 bg-slate-800/80'}`}>
226
+ <span className="opacity-40 mr-2">[{i.toString().padStart(3, '0')}]</span>
227
+ {log.msg}
228
+ </div>
229
+ ))}
230
+ </div>
231
+ </div>
232
+ </div>
233
+ );
234
+ }
frontend/src/index.css ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ margin: 0;
7
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
8
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
9
+ sans-serif;
10
+ -webkit-font-smoothing: antialiased;
11
+ -moz-osx-font-smoothing: grayscale;
12
+ }
frontend/src/main.jsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react'
2
+ import ReactDOM from 'react-dom/client'
3
+ import App from './App.jsx'
4
+ import './index.css'
5
+
6
+ ReactDOM.createRoot(document.getElementById('root')).render(
7
+ <React.StrictMode>
8
+ <App />
9
+ </React.StrictMode>,
10
+ )
frontend/tailwind.config.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: [
4
+ "./index.html",
5
+ "./src/**/*.{js,ts,jsx,tsx}",
6
+ ],
7
+ theme: {
8
+ extend: {},
9
+ },
10
+ plugins: [],
11
+ }
frontend/vite.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ })
models.py ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+ from typing import List, Optional, Literal, Tuple, Dict, Any
3
+
4
+ # ==========================================
5
+ # OPENENV SCHEMAS
6
+ # ==========================================
7
+ class Task(BaseModel):
8
+ id: str
9
+ difficulty: str
10
+ progress: float = 0.0
11
+ deadline: Optional[int] = None
12
+
13
+ class VisibleState(BaseModel):
14
+ fatigue_level: str
15
+ stress_warning: bool
16
+
17
+ class Observation(BaseModel):
18
+ tasks: List[Task]
19
+ visible_state: VisibleState
20
+ time_step: int
21
+
22
+ class Action(BaseModel):
23
+ type: Literal["work", "break", "switch", "delay"]
24
+ task_id: Optional[str] = None
25
+
26
+ class EnvState(BaseModel):
27
+ energy: float = 1.0
28
+ stress: float = 0.0
29
+ fatigue: float = 0.0
30
+ time_step: int = 0
31
+ current_task_id: Optional[str] = None
32
+ tasks: List[Task] = []
33
+
34
+
35
+ # ==========================================
36
+ # ENV HELPER METHODS
37
+ # ==========================================
38
+ def generate_tasks(level: str) -> list[Task]:
39
+ if level == "easy":
40
+ return [
41
+ Task(id="easy-1", difficulty="easy", progress=0.0, deadline=None),
42
+ Task(id="easy-2", difficulty="easy", progress=0.0, deadline=None)
43
+ ]
44
+ elif level == "medium":
45
+ return [
46
+ Task(id="med-1", difficulty="medium", progress=0.0, deadline=15),
47
+ Task(id="med-2", difficulty="medium", progress=0.0, deadline=20),
48
+ Task(id="med-3", difficulty="medium", progress=0.0, deadline=25),
49
+ Task(id="med-4", difficulty="medium", progress=0.0, deadline=30),
50
+ Task(id="med-5", difficulty="medium", progress=0.0, deadline=35)
51
+ ]
52
+ elif level == "hard":
53
+ return [
54
+ Task(id="hard-1", difficulty="hard", progress=0.0, deadline=10),
55
+ Task(id="hard-2", difficulty="hard", progress=0.0, deadline=12),
56
+ Task(id="hard-3", difficulty="hard", progress=0.0, deadline=15),
57
+ Task(id="hard-4", difficulty="hard", progress=0.0, deadline=18),
58
+ Task(id="hard-5", difficulty="hard", progress=0.0, deadline=22),
59
+ Task(id="hard-6", difficulty="hard", progress=0.0, deadline=25),
60
+ Task(id="hard-7", difficulty="hard", progress=0.0, deadline=28),
61
+ Task(id="hard-8", difficulty="hard", progress=0.0, deadline=35)
62
+ ]
63
+ return []
64
+
65
+ def deterministic_grader(tasks: list[Task], time_step: int, final_energy: float) -> float:
66
+ """
67
+ A deterministic grader returning 0.0-1.0 based on:
68
+ - completion rate
69
+ - deadline adherence
70
+ - energy efficiency
71
+ """
72
+ if not tasks:
73
+ return 0.0
74
+
75
+ completion_rate = sum(t.progress for t in tasks) / len(tasks)
76
+
77
+ # penalty for missed deadlines
78
+ missed_deadlines = 0
79
+ for t in tasks:
80
+ if t.deadline and time_step > t.deadline and t.progress < 1.0:
81
+ missed_deadlines += 1
82
+
83
+ deadline_penalty = min(0.3, missed_deadlines * 0.1)
84
+
85
+ # energy efficiency
86
+ energy_score = max(0.0, (final_energy - 0.1) * 0.2)
87
+
88
+ score = completion_rate * 0.8 - deadline_penalty + energy_score
89
+ return max(0.0, min(1.0, score))
90
+
91
+
92
+ # ==========================================
93
+ # OPENENV ENVIRONMENT IMPLEMENTATION
94
+ # ==========================================
95
+ class CLMEnvironment:
96
+ def __init__(self, tasks: list[Task], max_steps: int = 50):
97
+ self.max_steps = max_steps
98
+ self.initial_tasks = tasks
99
+ self.state = EnvState(tasks=[t.model_copy() for t in tasks])
100
+
101
+ def reset(self) -> Observation:
102
+ self.state = EnvState(tasks=[t.model_copy() for t in self.initial_tasks])
103
+ return self._get_observation()
104
+
105
+ def _get_observation(self) -> Observation:
106
+ fatigue_level = "low"
107
+ if self.state.energy < 0.3:
108
+ fatigue_level = "high"
109
+ elif self.state.energy < 0.6:
110
+ fatigue_level = "medium"
111
+
112
+ stress_warning = self.state.stress > 0.7
113
+
114
+ visible_state = VisibleState(
115
+ fatigue_level=fatigue_level,
116
+ stress_warning=stress_warning
117
+ )
118
+
119
+ return Observation(
120
+ tasks=self.state.tasks,
121
+ visible_state=visible_state,
122
+ time_step=self.state.time_step
123
+ )
124
+
125
+ def step(self, action: Action) -> Tuple[Observation, float, bool, dict]:
126
+ reward = 0.0
127
+
128
+ # Process Action
129
+ if action.type == "work":
130
+ self.state.energy = max(0.0, self.state.energy - 0.15) # Working reduces energy
131
+
132
+ if action.task_id:
133
+ if self.state.current_task_id and self.state.current_task_id != action.task_id:
134
+ reward -= 0.1 # Unnecessary switching penalty
135
+ self.state.current_task_id = action.task_id
136
+
137
+ task = next((t for t in self.state.tasks if t.id == self.state.current_task_id), None)
138
+
139
+ if task and task.progress < 1.0:
140
+ # low energy -> reduced efficiency
141
+ efficiency = self.state.energy if self.state.energy < 0.3 else 1.0
142
+ progress_made = 0.25 * efficiency * (1.0 - self.state.stress)
143
+ task.progress = min(1.0, task.progress + progress_made)
144
+ reward += 0.1 # Progress made
145
+
146
+ elif action.type == "break":
147
+ self.state.energy = min(1.0, self.state.energy + 0.2)
148
+ self.state.stress = max(0.0, self.state.stress - 0.15)
149
+
150
+ elif action.type == "switch":
151
+ if action.task_id:
152
+ self.state.current_task_id = action.task_id
153
+ reward -= 0.1
154
+
155
+ elif action.type == "delay":
156
+ self.state.stress = max(0.0, self.state.stress - 0.05)
157
+
158
+ self.state.time_step += 1
159
+
160
+ # Stress mechanics
161
+ pending_tasks = [t for t in self.state.tasks if t.progress < 1.0]
162
+ for t in pending_tasks:
163
+ if t.deadline:
164
+ time_to_deadline = t.deadline - self.state.time_step
165
+ if 0 <= time_to_deadline <= 3:
166
+ self.state.stress = min(1.0, self.state.stress + 0.1) # stress increases as deadlines approach
167
+ elif time_to_deadline < 0:
168
+ self.state.stress = min(1.0, self.state.stress + 0.2)
169
+
170
+ # State transitions
171
+ all_completed = all(t.progress >= 1.0 for t in self.state.tasks)
172
+ burnout = self.state.energy < 0.1
173
+ timeout = self.state.time_step >= self.max_steps
174
+
175
+ done = all_completed or burnout or timeout
176
+
177
+ if self.state.stress > 0.8:
178
+ reward -= 0.1 # high stress penalty
179
+
180
+ if done:
181
+ if burnout:
182
+ reward -= 1.0
183
+ elif all_completed:
184
+ late = any(t.deadline and self.state.time_step > t.deadline for t in self.state.tasks)
185
+ if late:
186
+ reward += 0.5
187
+ else:
188
+ reward += 1.0
189
+
190
+ return self._get_observation(), reward, done, self.state.model_dump()
191
+
192
+ def state_dict(self) -> dict:
193
+ return self.state.model_dump()
openenv.yaml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: clm-env
2
+ description: Cognitive Load Manager (CLM) simulates human cognitive load (energy, stress, fatigue) while managing tasks with deadlines.
3
+ version: "1.0.0"
4
+ schema:
5
+ observation:
6
+ type: object
7
+ properties:
8
+ tasks:
9
+ type: array
10
+ items:
11
+ type: object
12
+ properties:
13
+ id: { type: string }
14
+ difficulty: { type: string }
15
+ progress: { type: number }
16
+ deadline: { type: number, nullable: true }
17
+ visible_state:
18
+ type: object
19
+ properties:
20
+ fatigue_level: { type: string }
21
+ stress_warning: { type: boolean }
22
+ time_step: { type: integer }
23
+ action:
24
+ type: object
25
+ properties:
26
+ type: { type: string, enum: ["work", "break", "switch", "delay"] }
27
+ task_id: { type: string, nullable: true }
28
+ reward:
29
+ type: number
30
+ tasks:
31
+ - id: easy
32
+ description: "2 tasks, no interruptions"
33
+ - id: medium
34
+ description: "5 tasks, deadlines"
35
+ - id: hard
36
+ description: "8 tasks, interruptions, hidden fatigue"
package-lock.json ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "clm-env",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "devDependencies": {
8
+ "autoprefixer": "^10.4.27",
9
+ "postcss": "^8.5.8",
10
+ "tailwindcss": "^4.2.2"
11
+ }
12
+ },
13
+ "node_modules/autoprefixer": {
14
+ "version": "10.4.27",
15
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz",
16
+ "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==",
17
+ "dev": true,
18
+ "funding": [
19
+ {
20
+ "type": "opencollective",
21
+ "url": "https://opencollective.com/postcss/"
22
+ },
23
+ {
24
+ "type": "tidelift",
25
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
26
+ },
27
+ {
28
+ "type": "github",
29
+ "url": "https://github.com/sponsors/ai"
30
+ }
31
+ ],
32
+ "dependencies": {
33
+ "browserslist": "^4.28.1",
34
+ "caniuse-lite": "^1.0.30001774",
35
+ "fraction.js": "^5.3.4",
36
+ "picocolors": "^1.1.1",
37
+ "postcss-value-parser": "^4.2.0"
38
+ },
39
+ "bin": {
40
+ "autoprefixer": "bin/autoprefixer"
41
+ },
42
+ "engines": {
43
+ "node": "^10 || ^12 || >=14"
44
+ },
45
+ "peerDependencies": {
46
+ "postcss": "^8.1.0"
47
+ }
48
+ },
49
+ "node_modules/baseline-browser-mapping": {
50
+ "version": "2.10.12",
51
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz",
52
+ "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==",
53
+ "dev": true,
54
+ "bin": {
55
+ "baseline-browser-mapping": "dist/cli.cjs"
56
+ },
57
+ "engines": {
58
+ "node": ">=6.0.0"
59
+ }
60
+ },
61
+ "node_modules/browserslist": {
62
+ "version": "4.28.1",
63
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
64
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
65
+ "dev": true,
66
+ "funding": [
67
+ {
68
+ "type": "opencollective",
69
+ "url": "https://opencollective.com/browserslist"
70
+ },
71
+ {
72
+ "type": "tidelift",
73
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
74
+ },
75
+ {
76
+ "type": "github",
77
+ "url": "https://github.com/sponsors/ai"
78
+ }
79
+ ],
80
+ "dependencies": {
81
+ "baseline-browser-mapping": "^2.9.0",
82
+ "caniuse-lite": "^1.0.30001759",
83
+ "electron-to-chromium": "^1.5.263",
84
+ "node-releases": "^2.0.27",
85
+ "update-browserslist-db": "^1.2.0"
86
+ },
87
+ "bin": {
88
+ "browserslist": "cli.js"
89
+ },
90
+ "engines": {
91
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
92
+ }
93
+ },
94
+ "node_modules/caniuse-lite": {
95
+ "version": "1.0.30001782",
96
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz",
97
+ "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==",
98
+ "dev": true,
99
+ "funding": [
100
+ {
101
+ "type": "opencollective",
102
+ "url": "https://opencollective.com/browserslist"
103
+ },
104
+ {
105
+ "type": "tidelift",
106
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
107
+ },
108
+ {
109
+ "type": "github",
110
+ "url": "https://github.com/sponsors/ai"
111
+ }
112
+ ]
113
+ },
114
+ "node_modules/electron-to-chromium": {
115
+ "version": "1.5.328",
116
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz",
117
+ "integrity": "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==",
118
+ "dev": true
119
+ },
120
+ "node_modules/escalade": {
121
+ "version": "3.2.0",
122
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
123
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
124
+ "dev": true,
125
+ "engines": {
126
+ "node": ">=6"
127
+ }
128
+ },
129
+ "node_modules/fraction.js": {
130
+ "version": "5.3.4",
131
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
132
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
133
+ "dev": true,
134
+ "engines": {
135
+ "node": "*"
136
+ },
137
+ "funding": {
138
+ "type": "github",
139
+ "url": "https://github.com/sponsors/rawify"
140
+ }
141
+ },
142
+ "node_modules/nanoid": {
143
+ "version": "3.3.11",
144
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
145
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
146
+ "dev": true,
147
+ "funding": [
148
+ {
149
+ "type": "github",
150
+ "url": "https://github.com/sponsors/ai"
151
+ }
152
+ ],
153
+ "bin": {
154
+ "nanoid": "bin/nanoid.cjs"
155
+ },
156
+ "engines": {
157
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
158
+ }
159
+ },
160
+ "node_modules/node-releases": {
161
+ "version": "2.0.36",
162
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
163
+ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
164
+ "dev": true
165
+ },
166
+ "node_modules/picocolors": {
167
+ "version": "1.1.1",
168
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
169
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
170
+ "dev": true
171
+ },
172
+ "node_modules/postcss": {
173
+ "version": "8.5.8",
174
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
175
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
176
+ "dev": true,
177
+ "funding": [
178
+ {
179
+ "type": "opencollective",
180
+ "url": "https://opencollective.com/postcss/"
181
+ },
182
+ {
183
+ "type": "tidelift",
184
+ "url": "https://tidelift.com/funding/github/npm/postcss"
185
+ },
186
+ {
187
+ "type": "github",
188
+ "url": "https://github.com/sponsors/ai"
189
+ }
190
+ ],
191
+ "dependencies": {
192
+ "nanoid": "^3.3.11",
193
+ "picocolors": "^1.1.1",
194
+ "source-map-js": "^1.2.1"
195
+ },
196
+ "engines": {
197
+ "node": "^10 || ^12 || >=14"
198
+ }
199
+ },
200
+ "node_modules/postcss-value-parser": {
201
+ "version": "4.2.0",
202
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
203
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
204
+ "dev": true
205
+ },
206
+ "node_modules/source-map-js": {
207
+ "version": "1.2.1",
208
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
209
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
210
+ "dev": true,
211
+ "engines": {
212
+ "node": ">=0.10.0"
213
+ }
214
+ },
215
+ "node_modules/tailwindcss": {
216
+ "version": "4.2.2",
217
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz",
218
+ "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==",
219
+ "dev": true
220
+ },
221
+ "node_modules/update-browserslist-db": {
222
+ "version": "1.2.3",
223
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
224
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
225
+ "dev": true,
226
+ "funding": [
227
+ {
228
+ "type": "opencollective",
229
+ "url": "https://opencollective.com/browserslist"
230
+ },
231
+ {
232
+ "type": "tidelift",
233
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
234
+ },
235
+ {
236
+ "type": "github",
237
+ "url": "https://github.com/sponsors/ai"
238
+ }
239
+ ],
240
+ "dependencies": {
241
+ "escalade": "^3.2.0",
242
+ "picocolors": "^1.1.1"
243
+ },
244
+ "bin": {
245
+ "update-browserslist-db": "cli.js"
246
+ },
247
+ "peerDependencies": {
248
+ "browserslist": ">= 4.21.0"
249
+ }
250
+ }
251
+ }
252
+ }
package.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "devDependencies": {
3
+ "autoprefixer": "^10.4.27",
4
+ "postcss": "^8.5.8",
5
+ "tailwindcss": "^4.2.2"
6
+ }
7
+ }