From 2157c05293ff7858e55582a16a733c96d44b1bce Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 17:54:16 +0000 Subject: [PATCH 01/16] Updated app.py --- app.py | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..cc73fab --- /dev/null +++ b/app.py @@ -0,0 +1,257 @@ +import yaml +import tempfile +from flask import ( + Flask, + request, + render_template, + send_file, + jsonify, + url_for, +) +from werkzeug.middleware.proxy_fix import ProxyFix +import os +import subprocess +import logging +from datetime import datetime +from pathlib import Path + +from flask_cors import CORS + +# Configure logging +logging.basicConfig( + level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s" +) + +app = Flask(__name__) +app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1) +CORS(app, resources={r"/*": {"origins": "http://localhost:5173"}}) + +# Define paths for the project +PROJECT_ROOT = Path(__file__).parent.resolve() +ICONS_DIR = PROJECT_ROOT / "icons" +TEMPLATES_DIR = PROJECT_ROOT / "samples" / "modern" +OUTPUT_DIR = PROJECT_ROOT / "output" +os.makedirs(ICONS_DIR, exist_ok=True) +os.makedirs(OUTPUT_DIR, exist_ok=True) + +# Template file mapping +TEMPLATE_FILE_MAP = { + "modern-no-icons": TEMPLATES_DIR / "john_doe_no_icon.yml", + "modern-with-icons": TEMPLATES_DIR / "john_doe.yml", +} + + +@app.route("/api/templates", methods=["GET"]) +def get_templates(): + """ + Fetch available templates with metadata for display. + """ + try: + templates = [ + { + "id": "modern-no-icons", + "name": "Modern (No Icons)", + "description": "Simple and clean layout without icons.", + "image_url": url_for( + "serve_templates", filename="modern-no-icons.png", _external=True + ), + }, + { + "id": "modern-with-icons", + "name": "Modern (With Icons)", + "description": "Professional layout with decorative icons.", + "image_url": url_for( + "serve_templates", filename="modern-with-icons.png", _external=True + ), + }, + ] + return jsonify({"success": True, "templates": templates}) + except Exception as e: + logging.error(f"Error fetching templates: {e}") + return jsonify({"success": False, "error": "Failed to fetch templates"}), 500 + + +@app.route("/api/template/", methods=["GET"]) +def get_template_data(template_id): + """ + Fetch the YAML string for the specified template and determine if it supports icons. + """ + try: + # Map template ID to the file name + template_file = TEMPLATE_FILE_MAP.get(template_id) + if not template_file: + logging.warning(f"Template ID not mapped: {template_id}") + return jsonify({"success": False, "error": "Template not found"}), 404 + + # Construct the full path to the YAML file + template_path = TEMPLATES_DIR / template_file + if not template_path.exists(): + logging.warning(f"Template file not found: {template_path}") + return jsonify({"success": False, "error": "Template not found"}), 404 + + # Read the YAML content + with open(template_path, "r") as file: + yaml_content = yaml.safe_load(file) + + # Check if any section supports icons + supports_icons = any( + "icon" in item + for section in yaml_content.get("sections", []) + for item in section.get("content", []) + ) + + # Return the YAML content and supportsIcons flag + return jsonify( + { + "success": True, + "yaml": yaml.safe_dump(yaml_content), + "template_id": template_id, + "supportsIcons": supports_icons, + } + ) + except FileNotFoundError: + logging.warning(f"Template file not found for {template_id}") + return jsonify({"success": False, "error": "Template not found"}), 404 + except Exception as e: + logging.error(f"Error fetching template data for {template_id}: {e}") + return ( + jsonify({"success": False, "error": "Failed to fetch template data"}), + 500, + ) + + +@app.route("/api/template//download", methods=["GET"]) +def download_template(template_id): + """ + Download the YAML file for the specified template. + """ + try: + template_path = TEMPLATE_FILE_MAP.get(template_id) + if not template_path or not template_path.exists(): + logging.warning(f"Template not found for download: {template_id}") + return jsonify({"success": False, "error": "Template not found"}), 404 + + return send_file( + template_path, + as_attachment=True, + mimetype="application/x-yaml", + download_name=f"{template_id}.yml", + ) + except Exception as e: + logging.error(f"Error downloading template {template_id}: {e}") + return jsonify({"success": False, "error": "Failed to download template"}), 500 + + +@app.route("/api/generate", methods=["POST"]) +def generate_resume(): + """ + Generate a resume PDF from the uploaded YAML and optional icons. + """ + with tempfile.TemporaryDirectory() as temp_dir: + try: + # Paths for YAML and output + temp_dir_path = Path(temp_dir) + yaml_path = temp_dir_path / "input.yaml" + timestamp = datetime.now().strftime("%Y%m%d_%H_%M_%S") + output_path = temp_dir_path / f"Resume_{timestamp}.pdf" + + # Validate and save YAML file + yaml_file = request.files.get("yaml_file") + if not yaml_file or yaml_file.filename == "": + raise ValueError("No YAML file uploaded") + + yaml_file.save(yaml_path) + + # Handle icon files if provided + icon_files = request.files.getlist("icons") + for icon_file in icon_files: + if icon_file.filename == "": + continue + + # Validate icon file type + allowed_extensions = {"png", "jpg", "jpeg", "svg"} + if ( + "." not in icon_file.filename + or icon_file.filename.rsplit(".", 1)[1].lower() + not in allowed_extensions + ): + raise ValueError(f"Invalid icon file type: {icon_file.filename}") + + # Save icon to the icons directory + icon_path = ICONS_DIR / icon_file.filename + icon_file.save(icon_path) + + # Select the template + template = request.form.get("template", "modern") + valid_templates = ["modern", "classic", "minimal"] + if template not in valid_templates: + raise ValueError( + f"Invalid template: {template}. Available templates: {', '.join(valid_templates)}" + ) + + # Generate the resume using subprocess + result = subprocess.run( + [ + "python", + "resume_generator.py", + "--template", + template, + "--input", + str(yaml_path), + "--output", + str(output_path), + ], + capture_output=True, + text=True, + ) + + if result.returncode != 0: + logging.error("Resume generation error: %s", result.stderr.strip()) + raise RuntimeError("Failed to generate the resume") + + if not output_path.exists(): + raise FileNotFoundError("The generated resume file was not found") + + # Send the generated PDF file + return send_file(output_path, as_attachment=True) + + except ValueError as ve: + logging.warning("Validation error: %s", ve) + return jsonify({"success": False, "error": str(ve)}), 400 + except FileNotFoundError as fnfe: + logging.error("File error: %s", fnfe) + return jsonify({"success": False, "error": str(fnfe)}), 500 + except Exception as e: + logging.error("Unexpected error: %s", e) + return ( + jsonify({"success": False, "error": "An unexpected error occurred"}), + 500, + ) + + +@app.route("/download/") +def download_file(filename): + """ + Download a generated resume PDF. + """ + file_path = OUTPUT_DIR / filename + if file_path.exists(): + return send_file(file_path, as_attachment=True) + return jsonify({"success": False, "error": "File not found"}), 404 + + +@app.route("/docs/templates/") +def serve_templates(filename): + """ + Serve template images for display in the frontend. + """ + try: + template_image_dir = PROJECT_ROOT / "docs" / "templates" + return send_file(template_image_dir / filename) + except Exception as e: + logging.error(f"Error serving template image {filename}: {e}") + return jsonify({"success": False, "error": "Image not found"}), 404 + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000) From f97a41221aee937d7494ef554fd07de467d3f3f2 Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 17:54:28 +0000 Subject: [PATCH 02/16] Added docker ignore --- .dockerignore | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7a727f0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Ignore local environment and secrets +.env + +# Ignore runtime artifacts +*.pdf +*.log +*.tmp + +# Ignore IDE/Editor configuration and cache +.vscode/ +.idea/ +*.swp + +# Ignore Python cache files and directories +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Ignore node_modules, if applicable +node_modules/ From 63ced71c34fee92fa8d56c44535033de636e17a9 Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 17:54:42 +0000 Subject: [PATCH 03/16] Added dockerfile --- Dockerfile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index ac34d0d..887060c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,23 @@ # Use the official Python image as a base FROM python:3.9-slim -# Install wkhtmltopdf, xvfb, and other dependencies -RUN apt-get update && \ - apt-get install -y \ +# Install wkhtmltopdf and other dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ wkhtmltopdf \ - && apt-get clean + && apt-get clean && rm -rf /var/lib/apt/lists/* # Set the working directory WORKDIR /app -# Copy requirements and install Python dependencies +# Copy the requirements file and install dependencies COPY requirements.txt . -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt # Copy the application code into the container COPY . . -# Command to run the Python script through xvfb -CMD ["python", "resume_generator.py"] +# Expose the port that Cloud Run requires +EXPOSE 5000 + +# Command to run the app with gunicorn +CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"] From 66244748f5421c4ff589da1a158d89b1c2d278bd Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 17:55:58 +0000 Subject: [PATCH 04/16] Updated resume_generator.py --- resume_generator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resume_generator.py b/resume_generator.py index c4aea87..eccd76f 100644 --- a/resume_generator.py +++ b/resume_generator.py @@ -97,6 +97,7 @@ def generate_pdf(template_name, data, output_file): # Render HTML with data print("Rendering HTML with data...") + template = env.get_template("base.html") html_content = template.render( contact_info=contact_info, @@ -118,6 +119,7 @@ def generate_pdf(template_name, data, output_file): # Convert the HTML file to PDF with the enable-local-file-access option options = {"enable-local-file-access": ""} + print("Converting HTML file to PDF...") try: pdfkit.from_file(temp_html_file.as_posix(), output_file, options=options) From ef12111570798dab12462d08060e6a3a19942b8a Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 17:56:07 +0000 Subject: [PATCH 05/16] Updated requirements --- requirements.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ede748d..66e549c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,7 @@ pyyaml jinja2 pdfkit markdown2 -wkhtmltopdf \ No newline at end of file +wkhtmltopdf +flask +flask-cors +gunicorn \ No newline at end of file From c9188e8d347977d1203d8d26fd12fdc4f3101c0c Mon Sep 17 00:00:00 2001 From: Amit Afre Date: Tue, 31 Dec 2024 19:04:27 +0000 Subject: [PATCH 06/16] Added UI in React --- resume-builder-ui/README.md | 50 + resume-builder-ui/eslint.config.js | 28 + resume-builder-ui/index.html | 29 + resume-builder-ui/package-lock.json | 4271 +++++++++++++++++ resume-builder-ui/package.json | 39 + .../public/android-chrome-192x192.png | Bin 0 -> 16038 bytes .../public/android-chrome-512x512.png | Bin 0 -> 62191 bytes resume-builder-ui/public/apple-touch-icon.png | Bin 0 -> 15224 bytes resume-builder-ui/public/favicon-16x16.png | Bin 0 -> 641 bytes resume-builder-ui/public/favicon-32x32.png | Bin 0 -> 1456 bytes resume-builder-ui/public/favicon.ico | Bin 0 -> 15406 bytes resume-builder-ui/public/site.webmanifest | 31 + resume-builder-ui/src/App.css | 0 resume-builder-ui/src/App.tsx | 33 + resume-builder-ui/src/assets/react.svg | 1 + .../src/components/ContactInfoEditor.tsx | 44 + resume-builder-ui/src/components/Editor.tsx | 378 ++ .../src/components/EducationSection.tsx | 159 + .../src/components/ExperienceSection.tsx | 172 + resume-builder-ui/src/components/Footer.tsx | 43 + .../src/components/GenericSection.tsx | 147 + resume-builder-ui/src/components/Header.tsx | 52 + .../src/components/IconListSection.tsx | 115 + .../src/components/IconUpload.tsx | 82 + .../src/components/LandingPage.tsx | 235 + resume-builder-ui/src/components/Layout.tsx | 0 .../src/components/ResumePreview.tsx | 30 + .../src/components/SectionControls.tsx | 55 + .../src/components/SectionEditor.tsx | 178 + .../src/components/SectionTypeModal.tsx | 74 + .../src/components/TemplateCarousel.tsx | 133 + .../src/components/TemplateSelector.tsx | 31 + resume-builder-ui/src/main.tsx | 11 + resume-builder-ui/src/services/templates.ts | 63 + resume-builder-ui/src/styles.css | 49 + resume-builder-ui/src/vite-env.d.ts | 1 + resume-builder-ui/tailwind.config.js | 38 + resume-builder-ui/tsconfig.app.json | 26 + resume-builder-ui/tsconfig.json | 7 + resume-builder-ui/tsconfig.node.json | 24 + resume-builder-ui/vite.config.ts | 21 + 41 files changed, 6650 insertions(+) create mode 100644 resume-builder-ui/README.md create mode 100644 resume-builder-ui/eslint.config.js create mode 100644 resume-builder-ui/index.html create mode 100644 resume-builder-ui/package-lock.json create mode 100644 resume-builder-ui/package.json create mode 100644 resume-builder-ui/public/android-chrome-192x192.png create mode 100644 resume-builder-ui/public/android-chrome-512x512.png create mode 100644 resume-builder-ui/public/apple-touch-icon.png create mode 100644 resume-builder-ui/public/favicon-16x16.png create mode 100644 resume-builder-ui/public/favicon-32x32.png create mode 100644 resume-builder-ui/public/favicon.ico create mode 100644 resume-builder-ui/public/site.webmanifest create mode 100644 resume-builder-ui/src/App.css create mode 100644 resume-builder-ui/src/App.tsx create mode 100644 resume-builder-ui/src/assets/react.svg create mode 100644 resume-builder-ui/src/components/ContactInfoEditor.tsx create mode 100644 resume-builder-ui/src/components/Editor.tsx create mode 100644 resume-builder-ui/src/components/EducationSection.tsx create mode 100644 resume-builder-ui/src/components/ExperienceSection.tsx create mode 100644 resume-builder-ui/src/components/Footer.tsx create mode 100644 resume-builder-ui/src/components/GenericSection.tsx create mode 100644 resume-builder-ui/src/components/Header.tsx create mode 100644 resume-builder-ui/src/components/IconListSection.tsx create mode 100644 resume-builder-ui/src/components/IconUpload.tsx create mode 100644 resume-builder-ui/src/components/LandingPage.tsx create mode 100644 resume-builder-ui/src/components/Layout.tsx create mode 100644 resume-builder-ui/src/components/ResumePreview.tsx create mode 100644 resume-builder-ui/src/components/SectionControls.tsx create mode 100644 resume-builder-ui/src/components/SectionEditor.tsx create mode 100644 resume-builder-ui/src/components/SectionTypeModal.tsx create mode 100644 resume-builder-ui/src/components/TemplateCarousel.tsx create mode 100644 resume-builder-ui/src/components/TemplateSelector.tsx create mode 100644 resume-builder-ui/src/main.tsx create mode 100644 resume-builder-ui/src/services/templates.ts create mode 100644 resume-builder-ui/src/styles.css create mode 100644 resume-builder-ui/src/vite-env.d.ts create mode 100644 resume-builder-ui/tailwind.config.js create mode 100644 resume-builder-ui/tsconfig.app.json create mode 100644 resume-builder-ui/tsconfig.json create mode 100644 resume-builder-ui/tsconfig.node.json create mode 100644 resume-builder-ui/vite.config.ts diff --git a/resume-builder-ui/README.md b/resume-builder-ui/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/resume-builder-ui/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/resume-builder-ui/eslint.config.js b/resume-builder-ui/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/resume-builder-ui/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/resume-builder-ui/index.html b/resume-builder-ui/index.html new file mode 100644 index 0000000..ef672a6 --- /dev/null +++ b/resume-builder-ui/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + Easy Free Resume Builder - Create, Update, and Recreate ATS-Ready Resumes + Instantly โœ๏ธ๐Ÿ“„ + + + +
+ + + diff --git a/resume-builder-ui/package-lock.json b/resume-builder-ui/package-lock.json new file mode 100644 index 0000000..d80d08d --- /dev/null +++ b/resume-builder-ui/package-lock.json @@ -0,0 +1,4271 @@ +{ + "name": "resume-builder-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "resume-builder-ui", + "version": "0.0.0", + "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "axios": "^1.7.9", + "js-yaml": "^4.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.4.0", + "react-router-dom": "^7.0.2", + "react-toastify": "^11.0.2" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/js-yaml": "^4.0.9", + "@types/react": "^18.3.17", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.13.0", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.1", + "vite": "^6.0.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.0.tgz", + "integrity": "sha512-TnF0md3qWSRDlU96y9+0dd5RNrlXiQUp1K2pK1UpNmjeND+o9ts9Jxv3G6ntagkt8jVh0KAT1VYgU0nCz5gt2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.0.tgz", + "integrity": "sha512-L/7oX07eY6ACt2NXDrku1JIPdf9VGV/DI92EjAd8FRDzMMub5hXFpT1OegBqimJh9xy9Vv+nToaVtZp4Ku9SEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.0.tgz", + "integrity": "sha512-I1ZucWPVS96hjAsMSJiGosHTqMulMynrmTN+Xde5OsLcU5SjE0xylBmQ/DbB2psJ+HasINrJYz8HQpojtAw2eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.0.tgz", + "integrity": "sha512-CTZ+lHMsTbH1q/XLKzmnJWxl2r/1xdv7cnjwbi5v+95nVA1syikxWLvqur4nDoGDHjC8oNMBGurnQptpuFJHXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.0.tgz", + "integrity": "sha512-BB8+4OMzk2JiKL5+aK8A0pi9DPB5pkIBZWXr19+grdez9b0VKihvV432uSwuZLO0sI6zCyxak8NO3mZ1yjM1jA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.0.tgz", + "integrity": "sha512-Udz9Uh26uEE6phGMG2++TfpsLK/z4cYJqrIOyVhig/PMoWiZLghpjZUQvsAylsoztbpg0/QmplkDAyyVq0x6Jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.0.tgz", + "integrity": "sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.0.tgz", + "integrity": "sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.0.tgz", + "integrity": "sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.0.tgz", + "integrity": "sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.0.tgz", + "integrity": "sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.0.tgz", + "integrity": "sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.0.tgz", + "integrity": "sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.0.tgz", + "integrity": "sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.0.tgz", + "integrity": "sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.0.tgz", + "integrity": "sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.0.tgz", + "integrity": "sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.0.tgz", + "integrity": "sha512-4TQbLoAQVu9uE+cvh47JnjRZylXVdRCoOkRSVF2Rr2T0U1YwphGRjR0sHyRPEt95y3ETT4YFTTzQPq1O4bcjmw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.0.tgz", + "integrity": "sha512-GsFvcTZ7Yj9k94Qm0qgav7pxmQ7lQDR9NjoelRaxeV1UF6JSDfanR/2tHZ8hS7Ps4KPIVf5AElYPRPmN/Q0ZkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.1.tgz", + "integrity": "sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.17" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.10.1", + "@swc/core-darwin-x64": "1.10.1", + "@swc/core-linux-arm-gnueabihf": "1.10.1", + "@swc/core-linux-arm64-gnu": "1.10.1", + "@swc/core-linux-arm64-musl": "1.10.1", + "@swc/core-linux-x64-gnu": "1.10.1", + "@swc/core-linux-x64-musl": "1.10.1", + "@swc/core-win32-arm64-msvc": "1.10.1", + "@swc/core-win32-ia32-msvc": "1.10.1", + "@swc/core-win32-x64-msvc": "1.10.1" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz", + "integrity": "sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz", + "integrity": "sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz", + "integrity": "sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz", + "integrity": "sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz", + "integrity": "sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz", + "integrity": "sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz", + "integrity": "sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz", + "integrity": "sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz", + "integrity": "sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz", + "integrity": "sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz", + "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/core": "^1.7.26" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.17.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz", + "integrity": "sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-icons": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", + "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-router": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.0.2.tgz", + "integrity": "sha512-m5AcPfTRUcjwmhBzOJGEl6Y7+Crqyju0+TgTQxoS4SO+BkWbhOrcfZNq6wSWdl2BBbJbsAoBUb8ZacOFT+/JlA==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.0.2.tgz", + "integrity": "sha512-VJOQ+CDWFDGaWdrG12Nl+d7yHtLaurNgAQZVgaIy7/Xd+DojgmYLosFfZdGz1wpxmjJIAkAMVTKWcvkx1oggAw==", + "license": "MIT", + "dependencies": { + "react-router": "7.0.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-toastify": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.2.tgz", + "integrity": "sha512-GjHuGaiXMvbls3ywqv8XdWONwrcO4DXCJIY1zVLkHU73gEElKvTTXNI5Vom3s/k/M8hnkrfsqgBSX3OwmlonbA==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.0.tgz", + "integrity": "sha512-pdftUn12oB9Qlka+Vpyc39R28D4NsP9Sz6neepSrekofJmWzPD1sxcSO9hEOxFF8+7Kz3sHvwSkkRREI28M1/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.29.0", + "@rollup/rollup-android-arm64": "4.29.0", + "@rollup/rollup-darwin-arm64": "4.29.0", + "@rollup/rollup-darwin-x64": "4.29.0", + "@rollup/rollup-freebsd-arm64": "4.29.0", + "@rollup/rollup-freebsd-x64": "4.29.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.0", + "@rollup/rollup-linux-arm-musleabihf": "4.29.0", + "@rollup/rollup-linux-arm64-gnu": "4.29.0", + "@rollup/rollup-linux-arm64-musl": "4.29.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.0", + "@rollup/rollup-linux-riscv64-gnu": "4.29.0", + "@rollup/rollup-linux-s390x-gnu": "4.29.0", + "@rollup/rollup-linux-x64-gnu": "4.29.0", + "@rollup/rollup-linux-x64-musl": "4.29.0", + "@rollup/rollup-win32-arm64-msvc": "4.29.0", + "@rollup/rollup-win32-ia32-msvc": "4.29.0", + "@rollup/rollup-win32-x64-msvc": "4.29.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz", + "integrity": "sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.18.1", + "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/utils": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.5.tgz", + "integrity": "sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/resume-builder-ui/package.json b/resume-builder-ui/package.json new file mode 100644 index 0000000..5e27d9b --- /dev/null +++ b/resume-builder-ui/package.json @@ -0,0 +1,39 @@ +{ + "name": "resume-builder-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "axios": "^1.7.9", + "js-yaml": "^4.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.4.0", + "react-router-dom": "^7.0.2", + "react-toastify": "^11.0.2" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/js-yaml": "^4.0.9", + "@types/react": "^18.3.17", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.13.0", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.1", + "vite": "^6.0.3" + } +} diff --git a/resume-builder-ui/public/android-chrome-192x192.png b/resume-builder-ui/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c3cefed943af7dfb3ee64cca80c611131a306276 GIT binary patch literal 16038 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 literal 0 HcmV?d00001 diff --git a/resume-builder-ui/public/apple-touch-icon.png b/resume-builder-ui/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..08f3275c1cc255c492ca2038bda90555c236a8f5 GIT binary patch literal 15224 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 KMNUMnLSTY3;+*vW literal 0 HcmV?d00001 diff --git a/resume-builder-ui/public/favicon.ico b/resume-builder-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e1ab8bff1d92c71f8fe9cff45b944369d16792c GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/resume-builder-ui/public/site.webmanifest b/resume-builder-ui/public/site.webmanifest new file mode 100644 index 0000000..f0a3534 --- /dev/null +++ b/resume-builder-ui/public/site.webmanifest @@ -0,0 +1,31 @@ +{ + "name": "Easy Free Resume Builder", + "short_name": "Resume Builder", + "description": "Create professional, ATS-compliant resumes quickly and easily.", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#ffffff", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "/favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "/favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/resume-builder-ui/src/App.css b/resume-builder-ui/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/resume-builder-ui/src/App.tsx b/resume-builder-ui/src/App.tsx new file mode 100644 index 0000000..983ca2b --- /dev/null +++ b/resume-builder-ui/src/App.tsx @@ -0,0 +1,33 @@ +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import Header from "./components/Header"; +import Footer from "./components/Footer"; +import LandingPage from "./components/LandingPage"; +import TemplateCarousel from "./components/TemplateCarousel"; +import Editor from "./components/Editor"; + +export default function App() { + return ( + +
+ {/* Header */} +
+
+
+ + {/* Main Content */} +
+ + } /> + } /> + } /> + +
+ + {/* Footer */} +
+
+
+
+
+ ); +} diff --git a/resume-builder-ui/src/assets/react.svg b/resume-builder-ui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/resume-builder-ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resume-builder-ui/src/components/ContactInfoEditor.tsx b/resume-builder-ui/src/components/ContactInfoEditor.tsx new file mode 100644 index 0000000..2aa1077 --- /dev/null +++ b/resume-builder-ui/src/components/ContactInfoEditor.tsx @@ -0,0 +1,44 @@ +import React from "react"; + +interface ContactInfo { + name: string; + location: string; + email: string; + phone: string; + linkedin: string; +} + +const ContactInfoEditor: React.FC<{ + contactInfo: ContactInfo | null; + setContactInfo: (info: ContactInfo) => void; +}> = ({ contactInfo, setContactInfo }) => { + if (!contactInfo) return null; + + return ( +
+

Contact Information

+
+ {Object.keys(contactInfo).map((key) => ( +
+ + + setContactInfo({ + ...contactInfo, + [key]: e.target.value, + }) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+ ))} +
+
+ ); +}; + +export default ContactInfoEditor; diff --git a/resume-builder-ui/src/components/Editor.tsx b/resume-builder-ui/src/components/Editor.tsx new file mode 100644 index 0000000..7b0c341 --- /dev/null +++ b/resume-builder-ui/src/components/Editor.tsx @@ -0,0 +1,378 @@ +import React, { useEffect, useState, useRef } from "react"; +import { useLocation } from "react-router-dom"; +import { ToastContainer, toast } from "react-toastify"; +import { FaFileExport, FaFileImport, FaFilePdf, FaPlus } from "react-icons/fa"; +import { fetchTemplate, generateResume } from "../services/templates"; +import yaml from "js-yaml"; +import ExperienceSection from "./ExperienceSection"; +import EducationSection from "./EducationSection"; +import GenericSection from "./GenericSection"; +import IconListSection from "./IconListSection"; +import SectionTypeModal from "./SectionTypeModal"; + +interface Section { + name: string; + type?: string; + content: any; +} + +interface ContactInfo { + name: string; + location: string; + email: string; + phone: string; + linkedin: string; +} + +const Editor: React.FC = () => { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const templateId = queryParams.get("template"); + + const [contactInfo, setContactInfo] = useState(null); + const [sections, setSections] = useState([]); + const [supportsIcons, setSupportsIcons] = useState(false); // Dynamically set + const [loading, setLoading] = useState(true); + const [generating, setGenerating] = useState(false); + const [editingTitleIndex, setEditingTitleIndex] = useState( + null + ); + const [temporaryTitle, setTemporaryTitle] = useState(""); + const [showModal, setShowModal] = useState(false); + const newSectionRef = useRef(null); + + useEffect(() => { + if (!templateId) { + console.error("Template ID is undefined."); + return; + } + + const loadTemplate = async () => { + try { + setLoading(true); + const { yaml: yamlString, supportsIcons } = await fetchTemplate( + templateId + ); + const parsedYaml = yaml.load(yamlString) as { + contact_info: ContactInfo; + sections: Section[]; + }; + setContactInfo(parsedYaml.contact_info); + setSections(parsedYaml.sections); + setSupportsIcons(supportsIcons); + } catch (error) { + console.error("Error fetching template:", error); + toast.error("Failed to load template."); + } finally { + setLoading(false); + } + }; + + loadTemplate(); + }, [templateId]); + + const processSections = (sections: Section[]) => { + return sections.map((section) => { + if (["Experience", "Education"].includes(section.name)) { + const updatedContent = Array.isArray(section.content) + ? section.content.map((item: any) => { + const { icon, iconFile, ...rest } = item; + return icon ? { ...rest, icon } : rest; + }) + : section.content; + + return { + ...section, + content: updatedContent, + }; + } + return section; + }); + }; + + const handleUpdateSection = (index: number, updatedSection: Section) => { + const updatedSections = [...sections]; + updatedSections[index] = updatedSection; + setSections(updatedSections); + }; + + const handleTitleEdit = (index: number) => { + setEditingTitleIndex(index); + setTemporaryTitle(sections[index].name); + }; + + const handleTitleSave = () => { + if (editingTitleIndex === null) return; + const updatedSections = [...sections]; + updatedSections[editingTitleIndex].name = temporaryTitle; + setSections(updatedSections); + setEditingTitleIndex(null); + }; + + const handleTitleCancel = () => { + setTemporaryTitle(""); + setEditingTitleIndex(null); + }; + + const handleDeleteSection = (index: number) => { + const updatedSections = sections.filter((_, i) => i !== index); + setSections(updatedSections); + }; + + const handleAddSection = (type: string) => { + const defaultContent = [ + "bulleted-list", + "inline-list", + "dynamic-column-list", + ].includes(type) + ? [] + : ""; + + const newSection: Section = { + name: "New Section", + type: type, + content: defaultContent, + }; + + setSections((prevSections) => [...prevSections, newSection]); + setShowModal(false); + setTimeout(() => { + newSectionRef.current?.scrollIntoView({ behavior: "smooth" }); + }, 100); + }; + + const handleExportYAML = () => { + const processedSections = processSections(sections); + const yamlData = yaml.dump({ + contact_info: contactInfo, + sections: processedSections, + }); + const blob = new Blob([yamlData], { type: "application/x-yaml" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = "resume.yaml"; + link.click(); + }; + + const handleImportYAML = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (e) => { + try { + const parsedYaml = yaml.load(e.target?.result as string) as { + contact_info: ContactInfo; + sections: Section[]; + }; + setContactInfo(parsedYaml.contact_info); + setSections(parsedYaml.sections); + } catch (error) { + console.error("Error parsing YAML file:", error); + } + }; + reader.readAsText(file); + }; + + const handleGenerateResume = async () => { + try { + setGenerating(true); + const processedSections = processSections(sections); + + const yamlData = yaml.dump({ + contact_info: contactInfo, + sections: processedSections, + }); + + const formData = new FormData(); + const yamlBlob = new Blob([yamlData], { type: "application/x-yaml" }); + formData.append("yaml_file", yamlBlob, "resume.yaml"); + + sections.forEach((section) => { + if ( + ["Experience", "Education"].includes(section.name) && + Array.isArray(section.content) + ) { + section.content.forEach((item: any) => { + if (item.icon && item.iconFile) { + formData.append("icons", item.iconFile, item.icon); + } + }); + } + }); + + const { pdfBlob } = await generateResume(formData); + + const pdfUrl = URL.createObjectURL(pdfBlob); + const link = document.createElement("a"); + link.href = pdfUrl; + link.download = "resume.pdf"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + toast.success("Resume generated successfully!"); + } catch (error) { + console.error("Error generating resume:", error); + const errorMessage = + error instanceof Error ? error.message : "Unknown error"; + toast.error(`Error generating resume: ${errorMessage}`); + } finally { + setGenerating(false); + } + }; + + if (!templateId) { + return ( +

+ Invalid template ID. Please select a template. +

+ ); + } + + if (loading) return

Loading...

; + + return ( +
+ + +
+ + + +
+ +
+

Contact Information

+ {contactInfo && ( +
+ {Object.keys(contactInfo).map((key) => ( +
+ + + setContactInfo({ ...contactInfo, [key]: e.target.value }) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+ ))} +
+ )} +
+ {sections.map((section, index) => { + if (section.name === "Experience") { + return ( + + handleUpdateSection(index, { + ...section, + content: updatedExperiences, + }) + } + supportsIcons={supportsIcons} + /> + ); + } else if (section.name === "Education") { + return ( + + handleUpdateSection(index, { + ...section, + content: updatedEducation, + }) + } + supportsIcons={supportsIcons} + /> + ); + } else if (section.type === "icon-list") { + return ( + + handleUpdateSection(index, { + ...section, + content: updatedContent, + }) + } + /> + ); + } else { + return ( +
+ + handleUpdateSection(index, updatedSection) + } + onEditTitle={() => handleTitleEdit(index)} + onSaveTitle={handleTitleSave} + onCancelTitle={handleTitleCancel} + onDelete={() => handleDeleteSection(index)} + isEditing={editingTitleIndex === index} + temporaryTitle={temporaryTitle} + setTemporaryTitle={setTemporaryTitle} + /> +
+ ); + } + })} + +
+ +
+ + {showModal && ( + setShowModal(false)} + onSelect={handleAddSection} + /> + )} +
+ ); +}; + +export default Editor; diff --git a/resume-builder-ui/src/components/EducationSection.tsx b/resume-builder-ui/src/components/EducationSection.tsx new file mode 100644 index 0000000..443b7d5 --- /dev/null +++ b/resume-builder-ui/src/components/EducationSection.tsx @@ -0,0 +1,159 @@ +import React from "react"; +import IconUpload from "./IconUpload"; + +interface EducationItem { + degree: string; + school: string; + year: string; + field_of_study?: string; + icon?: string; + iconFile?: File; // Added to track the actual file object for upload +} + +interface EducationSectionProps { + education: EducationItem[]; + onUpdate: (updatedEducation: EducationItem[]) => void; + supportsIcons?: boolean; +} + +const EducationSection: React.FC = ({ + education, + onUpdate, + supportsIcons = false, +}) => { + const handleUpdateItem = ( + index: number, + key: keyof EducationItem, + value: string | File | null + ) => { + const updatedEducation = [...education]; + updatedEducation[index] = { ...updatedEducation[index], [key]: value }; + onUpdate(updatedEducation); + }; + + const handleAddItem = () => { + const newEducation: EducationItem = { + degree: "", + school: "", + year: "", + field_of_study: "", + icon: "", + iconFile: undefined, + }; + onUpdate([...education, newEducation]); + }; + + const handleRemoveItem = (index: number) => { + const updatedEducation = [...education]; + updatedEducation.splice(index, 1); + onUpdate(updatedEducation); + }; + + const handleIconUpload = (index: number, renamedIcon: string, file: File) => { + handleUpdateItem(index, "icon", renamedIcon); + handleUpdateItem(index, "iconFile", file); + }; + + const handleIconClear = (index: number) => { + handleUpdateItem(index, "icon", null); + handleUpdateItem(index, "iconFile", null); + }; + + return ( +
+

Education

+ {education.map((item, index) => ( +
+
+

Entry {index + 1}

+ +
+
+ {/* Icon Upload Section */} + {supportsIcons && ( +
+ + handleIconUpload(index, renamedIcon, file) + } + onClear={() => handleIconClear(index)} + /> +
+ )} + {/* Other Fields */} +
+
+ + + handleUpdateItem(index, "degree", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ + + handleUpdateItem(index, "school", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ + + handleUpdateItem(index, "year", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ + + handleUpdateItem(index, "field_of_study", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+
+
+ ))} + +
+ ); +}; + +export default EducationSection; diff --git a/resume-builder-ui/src/components/ExperienceSection.tsx b/resume-builder-ui/src/components/ExperienceSection.tsx new file mode 100644 index 0000000..ac6b6fb --- /dev/null +++ b/resume-builder-ui/src/components/ExperienceSection.tsx @@ -0,0 +1,172 @@ +import React from "react"; + +interface ExperienceItem { + company: string; + title: string; + dates: string; + description: string[]; +} + +interface ExperienceSectionProps { + experiences: ExperienceItem[]; + onUpdate: (updatedExperiences: ExperienceItem[]) => void; + supportsIcons?: boolean; +} + +const ExperienceSection: React.FC = ({ + experiences, + onUpdate, +}) => { + const handleUpdateField = ( + index: number, + field: keyof ExperienceItem, + value: any + ) => { + const updatedExperiences = [...experiences]; + updatedExperiences[index] = { + ...updatedExperiences[index], + [field]: value, + }; + onUpdate(updatedExperiences); + }; + + const handleAddDescription = (index: number) => { + const updatedExperiences = [...experiences]; + updatedExperiences[index].description.push(""); + onUpdate(updatedExperiences); + }; + + const handleUpdateDescription = ( + expIndex: number, + descIndex: number, + value: string + ) => { + const updatedExperiences = [...experiences]; + updatedExperiences[expIndex].description[descIndex] = value; + onUpdate(updatedExperiences); + }; + + const handleRemoveDescription = (expIndex: number, descIndex: number) => { + const updatedExperiences = [...experiences]; + updatedExperiences[expIndex].description.splice(descIndex, 1); + onUpdate(updatedExperiences); + }; + + const handleAddExperience = () => { + const newExperience: ExperienceItem = { + company: "", + title: "", + dates: "", + description: [], + }; + onUpdate([...experiences, newExperience]); + }; + + const handleRemoveExperience = (index: number) => { + const updatedExperiences = [...experiences]; + updatedExperiences.splice(index, 1); + onUpdate(updatedExperiences); + }; + + return ( +
+

Experience

+ {experiences.map((experience, index) => ( +
+
+

Experience #{index + 1}

+ +
+ +
+ + + handleUpdateField(index, "company", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+ +
+ + + handleUpdateField(index, "title", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+ +
+ + + handleUpdateField(index, "dates", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+ +
+ + {experience.description.map((desc, descIndex) => ( +
+ + handleUpdateDescription(index, descIndex, e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> + +
+ ))} + +
+
+ ))} + +
+ ); +}; + +export default ExperienceSection; diff --git a/resume-builder-ui/src/components/Footer.tsx b/resume-builder-ui/src/components/Footer.tsx new file mode 100644 index 0000000..236fe44 --- /dev/null +++ b/resume-builder-ui/src/components/Footer.tsx @@ -0,0 +1,43 @@ +import { FaShieldAlt, FaLock, FaUsers } from "react-icons/fa"; + +export default function Footer() { + return ( +
+ ); +} diff --git a/resume-builder-ui/src/components/GenericSection.tsx b/resume-builder-ui/src/components/GenericSection.tsx new file mode 100644 index 0000000..c5fc410 --- /dev/null +++ b/resume-builder-ui/src/components/GenericSection.tsx @@ -0,0 +1,147 @@ +import React from "react"; + +interface Section { + name: string; + type?: string; + content: any; +} + +interface GenericSectionProps { + section: Section; + onUpdate: (updatedSection: Section) => void; + onEditTitle: () => void; + onSaveTitle: () => void; + onCancelTitle: () => void; + onDelete: () => void; + isEditing: boolean; + temporaryTitle: string; + setTemporaryTitle: (title: string) => void; +} + +const GenericSection: React.FC = ({ + section, + onUpdate, + onEditTitle, + onSaveTitle, + onCancelTitle, + onDelete, + isEditing, + temporaryTitle, + setTemporaryTitle, +}) => { + const handleContentChange = (value: string | string[], index?: number) => { + if (Array.isArray(section.content)) { + const updatedContent = [...section.content]; + if (index !== undefined) { + updatedContent[index] = value as string; + } else { + updatedContent.push(value as string); + } + onUpdate({ ...section, content: updatedContent }); + } else { + onUpdate({ ...section, content: value }); + } + }; + + const handleRemoveItem = (index: number) => { + const updatedContent = section.content.filter( + (_: string, i: number) => i !== index + ); + onUpdate({ ...section, content: updatedContent }); + }; + + return ( +
+
+ {isEditing ? ( +
+ setTemporaryTitle(e.target.value)} + className="border border-gray-300 rounded-lg p-2 w-full" + autoFocus + /> + + +
+ ) : ( +

+ {section.name} + +

+ )} + +
+ +
+ {section.type === "text" && ( + + )} + {["bulleted-list", "inline-list", "dynamic-column-list"].includes( + section.type || "" + ) && ( + <> + {Array.isArray(section.content) && + section.content.map((item: string, index: number) => ( +
+ handleContentChange(e.target.value, index)} + className="w-full border border-gray-300 rounded-lg p-2" + /> + +
+ ))} + + + )} +
+
+ ); +}; + +export default GenericSection; diff --git a/resume-builder-ui/src/components/Header.tsx b/resume-builder-ui/src/components/Header.tsx new file mode 100644 index 0000000..1d69cf4 --- /dev/null +++ b/resume-builder-ui/src/components/Header.tsx @@ -0,0 +1,52 @@ +import { useLocation, useNavigate } from "react-router-dom"; +import logo from "/android-chrome-192x192.png"; + +export default function Header() { + const location = useLocation(); + const navigate = useNavigate(); + + const getPageTitle = () => { + switch (location.pathname) { + case "/templates": + return "Select Your Template"; + case "/editor": + return "Edit Your Resume"; + default: + return ""; + } + }; + + return ( +
+
+ {/* Logo and Home Navigation */} +
navigate("/")} + > + EasyFreeResume Logo + + EasyFreeResume + +
+ + {/* Dynamic Page Title */} +
+

+ {getPageTitle()} +

+
+ + {/* Action Button (only on the home page) */} + {location.pathname === "/" && ( + + )} +
+
+ ); +} diff --git a/resume-builder-ui/src/components/IconListSection.tsx b/resume-builder-ui/src/components/IconListSection.tsx new file mode 100644 index 0000000..619c96b --- /dev/null +++ b/resume-builder-ui/src/components/IconListSection.tsx @@ -0,0 +1,115 @@ +import React from "react"; + +interface Certification { + certification: string; + issuer: string; + date: string; + icon?: string; +} + +interface IconListSectionProps { + data: Certification[]; + onUpdate: (updatedData: Certification[]) => void; +} + +const IconListSection: React.FC = ({ + data, + onUpdate, +}) => { + const handleUpdateItem = ( + index: number, + field: keyof Certification, + value: string + ) => { + const updatedData = [...data]; + updatedData[index] = { ...updatedData[index], [field]: value }; + onUpdate(updatedData); + }; + + const handleAddItem = () => { + const newItem: Certification = { + certification: "", + issuer: "", + date: "", + icon: "", + }; + onUpdate([...data, newItem]); + }; + + const handleRemoveItem = (index: number) => { + const updatedData = data.filter((_, i) => i !== index); + onUpdate(updatedData); + }; + + return ( +
+

Certifications

+ {data.length > 0 ? ( + data.map((item, index) => ( +
+
+
+ + + handleUpdateItem(index, "certification", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ + + handleUpdateItem(index, "issuer", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ + + handleUpdateItem(index, "date", e.target.value) + } + className="w-full border border-gray-300 rounded-lg p-2" + /> +
+
+ +
+ )) + ) : ( +

+ No certifications added yet. Use the button below to add a new one. +

+ )} + +
+ ); +}; + +export default IconListSection; diff --git a/resume-builder-ui/src/components/IconUpload.tsx b/resume-builder-ui/src/components/IconUpload.tsx new file mode 100644 index 0000000..06c36e3 --- /dev/null +++ b/resume-builder-ui/src/components/IconUpload.tsx @@ -0,0 +1,82 @@ +import React, { useState } from "react"; +import { FaPencilAlt, FaTimes, FaImage } from "react-icons/fa"; + +interface IconUploadProps { + onUpload: (renamedIcon: string, file: File) => void; // Callback with the renamed file and file object + onClear?: () => void; // Optional, for clearing the uploaded icon +} + +const IconUpload: React.FC = ({ onUpload, onClear }) => { + const [iconPreview, setIconPreview] = useState(null); // Default to null + + const generateRandomId = (): string => { + return Math.random().toString(36).substring(2, 15); + }; + + const handleIconChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + // Generate a random file name + const fileExtension = file.name.split(".").pop()?.toLowerCase(); + const renamedFileName = `${generateRandomId()}.${fileExtension}`; + + // Show preview + const reader = new FileReader(); + reader.onload = () => setIconPreview(reader.result as string); + reader.readAsDataURL(file); + + // Notify parent with renamed file and file object + onUpload(renamedFileName, file); + }; + + const handleClear = () => { + setIconPreview(null); // Clear preview + if (onClear) { + onClear(); // Notify parent to clear the icon + } + }; + + return ( +
+ + {/* Clear Icon */} + {iconPreview && ( + + )} +
+ ); +}; + +export default IconUpload; diff --git a/resume-builder-ui/src/components/LandingPage.tsx b/resume-builder-ui/src/components/LandingPage.tsx new file mode 100644 index 0000000..b594975 --- /dev/null +++ b/resume-builder-ui/src/components/LandingPage.tsx @@ -0,0 +1,235 @@ +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; + +const LandingPage: React.FC = () => { + const navigate = useNavigate(); + + // Calculate realistic resumes created based on the date + const calculateResumesCreated = (): number => { + const today = new Date(); + const year = today.getFullYear(); + const month = today.getMonth() + 1; // Months are 0-indexed + const day = today.getDate(); + return year * 25 + day + month + 1993; // Offset of 1993 for uniqueness + }; + + // Animated resumes created state + const [resumesCreated, setResumesCreated] = useState(0); + const finalResumesCreated = calculateResumesCreated(); + + useEffect(() => { + // Animate resumes created stat + const step = Math.ceil(finalResumesCreated / 50); // Adjust step for smooth animation + let current = 0; + + const interval = setInterval(() => { + current += step; + if (current >= finalResumesCreated) { + setResumesCreated(finalResumesCreated); + clearInterval(interval); + } else { + setResumesCreated(current); + } + }, 30); // Adjust animation speed + + return () => clearInterval(interval); + }, [finalResumesCreated]); + + return ( +
+ {/* Header Section */} +
+

+ Create Your Professional Resume in Minutes -{" "} + 100% Free +

+

+ Build an ATS-friendly resume that lands more interviews. No sign-up + required. Free forever. +

+
+ + +
+
+ + {/* Animated Stats */} +
+
+

+ {resumesCreated}+ +

+

Resumes Created

+
+
+

4.9/5

+

User Rating

+
+
+ + {/* Why Job Seekers Choose Us */} + {/* Why Job Seekers Choose Us */} +
+

+ Why Job Seekers Choose Us +

+
+ {[ + { + icon: "๐Ÿ› ๏ธ", // You can replace these emoji icons with actual SVG/FontAwesome icons + title: "ATS-Optimized Templates", + description: + "Our templates are rigorously tested to pass Applicant Tracking Systems, ensuring your resume lands where it matters.", + }, + { + icon: "โœจ", + title: "Effortless Customization", + description: + "Enjoy a drag-and-drop interface with real-time previews, making your resume creation seamless and fun.", + }, + { + icon: "โฑ๏ธ", + title: "Instant PDF Downloads", + description: + "Export your polished resumes in seconds, ready for your next big opportunity.", + }, + { + icon: "๐ŸŽจ", + title: "Professional Designs", + description: + "Choose from a range of stylish and industry-standard templates tailored to impress hiring managers.", + }, + { + icon: "๐Ÿ”’", + title: "Secure and Private", + description: + "Your data is SSL encrypted and GDPR compliant. We value your privacy as much as you do.", + }, + { + icon: "๐Ÿ“„", + title: "Unlimited Resumes", + description: + "Create and download as many resumes as you needโ€”absolutely free and without limits.", + }, + ].map((item, index) => ( +
+
+ {item.icon} +
+

+ {item.title} +

+

{item.description}

+
+ ))} +
+
+ + {/* Testimonials Section */} +
+

+ What Our Users Say +

+
+ {[ + { + img: "https://i.pravatar.cc/100?u=user1", + quote: + "Got my dream job within 2 weeks of using this resume builder!", + name: "Marketing Professional", + }, + { + img: "https://i.pravatar.cc/100?u=user26", + quote: + "The platform is incredibly easy to use and provides stunning results.", + name: "Software Engineer", + }, + { + img: "https://i.pravatar.cc/100?u=user3", + quote: "Quick, professional, and effective. Highly recommend!", + name: "HR Manager", + }, + ].map((testimonial, index) => ( +
+ User +

"{testimonial.quote}"

+

+ - {testimonial.name} +

+
+ {[...Array(5)].map((_, i) => ( + + ★ + + ))} +
+
+ ))} +
+
+ + {/* FAQ Section */} +
+

+ Frequently Asked Questions +

+
+ {[ + { + question: "Is EasyFreeResume really free?", + answer: + "Yes, our resume builder is 100% free with no hidden costs. Create and download as many resumes as you need.", + }, + { + question: "How do I create an ATS-friendly resume?", + answer: + "Our templates are specifically designed to pass ATS systems. Just choose a template and fill in your details.", + }, + { + question: "Can I download my resume as PDF?", + answer: + "Yes, you can download your resume in PDF format, which is perfect for job applications.", + }, + { + question: "Do I need to create an account?", + answer: + "No account needed! Start creating your resume right away without any sign-up process.", + }, + ].map((faq, index) => ( +
+

+ {faq.question} +

+

{faq.answer}

+
+ ))} +
+
+
+ ); +}; + +export default LandingPage; diff --git a/resume-builder-ui/src/components/Layout.tsx b/resume-builder-ui/src/components/Layout.tsx new file mode 100644 index 0000000..e69de29 diff --git a/resume-builder-ui/src/components/ResumePreview.tsx b/resume-builder-ui/src/components/ResumePreview.tsx new file mode 100644 index 0000000..70a8f8c --- /dev/null +++ b/resume-builder-ui/src/components/ResumePreview.tsx @@ -0,0 +1,30 @@ +import React from "react"; + +const ResumePreview: React.FC<{ fields: Record }> = ({ + fields, +}) => { + return ( +
+

Resume Preview

+
+

+ Name: {fields.name} +

+

+ Email: {fields.email} +

+

+ Phone: {fields.phone} +

+

+ Summary: {fields.summary} +

+

+ Experience: {fields.experience} +

+
+
+ ); +}; + +export default ResumePreview; diff --git a/resume-builder-ui/src/components/SectionControls.tsx b/resume-builder-ui/src/components/SectionControls.tsx new file mode 100644 index 0000000..7ddb5e0 --- /dev/null +++ b/resume-builder-ui/src/components/SectionControls.tsx @@ -0,0 +1,55 @@ +import React from "react"; + +const SectionControls: React.FC<{ + sectionIndex: number; + sections: any[]; + setSections: (sections: any[]) => void; +}> = ({ sectionIndex, sections, setSections }) => { + const moveSection = (fromIndex: number, toIndex: number) => { + const newSections = [...sections]; + const [removedSection] = newSections.splice(fromIndex, 1); + newSections.splice(toIndex, 0, removedSection); + setSections(newSections); + }; + + const deleteSection = () => { + const newSections = [...sections]; + newSections.splice(sectionIndex, 1); + setSections(newSections); + }; + + return ( +
+ + + +
+ ); +}; + +export default SectionControls; diff --git a/resume-builder-ui/src/components/SectionEditor.tsx b/resume-builder-ui/src/components/SectionEditor.tsx new file mode 100644 index 0000000..c8e72a9 --- /dev/null +++ b/resume-builder-ui/src/components/SectionEditor.tsx @@ -0,0 +1,178 @@ +import React, { useState } from "react"; +import SectionControls from "./SectionControls"; + +interface Section { + name: string; + type: string; + content: any; +} + +const SectionEditor: React.FC<{ + section: Section; + sectionIndex: number; + sections: Section[]; + setSections: (sections: Section[]) => void; +}> = ({ section, sectionIndex, sections, setSections }) => { + const fixedSections = ["Contact Information", "Education", "Experience"]; + const isFixedSection = fixedSections.includes(section.name); + + const [isEditingName, setIsEditingName] = useState(false); + const [newName, setNewName] = useState(section.name); + + const handleSaveName = () => { + const updatedSections = [...sections]; + updatedSections[sectionIndex].name = newName; + setSections(updatedSections); + setIsEditingName(false); // Exit edit mode + }; + + const handleCancelEdit = () => { + setNewName(section.name); // Reset to original name + setIsEditingName(false); // Exit edit mode + }; + + return ( +
+ {/* Section Title */} +
+
+ {isEditingName && !isFixedSection ? ( + <> + setNewName(e.target.value)} + className="text-xl font-semibold border border-gray-300 rounded-lg p-2" + autoFocus + /> + + + + ) : ( +

+ Section: {section.name} + {!isFixedSection && ( + + )} +

+ )} +
+
+ + {/* Section Controls */} + {!isFixedSection && ( + + )} + + {/* Section Type */} +
+ + +
+ + {/* Section Content */} +
+ + {Array.isArray(section.content) ? ( + section.content.map((item: string, itemIndex: number) => ( +
+ { + const updatedSections = [...sections]; + updatedSections[sectionIndex].content[itemIndex] = + e.target.value; + setSections(updatedSections); + }} + className="w-full border border-gray-300 rounded-lg p-2" + /> + +
+ )) + ) : ( + + )} + {Array.isArray(section.content) && ( + + )} +
+
+ ); +}; + +export default SectionEditor; diff --git a/resume-builder-ui/src/components/SectionTypeModal.tsx b/resume-builder-ui/src/components/SectionTypeModal.tsx new file mode 100644 index 0000000..56da267 --- /dev/null +++ b/resume-builder-ui/src/components/SectionTypeModal.tsx @@ -0,0 +1,74 @@ +import React from "react"; + +interface SectionTypeModalProps { + onClose: () => void; + onSelect: (type: string) => void; +} + +const SectionTypeModal: React.FC = ({ + onClose, + onSelect, +}) => { + const sectionTypes = [ + { + type: "text", + title: "Text Section", + description: "A simple text block for single-paragraph sections.", + useFor: "Summary, Objective, About Me, Career Goal, Personal Statement", + }, + { + type: "bulleted-list", + title: "Bulleted List", + description: "A bulleted list format for multiple items.", + useFor: + "Technical Skills, Hobbies, Key Achievements, Certifications, Volunteer Work, Strengths", + }, + { + type: "inline-list", + title: "Inline List", + description: "A compact, single-line list without bullets.", + useFor: + "Key Skills, Software Proficiencies, Technologies, Languages, Personal Interests", + }, + { + type: "dynamic-column-list", + title: "Dynamic Column List", + description: "Automatically adjusts columns for space efficiency.", + useFor: + "Technical Skills, Certifications, Tools, Key Projects, Accomplishments", + }, + ]; + + return ( +
+
+

Select Section Type

+
+ {sectionTypes.map((section) => ( +
onSelect(section.type)} + > +

{section.title}

+

+ {section.description} +

+

+ Use for: {section.useFor} +

+
+ ))} +
+ +
+
+ ); +}; + +export default SectionTypeModal; diff --git a/resume-builder-ui/src/components/TemplateCarousel.tsx b/resume-builder-ui/src/components/TemplateCarousel.tsx new file mode 100644 index 0000000..186dbc8 --- /dev/null +++ b/resume-builder-ui/src/components/TemplateCarousel.tsx @@ -0,0 +1,133 @@ +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { fetchTemplates } from "../services/templates"; + +interface Template { + id: string; + name: string; + description: string; + image_url: string; +} + +const TemplateCarousel: React.FC = () => { + const [templates, setTemplates] = useState([]); + const [selectedTemplate, setSelectedTemplate] = useState