diff --git a/.gitignore b/.gitignore index f50d8292..475c61d6 100644 --- a/.gitignore +++ b/.gitignore @@ -93,12 +93,18 @@ __pycache__/ *.py[cod] *$py.class *.so + +# Frontend static build output +src/frontend_static/ +frontend_static/ +*db .Python build/ dist/ downloads/ eggs/ .eggs/ +src/test_ref* lib/ lib64/ parts/ diff --git a/src/backend/src/api/__init__.py b/src/backend/src/api/__init__.py index 59ddf7d9..56b9f5e3 100644 --- a/src/backend/src/api/__init__.py +++ b/src/backend/src/api/__init__.py @@ -44,6 +44,7 @@ from src.api.documentation_embeddings_router import router as documentation_embeddings_router from src.api.database_management_router import router as database_management_router from src.api.genie_router import router as genie_router +from src.api.powerbi_routes import router as powerbi_router # Create the main API router api_router = APIRouter() @@ -93,6 +94,7 @@ api_router.include_router(documentation_embeddings_router) api_router.include_router(database_management_router) api_router.include_router(genie_router) +api_router.include_router(powerbi_router) __all__ = [ "api_router", @@ -138,5 +140,6 @@ "memory_backend_router", "documentation_embeddings_router", "database_management_router", - "genie_router" + "genie_router", + "powerbi_router" ] diff --git a/src/backend/src/api/powerbi_routes.py b/src/backend/src/api/powerbi_routes.py new file mode 100644 index 00000000..1b091390 --- /dev/null +++ b/src/backend/src/api/powerbi_routes.py @@ -0,0 +1,168 @@ +""" +Power BI API Routes + +API endpoints for Power BI DAX query generation. +""" + +import logging +from typing import Any, Dict + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession + +from src.core.dependencies import get_db, get_group_context +from src.utils.user_context import GroupContext +from src.schemas.powerbi import ( + DAXGenerationRequest, + DAXGenerationResponse, + QuestionSuggestionRequest, + QuestionSuggestionResponse, +) +from src.services.dax_generator_service import DAXGeneratorService + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/powerbi", tags=["Power BI"]) + + +@router.post("/generate-dax", response_model=DAXGenerationResponse) +async def generate_dax( + request: DAXGenerationRequest, + db: AsyncSession = Depends(get_db), + group_context: GroupContext = Depends(get_group_context) +) -> Any: + """ + Generate a DAX query from a natural language question. + + This endpoint takes a natural language question and Power BI dataset metadata, + then generates an executable DAX query using LLMs. + + Args: + request: DAX generation request with question and metadata + db: Database session + group_context: Group context for multi-tenancy + + Returns: + Generated DAX query with explanation and confidence score + + Example: + ```json + { + "question": "What is the total NSR per product?", + "metadata": { + "tables": [ + { + "name": "Products", + "columns": [ + {"name": "ProductID", "data_type": "int"}, + {"name": "ProductName", "data_type": "string"}, + {"name": "NSR", "data_type": "decimal"} + ] + } + ] + }, + "model_name": "databricks-meta-llama-3-1-405b-instruct", + "temperature": 0.1 + } + ``` + """ + try: + logger.info(f"Generating DAX for question: {request.question}") + + # Initialize service + service = DAXGeneratorService(db) + + # Generate DAX query + if request.sample_data: + result = await service.generate_dax_with_samples( + question=request.question, + metadata=request.metadata, + sample_data=request.sample_data, + model_name=request.model_name, + temperature=request.temperature + ) + else: + result = await service.generate_dax_from_question( + question=request.question, + metadata=request.metadata, + model_name=request.model_name, + temperature=request.temperature + ) + + logger.info(f"Successfully generated DAX query (confidence: {result['confidence']:.0%})") + + return DAXGenerationResponse(**result) + + except Exception as e: + logger.error(f"Error generating DAX: {str(e)}", exc_info=True) + raise HTTPException( + status_code=500, + detail=f"Failed to generate DAX query: {str(e)}" + ) + + +@router.post("/suggest-questions", response_model=QuestionSuggestionResponse) +async def suggest_questions( + request: QuestionSuggestionRequest, + db: AsyncSession = Depends(get_db), + group_context: GroupContext = Depends(get_group_context) +) -> Any: + """ + Suggest relevant questions based on Power BI dataset metadata. + + This endpoint analyzes the dataset structure and suggests interesting + questions that users might want to ask. + + Args: + request: Question suggestion request with metadata + db: Database session + group_context: Group context for multi-tenancy + + Returns: + List of suggested questions + + Example: + ```json + { + "metadata": { + "tables": [...] + }, + "num_suggestions": 5, + "model_name": "databricks-meta-llama-3-1-405b-instruct" + } + ``` + """ + try: + logger.info(f"Suggesting {request.num_suggestions} questions") + + # Initialize service + service = DAXGeneratorService(db) + + # Get suggested questions + questions = await service.suggest_questions( + metadata=request.metadata, + model_name=request.model_name, + num_suggestions=request.num_suggestions + ) + + logger.info(f"Generated {len(questions)} question suggestions") + + return QuestionSuggestionResponse(questions=questions) + + except Exception as e: + logger.error(f"Error suggesting questions: {str(e)}", exc_info=True) + raise HTTPException( + status_code=500, + detail=f"Failed to suggest questions: {str(e)}" + ) + + +@router.get("/health") +async def health_check() -> Dict[str, str]: + """ + Health check endpoint for Power BI DAX generator. + + Returns: + Health status + """ + return {"status": "healthy", "service": "powerbi-dax-generator"} diff --git a/src/backend/src/engines/crewai/tools/custom/powerbi_tool.py b/src/backend/src/engines/crewai/tools/custom/powerbi_tool.py new file mode 100644 index 00000000..5f8f07a5 --- /dev/null +++ b/src/backend/src/engines/crewai/tools/custom/powerbi_tool.py @@ -0,0 +1,572 @@ +""" +Power BI Integration Tool + +CrewAI custom tool for end-to-end Power BI integration: +1. Submits Power BI full pipeline notebook job (metadata extraction, DAX generation, execution) +2. Monitors job completion with automatic polling +3. Extracts and returns DAX execution results + +This tool provides a single-call solution for Power BI queries - users just provide +the question and authentication, and the tool handles everything else automatically. +""" + +import asyncio +import logging +import json +import time +import os +import hashlib +from typing import Any, Dict, Optional, Type +from datetime import datetime, timedelta + +from crewai.tools import BaseTool +from pydantic import BaseModel, Field, PrivateAttr +import aiohttp + +logger = logging.getLogger(__name__) + +# Global cache to prevent duplicate job submissions +# Maps request_hash -> (run_id, timestamp, result) +_JOB_SUBMISSION_CACHE = {} + + +class PowerBIToolSchema(BaseModel): + """Input schema for Power BI Integration Tool.""" + + question: str = Field( + ..., + description="Natural language question to answer using Power BI (e.g., 'What is the total NSR per product?')" + ) + semantic_model_id: str = Field( + ..., + description="Power BI semantic model/dataset ID (GUID format)" + ) + workspace_id: str = Field( + ..., + description="Power BI workspace ID (GUID format)" + ) + tenant_id: str = Field( + ..., + description="Azure AD tenant ID for authentication" + ) + client_id: str = Field( + ..., + description="Azure AD service principal client ID" + ) + client_secret: str = Field( + ..., + description="Azure AD service principal client secret" + ) + auth_method: Optional[str] = Field( + "service_principal", + description="Authentication method: 'service_principal' or 'device_code' (default: 'service_principal')" + ) + databricks_host: Optional[str] = Field( + None, + description="Optional Databricks host URL for the notebook to use (e.g., 'https://e2-demo-field-eng.cloud.databricks.com/'). If not provided, uses the tool's configured host." + ) + databricks_token: Optional[str] = Field( + None, + description="Optional Databricks API token for the notebook to use. If not provided, uses the tool's configured token." + ) + timeout_seconds: Optional[int] = Field( + 600, + description="Maximum time in seconds to wait for job completion (default: 600 / 10 minutes)" + ) + + +class PowerBITool(BaseTool): + """ + Power BI Integration Tool for CrewAI agents. + + This tool provides end-to-end Power BI query execution: + 1. Submits a Databricks job running the powerbi_full_pipeline notebook + 2. Waits for job completion (with automatic polling) + 3. Extracts DAX execution results from the job output + + The tool handles all complexity internally - users just provide: + - question: Natural language question + - semantic_model_id, workspace_id: Power BI identifiers + - tenant_id, client_id, client_secret: Azure AD credentials + + The powerbi_full_pipeline notebook performs: + - Metadata extraction from Power BI + - DAX query generation via LLM + - DAX query execution against Power BI + + All results are automatically extracted and returned. + """ + + name: str = "Power BI Query Executor" + description: str = ( + "Execute Power BI queries from natural language questions. " + "This tool handles everything automatically: metadata extraction, DAX generation, and query execution. " + "Required: question, semantic_model_id, workspace_id, tenant_id, client_id, client_secret. " + "Optional: auth_method ('service_principal' or 'device_code'), databricks_host, databricks_token, timeout_seconds. " + "If databricks_host/databricks_token are provided, they override the tool's configuration for the notebook. " + "IMPORTANT: This tool automatically prevents duplicate submissions - identical requests within 30 minutes return cached results. " + "Only call this tool ONCE per query. Do not retry or call again. " + "Returns: DAX query execution results directly." + ) + args_schema: Type[BaseModel] = PowerBIToolSchema + + # Private attributes for authentication (like DatabricksJobsTool) + _host: str = PrivateAttr(default=None) + _token: str = PrivateAttr(default=None) + _job_id: Optional[int] = PrivateAttr(default=None) # Power BI pipeline job ID + + def __init__( + self, + databricks_host: Optional[str] = None, + powerbi_job_id: Optional[int] = None, + tool_config: Optional[dict] = None, + **kwargs: Any + ) -> None: + """ + Initialize the Power BI Integration Tool. + + Args: + databricks_host: Databricks workspace host URL + powerbi_job_id: Job ID for the powerbi_full_pipeline notebook + tool_config: Tool configuration with auth details + **kwargs: Additional keyword arguments + """ + super().__init__(**kwargs) + + if tool_config is None: + tool_config = {} + + # Get configuration from tool_config (same pattern as DatabricksJobsTool) + if tool_config: + # Check for token + if 'DATABRICKS_API_KEY' in tool_config: + self._token = tool_config['DATABRICKS_API_KEY'] + elif 'token' in tool_config: + self._token = tool_config['token'] + + # Get Power BI job ID + if 'powerbi_job_id' in tool_config: + self._job_id = tool_config['powerbi_job_id'] + elif powerbi_job_id: + self._job_id = powerbi_job_id + + # Handle host configuration + if databricks_host: + host = databricks_host + elif 'DATABRICKS_HOST' in tool_config: + host = tool_config['DATABRICKS_HOST'] + elif 'databricks_host' in tool_config: + host = tool_config['databricks_host'] + else: + host = None + + # Process host if found + if host: + if isinstance(host, list) and host: + host = host[0] + if isinstance(host, str): + # Strip protocol and trailing slash + if host.startswith('https://'): + host = host[8:] + if host.startswith('http://'): + host = host[7:] + if host.endswith('/'): + host = host[:-1] + self._host = host + + # Try to get authentication if not set + if not self._token: + try: + # Try API Keys Service + from src.core.unit_of_work import UnitOfWork + from src.services.api_keys_service import ApiKeysService + + loop = None + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def get_databricks_token(): + async with UnitOfWork(): + token = await ApiKeysService.get_provider_api_key("databricks") or \ + await ApiKeysService.get_provider_api_key("DATABRICKS_API_KEY") or \ + await ApiKeysService.get_provider_api_key("DATABRICKS_TOKEN") + return token + + if not loop.is_running(): + self._token = loop.run_until_complete(get_databricks_token()) + + except Exception as e: + logger.debug(f"Could not get token from API Keys Service: {e}") + + # Fallback to environment variables + if not self._token: + self._token = os.getenv("DATABRICKS_API_KEY") or os.getenv("DATABRICKS_TOKEN") + + # Set fallback host from environment + if not self._host: + self._host = os.getenv("DATABRICKS_HOST", "your-workspace.cloud.databricks.com") + + logger.info("PowerBI Integration Tool initialized") + logger.info(f"Host: {self._host}") + logger.info(f"Power BI Job ID: {self._job_id}") + if self._token: + masked_token = f"{self._token[:4]}...{self._token[-4:]}" if len(self._token) > 8 else "***" + logger.info(f"Token (masked): {masked_token}") + + async def _make_api_call(self, method: str, endpoint: str, data: Optional[Dict] = None) -> Dict[str, Any]: + """Make API call to Databricks REST API.""" + url = f"https://{self._host}{endpoint}" + headers = { + "Authorization": f"Bearer {self._token}", + "Content-Type": "application/json" + } + + async with aiohttp.ClientSession() as session: + async with session.request( + method=method, + url=url, + json=data if data else None, + headers=headers, + timeout=aiohttp.ClientTimeout(total=30) + ) as response: + if response.status == 200: + return await response.json() + else: + raise Exception(f"API call failed: {response.status} - {await response.text()}") + + def _run( + self, + question: str, + semantic_model_id: str, + workspace_id: str, + tenant_id: str, + client_id: str, + client_secret: str, + auth_method: str = "service_principal", + databricks_host: Optional[str] = None, + databricks_token: Optional[str] = None, + timeout_seconds: int = 600 + ) -> str: + """ + Execute Power BI query end-to-end. + + Args: + question: Natural language question + semantic_model_id: Power BI semantic model ID + workspace_id: Power BI workspace ID + tenant_id: Azure AD tenant ID + client_id: Azure AD client ID + client_secret: Azure AD client secret + auth_method: Authentication method ('service_principal' or 'device_code') + databricks_host: Optional custom host for notebook (overrides tool config) + databricks_token: Optional custom token for notebook (overrides tool config) + timeout_seconds: Maximum time to wait for completion + + Returns: + JSON string containing DAX execution results + """ + try: + logger.info(f"PowerBI Tool - Executing query: {question[:100]}") + logger.info(f" Semantic Model: {semantic_model_id}") + logger.info(f" Workspace: {workspace_id}") + + # Deduplication: Generate request hash + request_signature = f"{question}|{semantic_model_id}|{workspace_id}|{tenant_id}" + request_hash = hashlib.md5(request_signature.encode()).hexdigest() + + # Check cache for recent identical requests (within last 30 minutes) + cache_ttl = timedelta(minutes=30) + current_time = datetime.now() + + # Clean expired cache entries + expired_keys = [ + key for key, (_, timestamp, _) in _JOB_SUBMISSION_CACHE.items() + if current_time - timestamp > cache_ttl + ] + for key in expired_keys: + del _JOB_SUBMISSION_CACHE[key] + + # Check if this exact request was made recently + if request_hash in _JOB_SUBMISSION_CACHE: + run_id, cached_time, cached_result = _JOB_SUBMISSION_CACHE[request_hash] + age_seconds = (current_time - cached_time).total_seconds() + logger.warning( + f"⚠️ DUPLICATE REQUEST DETECTED - Returning cached result from {age_seconds:.1f}s ago" + ) + logger.warning(f" Original run_id: {run_id}") + logger.warning(f" Request hash: {request_hash[:8]}...") + return cached_result + + # Check authentication + if not self._token: + return json.dumps({ + "error": "No authentication available", + "details": "Please configure DATABRICKS_API_KEY or token" + }) + + # Check job ID + if not self._job_id: + return json.dumps({ + "error": "Power BI job ID not configured", + "details": "Please provide powerbi_job_id in tool_config" + }) + + # Create event loop for async operations + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + try: + # Execute the full pipeline + result = loop.run_until_complete( + self._execute_powerbi_pipeline( + question=question, + semantic_model_id=semantic_model_id, + workspace_id=workspace_id, + tenant_id=tenant_id, + client_id=client_id, + client_secret=client_secret, + auth_method=auth_method, + databricks_host=databricks_host, + databricks_token=databricks_token, + timeout_seconds=timeout_seconds + ) + ) + + # Cache the successful result to prevent duplicate submissions + result_data = json.loads(result) + if result_data.get("success"): + run_id = result_data.get("run_id") + _JOB_SUBMISSION_CACHE[request_hash] = (run_id, current_time, result) + logger.info(f"✅ Cached result for request hash: {request_hash[:8]}...") + + return result + + finally: + loop.close() + + except Exception as e: + logger.error(f"Error in Power BI tool: {str(e)}", exc_info=True) + return json.dumps({ + "error": f"Failed to execute Power BI query: {str(e)}" + }) + + async def _execute_powerbi_pipeline( + self, + question: str, + semantic_model_id: str, + workspace_id: str, + tenant_id: str, + client_id: str, + client_secret: str, + auth_method: str, + databricks_host: Optional[str], + databricks_token: Optional[str], + timeout_seconds: int + ) -> str: + """ + Execute the full Power BI pipeline: submit job, wait, extract results. + + Returns: + JSON string with execution results + """ + start_time = time.time() + + # Use provided host/token or fall back to tool config + # If databricks_host is provided, use it as-is (user should include https://) + # If not provided, use self._host with https:// prefix + notebook_host = databricks_host if databricks_host else f"https://{self._host}" + notebook_token = databricks_token if databricks_token else self._token + + # Step 1: Submit the job + logger.info("Step 1: Submitting Power BI pipeline job...") + logger.info(f" Auth Method: {auth_method}") + logger.info(f" Databricks Host for notebook: {notebook_host}") + logger.info(f" Using custom token: {databricks_token is not None}") + + job_params = { + "question": question, + "semantic_model_id": semantic_model_id, + "workspace_id": workspace_id, + "tenant_id": tenant_id, + "client_id": client_id, + "client_secret": client_secret, + "auth_method": auth_method, + "databricks_host": notebook_host, + "databricks_token": notebook_token + } + + # Submit job via Databricks Jobs API + payload = { + "job_id": self._job_id, + "job_parameters": { + "job_params": json.dumps(job_params) + } + } + + submit_response = await self._make_api_call("POST", "/api/2.1/jobs/run-now", payload) + run_id = submit_response.get("run_id") + + if not run_id: + return json.dumps({ + "error": "No run_id returned from job submission", + "details": submit_response + }) + + logger.info(f"✅ Job submitted successfully: run_id={run_id}") + + # Step 2: Wait for completion + logger.info(f"Step 2: Waiting for job completion (timeout: {timeout_seconds}s)...") + completed = await self._wait_for_completion_async(int(run_id), timeout_seconds) + + if not completed: + elapsed = time.time() - start_time + return json.dumps({ + "error": "Job did not complete within timeout", + "run_id": run_id, + "timeout_seconds": timeout_seconds, + "elapsed_seconds": round(elapsed, 1), + "details": "The job is still running or failed. Check Databricks UI for details." + }) + + # Step 3: Extract results + logger.info("Step 3: Extracting results from job output...") + + # Get run info to handle multi-task jobs + run_info = await self._make_api_call("GET", f"/api/2.1/jobs/runs/get?run_id={run_id}") + + # Handle multi-task job structure + tasks = run_info.get("tasks", []) + actual_run_id = run_id + + # Hardcoded task_key for Power BI pipeline + POWERBI_TASK_KEY = "pbi_e2e_pipeline" + + if tasks and len(tasks) > 0: + # Find the pbi_e2e_pipeline task + task_run = None + for task in tasks: + if task.get("task_key") == POWERBI_TASK_KEY: + task_run = task + break + + if task_run: + actual_run_id = str(task_run.get("run_id")) + logger.info(f"Using task run_id: {actual_run_id} for task '{POWERBI_TASK_KEY}'") + else: + # Fallback to first task + actual_run_id = str(tasks[0].get("run_id")) + logger.warning(f"Task '{POWERBI_TASK_KEY}' not found, using first task") + + # Fetch output + output_response = await self._make_api_call( + "GET", + f"/api/2.1/jobs/runs/get-output?run_id={actual_run_id}" + ) + + notebook_output = output_response.get("notebook_output") + if not notebook_output or not notebook_output.get("result"): + return json.dumps({ + "error": "No output found from job run", + "run_id": run_id, + "details": "The notebook may not have called dbutils.notebook.exit() or the job failed." + }) + + # Parse result + result_data = json.loads(notebook_output.get("result")) + + # Extract DAX execution results (hardcoded extract_key) + EXTRACT_KEY = "pipeline_steps.step_3_execution.result_data" + extracted_data = self._extract_nested_key(result_data, EXTRACT_KEY) + + elapsed = time.time() - start_time + + if extracted_data is None: + available_keys = self._get_available_keys(result_data) + return json.dumps({ + "error": f"Key '{EXTRACT_KEY}' not found in job output", + "run_id": run_id, + "elapsed_seconds": round(elapsed, 1), + "available_keys": available_keys + }) + + logger.info(f"✅ Power BI pipeline completed successfully in {elapsed:.1f}s") + + # Return comprehensive result + return json.dumps({ + "success": True, + "run_id": run_id, + "question": question, + "elapsed_seconds": round(elapsed, 1), + "dax_query": result_data.get("pipeline_steps", {}).get("step_2_dax_generation", {}).get("dax_query"), + "result_data": extracted_data, + "message": f"Successfully executed Power BI query in {elapsed:.1f}s" + }, indent=2) + + async def _wait_for_completion_async(self, run_id: int, timeout_seconds: int) -> bool: + """Wait for job run to complete using async API calls.""" + start_time = time.time() + check_interval = 5 + + while True: + elapsed = time.time() - start_time + + if elapsed > timeout_seconds: + logger.warning(f"Timeout waiting for run_id {run_id}") + return False + + try: + run_info = await self._make_api_call("GET", f"/api/2.1/jobs/runs/get?run_id={run_id}") + state = run_info.get("state", {}) + life_cycle_state = state.get("life_cycle_state") + result_state = state.get("result_state") + + terminal_states = ["TERMINATED", "SKIPPED", "INTERNAL_ERROR"] + + if life_cycle_state in terminal_states: + if result_state == "SUCCESS": + logger.info(f"✅ Job run {run_id} completed successfully after {elapsed:.1f}s") + return True + else: + logger.error(f"❌ Job run {run_id} failed with state: {result_state}") + return False + + logger.info(f"⏳ Job run {run_id} is {life_cycle_state} (waited {elapsed:.1f}s)") + await asyncio.sleep(check_interval) + + except Exception as e: + logger.error(f"Error checking run status: {str(e)}") + return False + + def _extract_nested_key(self, data: Dict[str, Any], key_path: str) -> Any: + """Extract nested key using dot notation.""" + keys = key_path.split('.') + current = data + + for key in keys: + if isinstance(current, dict) and key in current: + current = current[key] + else: + return None + + return current + + def _get_available_keys(self, data: Any, prefix: str = "", max_depth: int = 3, current_depth: int = 0) -> list: + """Get available keys in nested structure.""" + if current_depth >= max_depth: + return [] + + keys = [] + + if isinstance(data, dict): + for key, value in data.items(): + full_key = f"{prefix}.{key}" if prefix else key + keys.append(full_key) + + if isinstance(value, dict): + nested_keys = self._get_available_keys(value, full_key, max_depth, current_depth + 1) + keys.extend(nested_keys) + + return keys diff --git a/src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_full_pipeline.py b/src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_full_pipeline.py new file mode 100644 index 00000000..69171b72 --- /dev/null +++ b/src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_full_pipeline.py @@ -0,0 +1,680 @@ +# Databricks notebook source +""" +Power BI Full Pipeline - Metadata Extraction, DAX Generation, and Execution + +This notebook provides an end-to-end Power BI integration in one place: +1. Extract metadata from Power BI semantic model +2. Generate DAX query from natural language question using LLM +3. Execute the generated DAX query +4. Return all results + +Required Parameters (via job_params): +- workspace_id: Power BI workspace ID +- semantic_model_id: Power BI semantic model/dataset ID +- question: Natural language question (e.g., "What is the total NSR per product?") +- auth_method: "device_code" or "service_principal" (default: "device_code") + +For Service Principal auth, also provide: +- client_id: Azure AD application client ID +- tenant_id: Azure AD tenant ID +- client_secret: Service principal secret + +For DAX Generation: +- databricks_host: Databricks workspace URL (e.g., "https://example.databricks.com") +- databricks_token: Databricks personal access token for LLM API +- model_name: LLM model to use (default: "databricks-meta-llama-3-1-405b-instruct") +- temperature: LLM temperature (default: 0.1) + +Optional Parameters: +- sample_size: Number of rows to sample per table for type inference (default: 100) +- skip_metadata: Skip metadata extraction if metadata is provided directly (default: False) +- metadata: Pre-extracted metadata (JSON string) - use with skip_metadata=True +""" + +# COMMAND ---------- + +# MAGIC %pip install azure-identity requests pandas + +# COMMAND ---------- + +dbutils.library.restartPython() + +# COMMAND ---------- + +# Import required libraries +import json +import re +import requests +import pandas as pd +from datetime import datetime +from typing import Dict, List, Any, Optional +from azure.identity import DeviceCodeCredential, ClientSecretCredential + +# COMMAND ---------- + +# DBTITLE 1,Configuration - Get Job Parameters +# Default configuration +DEFAULT_TENANT_ID = "9f37a392-f0ae-4280-9796-f1864a10effc" +DEFAULT_CLIENT_ID = "1950a258-227b-4e31-a9cf-717495945fc2" +DEFAULT_MODEL_NAME = "databricks-meta-llama-3-1-405b-instruct" +DEFAULT_TEMPERATURE = 0.1 + +try: + # Get job parameters + job_params = json.loads(dbutils.widgets.get("job_params")) + + # Extract required parameters + WORKSPACE_ID = job_params.get("workspace_id") + SEMANTIC_MODEL_ID = job_params.get("semantic_model_id") + QUESTION = job_params.get("question") + + # Authentication configuration + AUTH_METHOD = job_params.get("auth_method", "device_code") + TENANT_ID = job_params.get("tenant_id", DEFAULT_TENANT_ID) + CLIENT_ID = job_params.get("client_id", DEFAULT_CLIENT_ID) + CLIENT_SECRET = job_params.get("client_secret") + + # Databricks API configuration for LLM + DATABRICKS_HOST = job_params.get("databricks_host") + DATABRICKS_TOKEN = job_params.get("databricks_token") + MODEL_NAME = job_params.get("model_name", DEFAULT_MODEL_NAME) + TEMPERATURE = job_params.get("temperature", DEFAULT_TEMPERATURE) + + # Optional parameters + SAMPLE_SIZE = job_params.get("sample_size", 100) + SKIP_METADATA = job_params.get("skip_metadata", False) + METADATA_JSON = job_params.get("metadata") + + print("=" * 80) + print("Power BI Full Pipeline - Metadata → DAX Generation → Execution") + print("=" * 80) + print(f"Execution Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + print(f"Workspace ID: {WORKSPACE_ID}") + print(f"Semantic Model ID: {SEMANTIC_MODEL_ID}") + print(f"Question: {QUESTION}") + print(f"Authentication Method: {AUTH_METHOD}") + print(f"LLM Model: {MODEL_NAME}") + print(f"Temperature: {TEMPERATURE}") + print(f"Skip Metadata Extraction: {SKIP_METADATA}") + print("=" * 80) + +except Exception as e: + print(f"❌ Error getting parameters: {str(e)}") + print("\nRequired parameters in job_params:") + print("- workspace_id: Power BI workspace ID") + print("- semantic_model_id: Power BI dataset/semantic model ID") + print("- question: Natural language question") + print("- databricks_host: Databricks workspace URL") + print("- databricks_token: Databricks personal access token") + print("\nOptional parameters:") + print("- auth_method: 'device_code' or 'service_principal' (default: 'device_code')") + print("- model_name: LLM model (default: 'databricks-meta-llama-3-1-405b-instruct')") + print("- temperature: LLM temperature (default: 0.1)") + print("- sample_size: Rows to sample (default: 100)") + print("- skip_metadata: Skip metadata extraction (default: False)") + print("- metadata: Pre-extracted metadata JSON (use with skip_metadata=True)") + raise + +# COMMAND ---------- + +# DBTITLE 1,Authentication Functions +def generate_token_device_code(tenant_id: str, client_id: str) -> str: + """Generate token using device code flow (DCF).""" + try: + credential = DeviceCodeCredential( + client_id=client_id, + tenant_id=tenant_id, + ) + + print("\n🔄 Initiating Device Code Flow authentication...") + print("⚠️ Follow the instructions above to authenticate") + + token = credential.get_token("https://analysis.windows.net/powerbi/api/.default") + + print("✅ Token generated successfully") + return token.token + + except Exception as e: + print(f"❌ Token generation failed: {str(e)}") + raise + + +def generate_token_service_principal(tenant_id: str, client_id: str, client_secret: str) -> str: + """Generate token using Service Principal.""" + try: + print("\n🔄 Authenticating with Service Principal...") + + credential = ClientSecretCredential( + tenant_id=tenant_id, + client_id=client_id, + client_secret=client_secret + ) + + token = credential.get_token("https://analysis.windows.net/powerbi/api/.default") + + print("✅ Token generated successfully") + return token.token + + except Exception as e: + print(f"❌ Service Principal authentication failed: {str(e)}") + raise + +# COMMAND ---------- + +# DBTITLE 1,Generate Access Token +try: + if AUTH_METHOD == "service_principal": + if not CLIENT_SECRET: + raise ValueError("client_secret is required for service_principal authentication") + + access_token = generate_token_service_principal( + tenant_id=TENANT_ID, + client_id=CLIENT_ID, + client_secret=CLIENT_SECRET + ) + else: # device_code (default) + access_token = generate_token_device_code( + tenant_id=TENANT_ID, + client_id=CLIENT_ID + ) + + print(f"\n✅ Authentication successful!") + +except Exception as e: + print(f"\n❌ Authentication failed: {str(e)}") + raise + +# COMMAND ---------- + +# DBTITLE 1,Power BI API Functions +def get_dataset_info(token: str, dataset_id: str) -> dict: + """Get basic dataset information.""" + url = f"https://api.powerbi.com/v1.0/myorg/datasets/{dataset_id}" + headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json" + } + + print(f"🔄 Fetching dataset information...") + response = requests.get(url, headers=headers) + + if response.status_code == 200: + print("✅ Dataset information retrieved") + return response.json() + else: + print(f"❌ Failed to get dataset info: {response.text}") + return {} + + +def execute_dax_for_metadata(token: str, dataset_id: str, dax_query: str) -> pd.DataFrame: + """Execute a DAX query to retrieve metadata.""" + url = f"https://api.powerbi.com/v1.0/myorg/datasets/{dataset_id}/executeQueries" + headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json" + } + + body = { + "queries": [{"query": dax_query}], + "serializerSettings": {"includeNulls": True} + } + + print(f" Executing query: {dax_query[:50]}...") + response = requests.post(url, headers=headers, json=body, timeout=60) + print(f" Response status: {response.status_code}") + + if response.status_code == 200: + results = response.json().get("results", []) + if results and results[0].get("tables"): + rows = results[0]["tables"][0].get("rows", []) + if rows: + return pd.DataFrame(rows) + else: + print(f" ❌ Query failed: {response.text}") + + return pd.DataFrame() + + +def extract_table_metadata_from_data(token: str, dataset_id: str, table_names: List[str], sample_size: int = 100) -> List[Dict[str, Any]]: + """Extract column metadata by querying actual data from each table.""" + print(f"\n🔄 Extracting metadata for {len(table_names)} tables...") + print(f" Using sample size: {sample_size} rows per table\n") + + tables_metadata = [] + + for table_name in table_names: + print(f" 📊 Processing table: {table_name}") + + # Query sample data to get column names and types + query = f"EVALUATE TOPN({sample_size}, '{table_name}')" + df = execute_dax_for_metadata(token, dataset_id, query) + + if df.empty: + print(f" ⚠️ Could not query table: {table_name} (may be empty or not exist)") + continue + + # Extract column information from DataFrame + columns = [] + for col_name in df.columns: + # Remove the table name prefix and square brackets from column names + clean_name = col_name.strip(table_name).strip('[').strip(']') + + # Infer data type from pandas dtype based on actual data + dtype = str(df[col_name].dtype) + + if 'object' in dtype or 'string' in dtype: + data_type = 'string' + elif 'int' in dtype: + data_type = 'int' + elif 'float' in dtype or 'decimal' in dtype: + data_type = 'decimal' + elif 'datetime' in dtype: + data_type = 'datetime' + elif 'bool' in dtype: + data_type = 'boolean' + else: + data_type = 'string' + + columns.append({ + "name": clean_name, + "data_type": data_type + }) + + tables_metadata.append({ + "name": table_name, + "columns": columns + }) + + print(f" ✅ Found {len(columns)} columns in '{table_name}'") + + print(f"\n✅ Successfully processed {len(tables_metadata)}/{len(table_names)} tables") + + return tables_metadata + +# COMMAND ---------- + +# DBTITLE 1,STEP 1: Extract Metadata (if not skipped) +if SKIP_METADATA and METADATA_JSON: + print("\n" + "=" * 80) + print("STEP 1: Using Pre-Extracted Metadata") + print("=" * 80) + metadata = json.loads(METADATA_JSON) + tables_metadata = metadata.get("tables", []) + print(f"✅ Loaded metadata with {len(tables_metadata)} tables") + + # Create compact metadata + compact_metadata = { + "tables": [ + { + "name": table["name"], + "columns": [ + {"name": col["name"], "data_type": col["data_type"]} + for col in table["columns"] + ] + } + for table in tables_metadata + ] + } + + dataset_info = {"name": "pre-loaded"} + total_columns = sum(len(table["columns"]) for table in tables_metadata) + +else: + print("\n" + "=" * 80) + print("STEP 1: Extracting Metadata from Power BI") + print("=" * 80) + + try: + # Get dataset info + dataset_info = get_dataset_info(access_token, SEMANTIC_MODEL_ID) + + if dataset_info: + print(f"Dataset Name: {dataset_info.get('name', 'N/A')}") + + # Discover tables + print("\n🔄 Discovering tables in dataset...") + tables_df = execute_dax_for_metadata(access_token, SEMANTIC_MODEL_ID, "EVALUATE INFO.VIEW.TABLES()") + + if tables_df.empty: + raise ValueError("No tables found in dataset") + + # Extract unique table names + table_names = list(set(tables_df['[Name]'])) + print(f"Found {len(table_names)} tables: {', '.join(table_names[:5])}") + + # Extract metadata + tables_metadata = extract_table_metadata_from_data( + token=access_token, + dataset_id=SEMANTIC_MODEL_ID, + table_names=table_names, + sample_size=SAMPLE_SIZE + ) + + # Build metadata structure + metadata = {"tables": tables_metadata} + + # Create compact metadata + compact_metadata = { + "tables": [ + { + "name": table["name"], + "columns": [ + {"name": col["name"], "data_type": col["data_type"]} + for col in table["columns"] + ] + } + for table in tables_metadata + ] + } + + total_columns = sum(len(table["columns"]) for table in tables_metadata) + + print(f"\n✅ STEP 1 Complete: Extracted {len(tables_metadata)} tables, {total_columns} columns") + + except Exception as e: + print(f"❌ Error in metadata extraction: {str(e)}") + raise + +# COMMAND ---------- + +# DBTITLE 1,Metadata Formatting for LLM +def format_metadata_for_llm(metadata: Dict[str, Any]) -> str: + """Format metadata as a readable string for LLM context.""" + tables = metadata.get('tables', []) + if not tables: + return "No metadata available" + + output = "Power BI Dataset Structure:\n\n" + + for table in tables: + table_name = table.get('name', 'Unknown') + columns = table.get('columns', []) + + output += f"Table: {table_name}\n" + + if columns: + output += "Columns:\n" + for col in columns: + col_name = col.get('name', 'Unknown') + col_type = col.get('data_type', 'Unknown') + output += f" - {col_name} ({col_type})\n" + + output += "\n" + + return output + +# COMMAND ---------- + +# DBTITLE 1,DAX Query Cleaning Utility +def clean_dax_query(dax_query: str) -> str: + """Remove HTML/XML tags and other artifacts from DAX queries.""" + # Remove HTML/XML tags like , , etc. + cleaned = re.sub(r"<[^>]+>", "", dax_query) + # Collapse extra whitespace + cleaned = " ".join(cleaned.split()) + return cleaned + +# COMMAND ---------- + +# DBTITLE 1,STEP 2: Generate DAX Query from Question +print("\n" + "=" * 80) +print("STEP 2: Generating DAX Query from Natural Language Question") +print("=" * 80) +print(f"Question: {QUESTION}") + +try: + # Format metadata for LLM + metadata_str = format_metadata_for_llm(metadata) + + # Build prompt for DAX generation + prompt = f"""You are a Power BI DAX expert. Generate a DAX query to answer the following question. + +Available dataset structure: +{metadata_str} + +User question: {QUESTION} + +IMPORTANT RULES: +1. Generate only the DAX query without any explanation or markdown +2. Do NOT use any HTML or XML tags in the query +3. Do NOT use angle brackets < or > except for DAX operators +4. Use only valid DAX syntax +5. Reference only columns and measures that exist in the schema +6. The query should be executable as-is +7. Use proper DAX functions like EVALUATE, SUMMARIZE, FILTER, CALCULATE, etc. +8. Start the query with EVALUATE + +Example format: +EVALUATE SUMMARIZE(Sales, Product[Category], "Total Revenue", SUM(Sales[Amount])) + +Now generate the DAX query for the user's question:""" + + print(f"\n🔄 Calling LLM: {MODEL_NAME}") + print(f" Temperature: {TEMPERATURE}") + + # Call Databricks LLM API + llm_url = f"{DATABRICKS_HOST}/serving-endpoints/{MODEL_NAME}/invocations" + llm_headers = { + "Authorization": f"Bearer {DATABRICKS_TOKEN}", + "Content-Type": "application/json" + } + + llm_body = { + "messages": [ + {"role": "user", "content": prompt} + ], + "temperature": TEMPERATURE, + "max_tokens": 2000 + } + + print(f" Endpoint: {llm_url}") + llm_response = requests.post(llm_url, headers=llm_headers, json=llm_body, timeout=120) + + if llm_response.status_code != 200: + raise Exception(f"LLM API call failed: {llm_response.text}") + + llm_result = llm_response.json() + + # Extract content from response + if "choices" in llm_result and len(llm_result["choices"]) > 0: + raw_dax = llm_result["choices"][0]["message"]["content"] + else: + raise Exception(f"Unexpected LLM response format: {llm_result}") + + print("✅ LLM response received") + + # Clean the response + cleaned_dax = clean_dax_query(raw_dax) + + # Remove markdown code blocks if present + if "```" in cleaned_dax: + parts = cleaned_dax.split("```") + for part in parts: + if "EVALUATE" in part.upper(): + cleaned_dax = part.strip() + # Remove language identifier if present + if cleaned_dax.startswith("dax\n") or cleaned_dax.startswith("DAX\n"): + cleaned_dax = cleaned_dax[4:].strip() + break + + # Ensure query starts with EVALUATE + if not cleaned_dax.strip().upper().startswith("EVALUATE"): + lines = cleaned_dax.split("\n") + for i, line in enumerate(lines): + if "EVALUATE" in line.upper(): + cleaned_dax = "\n".join(lines[i:]) + break + + DAX_QUERY = cleaned_dax.strip() + + print("\n" + "-" * 80) + print("Generated DAX Query:") + print("-" * 80) + print(DAX_QUERY) + print("-" * 80) + + print(f"\n✅ STEP 2 Complete: DAX query generated successfully") + +except Exception as e: + print(f"❌ Error in DAX generation: {str(e)}") + raise + +# COMMAND ---------- + +# DBTITLE 1,STEP 3: Execute DAX Query +print("\n" + "=" * 80) +print("STEP 3: Executing DAX Query") +print("=" * 80) + +def execute_dax_query(token: str, dataset_id: str, dax_query: str) -> pd.DataFrame: + """Execute a DAX query against the Power BI dataset using REST API.""" + url = f"https://api.powerbi.com/v1.0/myorg/datasets/{dataset_id}/executeQueries" + headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json" + } + + body = { + "queries": [ + { + "query": dax_query + } + ], + "serializerSettings": { + "includeNulls": True + } + } + + print(f"\n🔄 Executing DAX query...") + print(f" Endpoint: {url}") + print(f" Query preview: {dax_query[:100]}...") + + response = requests.post(url, headers=headers, json=body, timeout=60) + print(f" Response status: {response.status_code}") + + if response.status_code == 200: + results = response.json().get("results", []) + + if results and results[0].get("tables"): + rows = results[0]["tables"][0].get("rows", []) + + if rows: + df = pd.DataFrame(rows) + print(f"✅ Query successful: {len(df)} rows returned") + print(f" Columns: {list(df.columns)}") + return df + else: + print("⚠️ Query returned no rows") + return pd.DataFrame() + else: + print("⚠️ No tables in response") + return pd.DataFrame() + else: + print(f"❌ Query failed: {response.text}") + return pd.DataFrame() + +try: + df_result = execute_dax_query(access_token, SEMANTIC_MODEL_ID, DAX_QUERY) + + if not df_result.empty: + print("\n" + "=" * 80) + print("Query Results") + print("=" * 80) + print(f"Total rows: {len(df_result)}") + print(f"Columns: {list(df_result.columns)}") + print("=" * 80) + + # Display first few rows + print("\nSample Results (First 10 rows):") + print("-" * 80) + display(df_result.head(10)) + + if len(df_result) > 10: + print(f"\n... and {len(df_result) - 10} more rows") + + # Convert to Spark DataFrame + print("\n🔄 Converting results to Spark DataFrame...") + spark_df = spark.createDataFrame(df_result) + print(f"✅ Spark DataFrame created successfully") + + print(f"\n✅ STEP 3 Complete: Query executed, {len(df_result)} rows returned") + + else: + print("⚠️ Query returned empty DataFrame") + spark_df = None + print(f"\n⚠️ STEP 3 Complete: No results returned") + +except Exception as e: + print(f"❌ Error executing DAX query: {str(e)}") + df_result = pd.DataFrame() + spark_df = None + raise + +# COMMAND ---------- + +# DBTITLE 1,Execution Summary +print("\n" + "=" * 80) +print("FULL PIPELINE EXECUTION SUMMARY") +print("=" * 80) +print(f"✅ Pipeline Completed Successfully") +print(f" Execution Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") +print(f" Workspace ID: {WORKSPACE_ID}") +print(f" Semantic Model ID: {SEMANTIC_MODEL_ID}") +print(f" Dataset Name: {dataset_info.get('name', 'N/A')}") +print("") +print(f"STEP 1 - Metadata Extraction:") +print(f" Tables: {len(tables_metadata)}") +print(f" Total Columns: {total_columns}") +print("") +print(f"STEP 2 - DAX Generation:") +print(f" Question: {QUESTION}") +print(f" Model: {MODEL_NAME}") +print(f" Generated Query Length: {len(DAX_QUERY)} characters") +print("") +print(f"STEP 3 - DAX Execution:") +print(f" Authentication: {AUTH_METHOD}") +print(f" Rows Returned: {len(df_result) if not df_result.empty else 0}") +print(f" Columns: {list(df_result.columns) if not df_result.empty else 'N/A'}") +print("=" * 80) + +# COMMAND ---------- + +# DBTITLE 1,Return Results as JSON +# Convert DataFrame to JSON for output +if not df_result.empty: + # Convert to list of dictionaries + result_data = df_result.to_dict(orient='records') +else: + result_data = [] + +# Build complete result summary +result_summary = { + "status": "success", + "execution_time": datetime.now().isoformat(), + "pipeline_steps": { + "step_1_metadata": { + "tables_count": len(tables_metadata), + "columns_count": total_columns, + "metadata": metadata, + "compact_metadata": compact_metadata + }, + "step_2_dax_generation": { + "question": QUESTION, + "model_name": MODEL_NAME, + "temperature": TEMPERATURE, + "generated_dax": DAX_QUERY + }, + "step_3_execution": { + "workspace_id": WORKSPACE_ID, + "semantic_model_id": SEMANTIC_MODEL_ID, + "auth_method": AUTH_METHOD, + "rows_returned": len(df_result) if not df_result.empty else 0, + "columns": list(df_result.columns) if not df_result.empty else [], + "result_data": result_data[:1000] # Limit to first 1000 rows for JSON output + } + }, + "dataset_name": dataset_info.get('name', 'unknown') +} + +# Exit with complete results +dbutils.notebook.exit(json.dumps(result_summary)) diff --git a/src/backend/src/engines/crewai/tools/tool_factory.py b/src/backend/src/engines/crewai/tools/tool_factory.py index d5cbdb67..d1c7c1c8 100644 --- a/src/backend/src/engines/crewai/tools/tool_factory.py +++ b/src/backend/src/engines/crewai/tools/tool_factory.py @@ -118,6 +118,16 @@ PythonPPTXTool = None logging.warning("Could not import PythonPPTXTool") +try: + from .custom.powerbi_tool import PowerBITool +except ImportError: + try: + from .custom.powerbi_tool import PowerBITool + except ImportError: + PowerBITool = None + logging.warning("Could not import PowerBITool") + + # Setup logger logger = logging.getLogger(__name__) @@ -209,7 +219,8 @@ def __init__(self, config, api_keys_service=None, user_token=None): "SerplyWebpageToMarkdownTool": SerplyWebpageToMarkdownTool, "SnowflakeSearchTool": SnowflakeSearchTool, "WeaviateVectorSearchTool": WeaviateVectorSearchTool, - "PythonPPTXTool": PythonPPTXTool + "PythonPPTXTool": PythonPPTXTool, + "PowerBITool": PowerBITool } # Initialize _initialized flag @@ -1290,7 +1301,50 @@ def _run(self, query: str, **kwargs): # Create the tool with any specified configuration tool = PythonPPTXTool(**tool_config) return tool - + + elif tool_name == "PowerBITool": + # Create a copy of the config + powerbi_tool_config = {**tool_config} + + # Extract PowerBI-specific configuration + xmla_endpoint = tool_config.get('xmla_endpoint') + dataset_name = tool_config.get('dataset_name') + metadata = tool_config.get('metadata') + model_name = tool_config.get('model_name', 'databricks-meta-llama-3-1-405b-instruct') + temperature = tool_config.get('temperature', 0.1) + + # Parse metadata if it's a JSON string (from database storage) + if metadata and isinstance(metadata, str): + try: + metadata = json.loads(metadata) + logger.info("Parsed metadata from JSON string") + except json.JSONDecodeError as e: + logger.error(f"Failed to parse metadata JSON: {e}") + metadata = None + + logger.info(f"Creating PowerBITool with configuration:") + logger.info(f" XMLA Endpoint: {xmla_endpoint}") + logger.info(f" Dataset Name: {dataset_name}") + logger.info(f" Metadata tables: {len(metadata.get('tables', [])) if metadata else 0}") + logger.info(f" Model: {model_name}") + logger.info(f" Temperature: {temperature}") + + # Create the PowerBITool instance with explicit parameters + try: + return tool_class( + xmla_endpoint=xmla_endpoint, + dataset_name=dataset_name, + metadata=metadata, + model_name=model_name, + temperature=temperature, + tool_config=powerbi_tool_config + ) + except Exception as e: + logger.error(f"Error creating PowerBITool: {e}") + import traceback + logger.error(traceback.format_exc()) + return None + # For all other tools, try to create with config parameters else: # Check if the config has any data diff --git a/src/backend/src/schemas/powerbi.py b/src/backend/src/schemas/powerbi.py new file mode 100644 index 00000000..37d0b76c --- /dev/null +++ b/src/backend/src/schemas/powerbi.py @@ -0,0 +1,171 @@ +""" +Power BI and DAX Generation Schemas + +Pydantic schemas for Power BI integration and DAX query generation. +""" + +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel, Field, field_validator + + +class PowerBIConnectionConfig(BaseModel): + """Configuration for Power BI connection.""" + + xmla_endpoint: str = Field( + ..., + description="Power BI XMLA endpoint (e.g., powerbi://api.powerbi.com/v1.0/myorg/workspace)", + examples=["powerbi://api.powerbi.com/v1.0/myorg/test_workspace"] + ) + dataset_name: str = Field( + ..., + description="Name of the Power BI dataset/semantic model", + examples=["SalesDataset"] + ) + tenant_id: Optional[str] = Field( + None, + description="Azure AD tenant ID for service principal authentication" + ) + client_id: Optional[str] = Field( + None, + description="Service principal client ID" + ) + client_secret: Optional[str] = Field( + None, + description="Service principal client secret" + ) + + @field_validator('xmla_endpoint') + @classmethod + def validate_xmla_endpoint(cls, v: str) -> str: + """Validate XMLA endpoint format.""" + if not v.startswith('powerbi://'): + raise ValueError('XMLA endpoint must start with powerbi://') + return v + + +class TableMetadata(BaseModel): + """Metadata for a Power BI table.""" + + name: str = Field(..., description="Table name") + description: Optional[str] = Field(None, description="Table description") + columns: List[Dict[str, Any]] = Field( + default_factory=list, + description="List of columns with their metadata" + ) + relationships: List[Dict[str, Any]] = Field( + default_factory=list, + description="Relationships to other tables" + ) + + +class DatasetMetadata(BaseModel): + """Complete metadata for a Power BI dataset.""" + + tables: List[TableMetadata] = Field( + default_factory=list, + description="List of tables in the dataset" + ) + dataset_name: str = Field(..., description="Name of the dataset") + + +class DAXGenerationRequest(BaseModel): + """Request to generate a DAX query from natural language.""" + + question: str = Field( + ..., + description="Natural language question about the data", + examples=["What is the total NSR per product?"] + ) + metadata: Dict[str, Any] = Field( + ..., + description="Power BI dataset metadata (tables, columns, relationships)" + ) + sample_data: Optional[Dict[str, List[Dict[str, Any]]]] = Field( + None, + description="Optional sample data from tables for better context" + ) + model_name: str = Field( + default="databricks-meta-llama-3-1-405b-instruct", + description="LLM model to use for DAX generation" + ) + temperature: float = Field( + default=0.1, + ge=0.0, + le=2.0, + description="Temperature for LLM generation (0.0-2.0)" + ) + + @field_validator('question') + @classmethod + def validate_question(cls, v: str) -> str: + """Validate question is not empty.""" + if not v or not v.strip(): + raise ValueError('Question cannot be empty') + return v.strip() + + +class DAXGenerationResponse(BaseModel): + """Response containing generated DAX query.""" + + dax_query: str = Field(..., description="Generated DAX query") + explanation: str = Field(..., description="Explanation of what the query does") + confidence: float = Field( + ..., + ge=0.0, + le=1.0, + description="Confidence score for the generated query (0-1)" + ) + raw_response: Optional[str] = Field( + None, + description="Raw LLM response before parsing" + ) + + +class QuestionSuggestionRequest(BaseModel): + """Request to suggest questions based on dataset metadata.""" + + metadata: Dict[str, Any] = Field( + ..., + description="Power BI dataset metadata" + ) + model_name: str = Field( + default="databricks-meta-llama-3-1-405b-instruct", + description="LLM model to use" + ) + num_suggestions: int = Field( + default=5, + ge=1, + le=20, + description="Number of questions to suggest (1-20)" + ) + + +class QuestionSuggestionResponse(BaseModel): + """Response containing suggested questions.""" + + questions: List[str] = Field( + ..., + description="List of suggested questions" + ) + + +class PowerBIToolInput(BaseModel): + """Input schema for PowerBI CrewAI tool.""" + + question: str = Field( + ..., + description="Natural language question to convert to DAX" + ) + xmla_endpoint: Optional[str] = Field( + None, + description="Power BI XMLA endpoint (uses configured default if not provided)" + ) + dataset_name: Optional[str] = Field( + None, + description="Dataset name (uses configured default if not provided)" + ) + include_execution_instructions: bool = Field( + default=True, + description="Whether to include instructions for executing the DAX in Databricks" + ) diff --git a/src/backend/src/seeds/tools.py b/src/backend/src/seeds/tools.py index aaabaeef..282dcada 100644 --- a/src/backend/src/seeds/tools.py +++ b/src/backend/src/seeds/tools.py @@ -78,6 +78,7 @@ (68, "PythonPPTXTool", "A powerful tool for creating Microsoft PowerPoint presentations using the python-pptx library. It converts raw text content into professionally formatted slides with proper styling, titles, and content organization. The tool supports creating presentations from scratch or using templates, customizing styling, and saving to specified locations. Ideal for automating presentation creation, report generation, and converting textual information into visual slide formats.", "presentation"), (69, "MCPTool", "An advanced adapter for Model Context Protocol (MCP) servers that enables access to thousands of specialized tools from the MCP ecosystem. This tool establishes and manages connections with MCP servers through SSE (Server-Sent Events), providing seamless integration with community-built tool collections. Perfect for extending agent capabilities with domain-specific tools without requiring custom development or direct integration work.", "integration"), (70, "DatabricksJobsTool", "A comprehensive Databricks Jobs management tool using direct REST API calls for optimal performance. IMPORTANT WORKFLOW: Always use 'get_notebook' action FIRST to analyze job notebooks and understand required parameters before running any job with custom parameters. This ensures proper parameter construction and prevents job failures. Available actions: (1) 'list' - List all jobs in workspace with optional name/ID filtering, (2) 'list_my_jobs' - List only jobs created by current user, (3) 'get' - Get detailed job configuration and recent run history, (4) 'get_notebook' - Analyze notebook content to understand parameters, widgets, and logic (REQUIRED before running jobs with parameters), (5) 'run' - Trigger job execution with custom parameters (use dict for notebook/SQL tasks, list for Python tasks), (6) 'monitor' - Track real-time execution status and task progress, (7) 'create' - Create new jobs with custom configurations. The tool provides intelligent parameter analysis, suggesting proper parameter structures based on notebook patterns (search jobs, ETL jobs, etc.). Supports OAuth/OBO authentication, PAT tokens, and Databricks CLI profiles. All operations use direct REST API calls avoiding SDK overhead for faster execution. Essential for automating data pipelines, orchestrating workflows, and integrating Databricks jobs into AI agent systems.", "database"), + (71, "PowerBITool", "An end-to-end Power BI query execution tool that handles everything automatically: metadata extraction, DAX generation, and query execution. Users simply provide a natural language question (e.g., 'What is the total NSR per product?') along with Power BI credentials, and the tool: (1) Submits a Databricks job running the powerbi_full_pipeline notebook, (2) Monitors job completion with automatic polling, (3) Extracts and returns DAX execution results directly. Required parameters: question, semantic_model_id, workspace_id, tenant_id, client_id, client_secret, and auth_method ('service_principal' or 'device_code'). Optional: timeout_seconds (default: 600). Behind the scenes, the powerbi_full_pipeline notebook performs metadata extraction from Power BI, generates DAX queries via LLM, and executes them against Power BI. This is a single-call solution - no need for separate metadata extraction, DAX generation, or manual result retrieval. Perfect for business intelligence workflows, automated reporting, and enabling AI agents to answer Power BI questions with minimal setup. Essential for bridging conversational AI and Power BI analytics with maximum convenience.", "business_intelligence"), ] def get_tool_configs(): @@ -390,7 +391,21 @@ def get_tool_configs(): "70": { "result_as_answer": False, "DATABRICKS_HOST": "", # Databricks workspace URL (e.g., "e2-demo-field-eng.cloud.databricks.com") - } # DatabricksJobsTool + }, # DatabricksJobsTool + "71": { + "result_as_answer": False, + "DATABRICKS_HOST": "", # Databricks workspace URL (e.g., "e2-demo-field-eng.cloud.databricks.com") + "powerbi_job_id": None # Job ID for the powerbi_full_pipeline notebook (must be configured) + # The tool automatically handles: + # - Job submission with question and Power BI credentials + # - Waiting for completion with polling + # - Extracting DAX execution results + # Required parameters for each call: + # - question: Natural language question + # - semantic_model_id: Power BI semantic model/dataset ID + # - workspace_id: Power BI workspace ID + # - tenant_id, client_id, client_secret: Azure AD credentials + } # PowerBITool } async def seed_async(): @@ -411,21 +426,21 @@ async def seed_async(): try: async with async_session_factory() as session: if tool_id not in existing_ids: - # Add new tool - GenieTool (ID 35), PerplexityTool (ID 31), and DatabricksCustomTool (ID 67) are enabled by default + # Add new tool - GenieTool (ID 35), PerplexityTool (ID 31), DatabricksCustomTool (ID 67), DatabricksJobsTool (ID 70), and PowerBITool (ID 71) are enabled by default tool = Tool( id=tool_id, title=title, description=description, icon=icon, config=get_tool_configs().get(str(tool_id), {}), - enabled=(tool_id in [31, 35, 67, 70]), # Enable PerplexityTool, GenieTool, DatabricksCustomTool, and DatabricksJobsTool + enabled=(tool_id in [31, 35, 67, 70, 71]), # Enable PerplexityTool, GenieTool, DatabricksCustomTool, DatabricksJobsTool, and PowerBITool created_at=datetime.now().replace(tzinfo=None), updated_at=datetime.now().replace(tzinfo=None) ) session.add(tool) tools_added += 1 else: - # Update existing tool - GenieTool (ID 35), PerplexityTool (ID 31), and DatabricksCustomTool (ID 67) are enabled by default + # Update existing tool - GenieTool (ID 35), PerplexityTool (ID 31), DatabricksCustomTool (ID 67), DatabricksJobsTool (ID 70), and PowerBITool (ID 71) are enabled by default result = await session.execute( select(Tool).filter(Tool.id == tool_id) ) @@ -435,7 +450,7 @@ async def seed_async(): existing_tool.description = description existing_tool.icon = icon existing_tool.config = get_tool_configs().get(str(tool_id), {}) - existing_tool.enabled = (tool_id in [31, 35, 67, 70]) # Enable PerplexityTool, GenieTool, DatabricksCustomTool, and DatabricksJobsTool + existing_tool.enabled = (tool_id in [31, 35, 67, 70, 71]) # Enable PerplexityTool, GenieTool, DatabricksCustomTool, DatabricksJobsTool, and PowerBITool existing_tool.updated_at = datetime.now().replace(tzinfo=None) tools_updated += 1 @@ -469,21 +484,21 @@ def seed_sync(): try: with SessionLocal() as session: if tool_id not in existing_ids: - # Add new tool - GenieTool (ID 35), PerplexityTool (ID 31), and DatabricksCustomTool (ID 67) are enabled by default + # Add new tool - GenieTool (ID 35), PerplexityTool (ID 31), DatabricksCustomTool (ID 67), DatabricksJobsTool (ID 70), and PowerBITool (ID 71) are enabled by default tool = Tool( id=tool_id, title=title, description=description, icon=icon, config=get_tool_configs().get(str(tool_id), {}), - enabled=(tool_id in [31, 35, 67, 70]), # Enable PerplexityTool, GenieTool, DatabricksCustomTool, and DatabricksJobsTool + enabled=(tool_id in [31, 35, 67, 70, 71]), # Enable PerplexityTool, GenieTool, DatabricksCustomTool, DatabricksJobsTool, and PowerBITool created_at=datetime.now().replace(tzinfo=None), updated_at=datetime.now().replace(tzinfo=None) ) session.add(tool) tools_added += 1 else: - # Update existing tool - GenieTool (ID 35), PerplexityTool (ID 31), and DatabricksCustomTool (ID 67) are enabled by default + # Update existing tool - GenieTool (ID 35), PerplexityTool (ID 31), DatabricksCustomTool (ID 67), DatabricksJobsTool (ID 70), and PowerBITool (ID 71) are enabled by default result = session.execute( select(Tool).filter(Tool.id == tool_id) ) @@ -493,7 +508,7 @@ def seed_sync(): existing_tool.description = description existing_tool.icon = icon existing_tool.config = get_tool_configs().get(str(tool_id), {}) - existing_tool.enabled = (tool_id in [31, 35, 67, 70]) # Enable PerplexityTool, GenieTool, DatabricksCustomTool, and DatabricksJobsTool + existing_tool.enabled = (tool_id in [31, 35, 67, 70, 71]) # Enable PerplexityTool, GenieTool, DatabricksCustomTool, DatabricksJobsTool, and PowerBITool existing_tool.updated_at = datetime.now().replace(tzinfo=None) tools_updated += 1 diff --git a/src/backend/src/services/dax_generator_service.py b/src/backend/src/services/dax_generator_service.py new file mode 100644 index 00000000..2bd0a1c6 --- /dev/null +++ b/src/backend/src/services/dax_generator_service.py @@ -0,0 +1,355 @@ +""" +DAX Generator Service + +This service generates DAX queries from natural language questions using LLMs. +It's designed to work with Power BI semantic models via XMLA endpoints. + +The generated DAX can then be executed in Databricks notebooks using the +Power BI integration. +""" + +import json +import logging +from typing import Any, Dict, List, Optional + +from sqlalchemy.ext.asyncio import AsyncSession + +from src.utils.powerbi_connector import PowerBIMetadataExtractor, clean_dax_query + +logger = logging.getLogger(__name__) + + +class DAXGeneratorService: + """ + Service for generating DAX queries from natural language questions. + + This service uses LLMs to translate user questions into DAX queries + based on Power BI dataset metadata. + """ + + def __init__(self, session: AsyncSession): + """ + Initialize the DAX Generator Service. + + Args: + session: SQLAlchemy async session for database operations + """ + self.session = session + self.metadata_extractor = PowerBIMetadataExtractor() + + @classmethod + async def from_unit_of_work(cls, uow): + """ + Create service instance from Unit of Work. + + Args: + uow: Unit of Work instance + + Returns: + DAXGeneratorService instance + """ + return cls(uow.session) + + async def generate_dax_from_question( + self, + question: str, + metadata: Dict[str, Any], + model_name: str = "databricks-meta-llama-3-1-405b-instruct", + temperature: float = 0.1 + ) -> Dict[str, Any]: + """ + Generate a DAX query from a natural language question. + + Args: + question: Natural language question about the data + metadata: Power BI dataset metadata (tables, columns, relationships) + model_name: LLM model to use for generation + temperature: Temperature for LLM generation (lower = more deterministic) + + Returns: + Dictionary containing: + - dax_query: Generated DAX query string + - explanation: Explanation of what the query does + - confidence: Confidence score (0-1) + """ + try: + # Set metadata for extraction + self.metadata_extractor.set_metadata(metadata) + + # Format metadata for LLM + metadata_str = self.metadata_extractor.format_metadata_for_llm() + + # Build prompt for DAX generation + prompt = self._build_dax_generation_prompt(question, metadata_str) + + # Call LLM to generate DAX + response = await self._call_llm(prompt, model_name, temperature) + + # Parse and clean the response + dax_result = self._parse_dax_response(response) + + logger.info(f"Successfully generated DAX query for question: {question[:100]}") + return dax_result + + except Exception as e: + logger.error(f"Error generating DAX query: {str(e)}", exc_info=True) + raise + + async def generate_dax_with_samples( + self, + question: str, + metadata: Dict[str, Any], + sample_data: Optional[Dict[str, List[Dict[str, Any]]]] = None, + model_name: str = "databricks-meta-llama-3-1-405b-instruct", + temperature: float = 0.1 + ) -> Dict[str, Any]: + """ + Generate DAX query with sample data context for better accuracy. + + Args: + question: Natural language question + metadata: Power BI dataset metadata + sample_data: Optional sample data from tables for context + model_name: LLM model to use + temperature: Temperature for generation + + Returns: + Dictionary with DAX query, explanation, and confidence + """ + try: + # Set metadata + self.metadata_extractor.set_metadata(metadata) + + # Format metadata and samples + metadata_str = self.metadata_extractor.format_metadata_for_llm() + + sample_str = "" + if sample_data: + sample_str = "\n\nSample Data for Reference:\n" + for table_name, samples in sample_data.items(): + sample_str += f"\n{table_name} (first {len(samples)} rows):\n" + sample_str += json.dumps(samples, indent=2) + + # Build enhanced prompt + prompt = self._build_dax_generation_prompt( + question, metadata_str, sample_str + ) + + # Generate DAX + response = await self._call_llm(prompt, model_name, temperature) + + # Parse response + dax_result = self._parse_dax_response(response) + + logger.info(f"Generated DAX with samples for: {question[:100]}") + return dax_result + + except Exception as e: + logger.error(f"Error generating DAX with samples: {str(e)}", exc_info=True) + raise + + async def suggest_questions( + self, + metadata: Dict[str, Any], + model_name: str = "databricks-meta-llama-3-1-405b-instruct", + num_suggestions: int = 5 + ) -> List[str]: + """ + Suggest relevant questions based on dataset metadata. + + Args: + metadata: Power BI dataset metadata + model_name: LLM model to use + num_suggestions: Number of questions to suggest + + Returns: + List of suggested questions + """ + try: + self.metadata_extractor.set_metadata(metadata) + metadata_str = self.metadata_extractor.format_metadata_for_llm() + + prompt = f"""Based on the following Power BI dataset structure, suggest {num_suggestions} interesting questions a user might ask: + +{metadata_str} + +Generate {num_suggestions} diverse questions that would showcase different aspects of the data. +Return only the questions as a JSON array, nothing else. + +Example format: +["Question 1", "Question 2", "Question 3"] +""" + + response = await self._call_llm(prompt, model_name, temperature=0.7) + + # Parse JSON response + try: + questions = json.loads(response.strip()) + if isinstance(questions, list): + return questions[:num_suggestions] + except json.JSONDecodeError: + logger.warning("Failed to parse suggested questions as JSON") + + # Fallback suggestions + return [ + "What are the total sales?", + "Show me the top 10 products by revenue", + "What is the revenue trend over time?", + "Which region has the highest sales?", + "What are the key performance metrics?" + ][:num_suggestions] + + except Exception as e: + logger.error(f"Error suggesting questions: {str(e)}", exc_info=True) + return [ + "What are the total sales?", + "Show me the top 10 products", + "What is the trend over time?" + ][:num_suggestions] + + def _build_dax_generation_prompt( + self, + question: str, + metadata_str: str, + sample_data_str: str = "" + ) -> str: + """ + Build the prompt for DAX query generation. + + Args: + question: User's natural language question + metadata_str: Formatted metadata string + sample_data_str: Optional formatted sample data + + Returns: + Complete prompt string + """ + prompt = f"""You are a Power BI DAX expert. Generate a DAX query to answer the following question. + +Available dataset structure: +{metadata_str} +{sample_data_str} + +User question: {question} + +IMPORTANT RULES: +1. Generate only the DAX query without any explanation or markdown +2. Do NOT use any HTML or XML tags in the query +3. Do NOT use angle brackets < or > except for DAX operators +4. Use only valid DAX syntax +5. Reference only columns and measures that exist in the schema +6. The query should be executable as-is +7. Use proper DAX functions like EVALUATE, SUMMARIZE, FILTER, CALCULATE, etc. +8. Start the query with EVALUATE + +Example format: +EVALUATE SUMMARIZE(Sales, Product[Category], "Total Revenue", SUM(Sales[Amount])) + +Now generate the DAX query for the user's question:""" + + return prompt + + async def _call_llm( + self, + prompt: str, + model_name: str, + temperature: float + ) -> str: + """ + Call LLM to generate response. + + Args: + prompt: Prompt for the LLM + model_name: Model identifier + temperature: Generation temperature + + Returns: + LLM response string + """ + try: + # Import here to avoid circular dependencies + from src.engines.crewai.llm_manager import LLMManager + + # Initialize LLM manager + llm_manager = LLMManager() + + # Get LLM instance + llm = llm_manager.get_llm(model_name, temperature=temperature) + + # Generate response + response = await llm.ainvoke(prompt) + + # Extract content from response + if hasattr(response, 'content'): + return response.content + elif isinstance(response, str): + return response + else: + return str(response) + + except Exception as e: + logger.error(f"Error calling LLM: {str(e)}", exc_info=True) + raise + + def _parse_dax_response(self, response: str) -> Dict[str, Any]: + """ + Parse and clean the LLM response to extract DAX query. + + Args: + response: Raw LLM response + + Returns: + Dictionary with cleaned query and metadata + """ + try: + # Clean the response + cleaned = clean_dax_query(response) + + # Remove markdown code blocks if present + if "```" in cleaned: + # Extract content between code blocks + parts = cleaned.split("```") + for part in parts: + if "EVALUATE" in part.upper(): + cleaned = part.strip() + # Remove language identifier if present + if cleaned.startswith("dax\n") or cleaned.startswith("DAX\n"): + cleaned = cleaned[4:].strip() + break + + # Ensure query starts with EVALUATE + if not cleaned.strip().upper().startswith("EVALUATE"): + # Try to find EVALUATE in the response + lines = cleaned.split("\n") + for i, line in enumerate(lines): + if "EVALUATE" in line.upper(): + cleaned = "\n".join(lines[i:]) + break + + # Calculate a simple confidence score based on query characteristics + confidence = 0.8 # Default confidence + + # Increase confidence if query has proper DAX structure + if "EVALUATE" in cleaned.upper(): + confidence += 0.1 + if any(func in cleaned.upper() for func in ["SUMMARIZE", "CALCULATE", "FILTER", "TOPN"]): + confidence += 0.1 + + # Cap at 1.0 + confidence = min(1.0, confidence) + + return { + "dax_query": cleaned.strip(), + "explanation": "Generated DAX query from natural language question", + "confidence": confidence, + "raw_response": response + } + + except Exception as e: + logger.error(f"Error parsing DAX response: {str(e)}", exc_info=True) + return { + "dax_query": response.strip(), + "explanation": "Raw response (parsing failed)", + "confidence": 0.5, + "raw_response": response + } diff --git a/src/backend/src/services/powerbi_metadata_service.py b/src/backend/src/services/powerbi_metadata_service.py new file mode 100644 index 00000000..ad4153f6 --- /dev/null +++ b/src/backend/src/services/powerbi_metadata_service.py @@ -0,0 +1,303 @@ +""" +Power BI Metadata Service + +This service manages automatic metadata extraction and caching for Power BI semantic models. +It integrates with the metadata extractor notebook to fetch table/column information on-demand. +""" + +import json +import logging +from datetime import datetime, timedelta +from typing import Any, Dict, Optional +from sqlalchemy.ext.asyncio import AsyncSession +from databricks.sdk import WorkspaceClient +from databricks.sdk.service import jobs + +logger = logging.getLogger(__name__) + + +class PowerBIMetadataService: + """ + Service for automatic Power BI metadata extraction and caching. + + This service: + 1. Runs the metadata extractor notebook when needed + 2. Caches metadata results to avoid repeated extractions + 3. Provides metadata to DAXGeneratorService automatically + """ + + def __init__(self, session: AsyncSession, workspace_client: Optional[WorkspaceClient] = None): + """ + Initialize the Power BI Metadata Service. + + Args: + session: SQLAlchemy async session for database operations + workspace_client: Optional Databricks workspace client + """ + self.session = session + self.workspace_client = workspace_client or WorkspaceClient() + self._metadata_cache: Dict[str, Dict[str, Any]] = {} + self._cache_expiry: Dict[str, datetime] = {} + self.cache_ttl_hours = 24 # Cache metadata for 24 hours + + @classmethod + async def from_unit_of_work(cls, uow, workspace_client: Optional[WorkspaceClient] = None): + """ + Create service instance from Unit of Work. + + Args: + uow: Unit of Work instance + workspace_client: Optional Databricks workspace client + + Returns: + PowerBIMetadataService instance + """ + return cls(uow.session, workspace_client) + + async def get_metadata( + self, + semantic_model_id: str, + workspace_id: str, + auth_config: Dict[str, str], + force_refresh: bool = False + ) -> Dict[str, Any]: + """ + Get metadata for a Power BI semantic model. + + This method: + 1. Checks cache first + 2. If not cached or expired, runs metadata extractor notebook + 3. Caches result for future use + + Args: + semantic_model_id: Power BI semantic model/dataset ID + workspace_id: Power BI workspace ID + auth_config: Authentication configuration containing: + - auth_method: "device_code" or "service_principal" + - tenant_id: Azure AD tenant ID (optional, has default) + - client_id: Azure AD client ID (optional, has default) + - client_secret: Service principal secret (if using service_principal) + force_refresh: Force metadata refresh even if cached + + Returns: + Dictionary containing metadata structure: + { + "tables": [ + { + "name": "TableName", + "columns": [ + {"name": "ColumnName", "data_type": "string|int|decimal|datetime"} + ] + } + ] + } + """ + cache_key = f"{workspace_id}:{semantic_model_id}" + + # Check cache first (unless force refresh) + if not force_refresh and self._is_cached(cache_key): + logger.info(f"Using cached metadata for semantic model: {semantic_model_id}") + return self._metadata_cache[cache_key] + + # Extract metadata by running notebook + logger.info(f"Extracting metadata for semantic model: {semantic_model_id}") + + try: + metadata = await self._extract_metadata_via_notebook( + semantic_model_id=semantic_model_id, + workspace_id=workspace_id, + auth_config=auth_config + ) + + # Cache the result + self._metadata_cache[cache_key] = metadata + self._cache_expiry[cache_key] = datetime.now() + timedelta(hours=self.cache_ttl_hours) + + logger.info( + f"Metadata extracted and cached for {semantic_model_id}: " + f"{len(metadata.get('tables', []))} tables" + ) + + return metadata + + except Exception as e: + logger.error(f"Error extracting metadata: {str(e)}", exc_info=True) + raise + + async def _extract_metadata_via_notebook( + self, + semantic_model_id: str, + workspace_id: str, + auth_config: Dict[str, str] + ) -> Dict[str, Any]: + """ + Extract metadata by running the powerbi_metadata_extractor notebook. + + Args: + semantic_model_id: Power BI semantic model ID + workspace_id: Power BI workspace ID + auth_config: Authentication configuration + + Returns: + Extracted metadata dictionary + """ + try: + # Get authenticated user's email for notebook path + current_user = self.workspace_client.current_user.me() + user_email = current_user.user_name + + # Notebook path + notebook_path = f"/Users/{user_email}/kasal_notebooks/powerbi_metadata_extractor" + + # Build job parameters + job_params = { + "workspace_id": workspace_id, + "semantic_model_id": semantic_model_id, + "auth_method": auth_config.get("auth_method", "service_principal"), + "sample_size": 100, + "output_format": "json" + } + + # Add auth-specific parameters + if auth_config.get("tenant_id"): + job_params["tenant_id"] = auth_config["tenant_id"] + if auth_config.get("client_id"): + job_params["client_id"] = auth_config["client_id"] + if auth_config.get("client_secret"): + job_params["client_secret"] = auth_config["client_secret"] + + logger.info(f"Running metadata extractor notebook: {notebook_path}") + logger.info(f"Job parameters: {self._sanitize_params_for_log(job_params)}") + + # Submit notebook run + run_result = self.workspace_client.jobs.submit( + run_name=f"powerbi_metadata_extraction_{semantic_model_id}", + tasks=[ + jobs.SubmitTask( + task_key="extract_metadata", + notebook_task=jobs.NotebookTask( + notebook_path=notebook_path, + base_parameters={"job_params": json.dumps(job_params)} + ), + # Use a small cluster for metadata extraction + new_cluster=jobs.ClusterSpec( + spark_version="13.3.x-scala2.12", + node_type_id="i3.xlarge", + num_workers=0, # Single node cluster + spark_conf={ + "spark.databricks.cluster.profile": "singleNode", + "spark.master": "local[*]" + }, + custom_tags={"ResourceClass": "SingleNode"} + ) + ) + ] + ) + + run_id = run_result.run_id + logger.info(f"Metadata extraction job submitted: run_id={run_id}") + + # Wait for completion + run = self.workspace_client.jobs.wait_get_run_job_terminated_or_skipped(run_id) + + # Check result + if run.state.result_state == jobs.RunResultState.SUCCESS: + logger.info(f"Metadata extraction completed successfully: run_id={run_id}") + + # Get the output from notebook + output = self.workspace_client.jobs.get_run_output(run_id) + + if output.notebook_output and output.notebook_output.result: + result_data = json.loads(output.notebook_output.result) + + # Extract the compact_metadata (PowerBITool format) + if "compact_metadata" in result_data: + return result_data["compact_metadata"] + elif "metadata" in result_data: + return result_data["metadata"] + else: + raise ValueError("Notebook output missing metadata") + + else: + raise ValueError("No output from metadata extractor notebook") + + else: + error_msg = f"Metadata extraction failed: {run.state.state_message}" + logger.error(error_msg) + raise RuntimeError(error_msg) + + except Exception as e: + logger.error(f"Error running metadata extraction notebook: {str(e)}", exc_info=True) + raise + + def _is_cached(self, cache_key: str) -> bool: + """ + Check if metadata is cached and not expired. + + Args: + cache_key: Cache key for the metadata + + Returns: + True if cached and valid, False otherwise + """ + if cache_key not in self._metadata_cache: + return False + + if cache_key not in self._cache_expiry: + return False + + # Check if expired + if datetime.now() > self._cache_expiry[cache_key]: + # Remove expired entry + del self._metadata_cache[cache_key] + del self._cache_expiry[cache_key] + return False + + return True + + def clear_cache(self, semantic_model_id: Optional[str] = None, workspace_id: Optional[str] = None): + """ + Clear metadata cache. + + Args: + semantic_model_id: If provided, clear only this model's cache + workspace_id: If provided along with semantic_model_id, clear specific cache + """ + if semantic_model_id and workspace_id: + cache_key = f"{workspace_id}:{semantic_model_id}" + if cache_key in self._metadata_cache: + del self._metadata_cache[cache_key] + del self._cache_expiry[cache_key] + logger.info(f"Cleared cache for: {cache_key}") + else: + self._metadata_cache.clear() + self._cache_expiry.clear() + logger.info("Cleared all metadata cache") + + def get_cache_status(self) -> Dict[str, Any]: + """ + Get current cache status. + + Returns: + Dictionary with cache statistics + """ + return { + "cached_models": len(self._metadata_cache), + "cache_keys": list(self._metadata_cache.keys()), + "cache_ttl_hours": self.cache_ttl_hours + } + + def _sanitize_params_for_log(self, params: Dict[str, Any]) -> Dict[str, Any]: + """ + Sanitize parameters for logging (hide secrets). + + Args: + params: Original parameters + + Returns: + Sanitized parameters with secrets masked + """ + sanitized = params.copy() + if "client_secret" in sanitized: + sanitized["client_secret"] = "***REDACTED***" + return sanitized diff --git a/src/backend/src/services/powerbi_service.py b/src/backend/src/services/powerbi_service.py new file mode 100644 index 00000000..efe24784 --- /dev/null +++ b/src/backend/src/services/powerbi_service.py @@ -0,0 +1,367 @@ +""" +Power BI Integration Service + +This service provides end-to-end Power BI integration: +1. Automatic metadata extraction +2. DAX query generation from natural language +3. DAX query execution via Databricks notebooks + +Users only need to provide: +- semantic_model_id +- question + +Everything else is handled automatically! +""" + +import json +import logging +from typing import Any, Dict, Optional +from sqlalchemy.ext.asyncio import AsyncSession +from databricks.sdk import WorkspaceClient +from databricks.sdk.service import jobs + +from src.services.powerbi_metadata_service import PowerBIMetadataService +from src.services.dax_generator_service import DAXGeneratorService + +logger = logging.getLogger(__name__) + + +class PowerBIService: + """ + End-to-end Power BI integration service. + + This service orchestrates: + 1. Metadata extraction (automatic, cached) + 2. DAX query generation from questions + 3. DAX query execution in Databricks + + Usage: + service = await PowerBIService.from_unit_of_work(uow) + + # User only provides semantic_model_id and question! + result = await service.generate_and_prepare_dax( + semantic_model_id="a17de62e-8dc0-4a8a-acaa-2a9954de8c75", + workspace_id="bcb084ed-f8c9-422c-b148-29839c0f9227", + question="What is the total NSR per product?", + auth_config={ + "auth_method": "service_principal", + "client_id": "...", + "tenant_id": "...", + "client_secret": "..." + } + ) + + # Result contains DAX query ready to execute! + """ + + def __init__( + self, + session: AsyncSession, + workspace_client: Optional[WorkspaceClient] = None + ): + """ + Initialize the Power BI Service. + + Args: + session: SQLAlchemy async session + workspace_client: Optional Databricks workspace client + """ + self.session = session + self.workspace_client = workspace_client or WorkspaceClient() + + # Initialize sub-services + self.metadata_service = PowerBIMetadataService(session, workspace_client) + self.dax_generator_service = DAXGeneratorService(session) + + @classmethod + async def from_unit_of_work(cls, uow, workspace_client: Optional[WorkspaceClient] = None): + """ + Create service instance from Unit of Work. + + Args: + uow: Unit of Work instance + workspace_client: Optional Databricks workspace client + + Returns: + PowerBIService instance + """ + return cls(uow.session, workspace_client) + + async def generate_and_prepare_dax( + self, + semantic_model_id: str, + workspace_id: str, + question: str, + auth_config: Dict[str, str], + model_name: str = "databricks-meta-llama-3-1-405b-instruct", + temperature: float = 0.1, + force_metadata_refresh: bool = False + ) -> Dict[str, Any]: + """ + Generate DAX query from question with automatic metadata extraction. + + This is the main method users call - it handles everything automatically! + + Args: + semantic_model_id: Power BI semantic model/dataset ID + workspace_id: Power BI workspace ID + question: Natural language question (e.g., "What is total sales per region?") + auth_config: Authentication configuration: + { + "auth_method": "service_principal", + "client_id": "...", + "tenant_id": "...", + "client_secret": "..." + } + model_name: LLM model to use for DAX generation + temperature: Temperature for LLM generation + force_metadata_refresh: Force metadata refresh even if cached + + Returns: + Dictionary containing: + { + "dax_query": "EVALUATE ...", + "explanation": "This query calculates...", + "confidence": 0.9, + "metadata": {...}, # The metadata used + "ready_for_execution": True, + "execution_params": { + "semantic_model_id": "...", + "workspace_id": "...", + "dax_statement": "..." + } + } + """ + try: + logger.info(f"PowerBI Service: Generating DAX for question: {question[:100]}") + logger.info(f" Semantic Model ID: {semantic_model_id}") + logger.info(f" Workspace ID: {workspace_id}") + + # Step 1: Get metadata (automatic extraction with caching) + logger.info("Step 1: Extracting metadata...") + metadata = await self.metadata_service.get_metadata( + semantic_model_id=semantic_model_id, + workspace_id=workspace_id, + auth_config=auth_config, + force_refresh=force_metadata_refresh + ) + + logger.info(f" Metadata retrieved: {len(metadata.get('tables', []))} tables") + + # Step 2: Generate DAX query + logger.info("Step 2: Generating DAX query...") + dax_result = await self.dax_generator_service.generate_dax_from_question( + question=question, + metadata=metadata, + model_name=model_name, + temperature=temperature + ) + + logger.info(f" DAX generated with confidence: {dax_result['confidence']:.0%}") + + # Step 3: Prepare execution parameters + execution_params = { + "semantic_model_id": semantic_model_id, + "workspace_id": workspace_id, + "dax_statement": dax_result["dax_query"], + "auth_method": auth_config.get("auth_method", "service_principal") + } + + # Add auth parameters + if auth_config.get("client_id"): + execution_params["client_id"] = auth_config["client_id"] + if auth_config.get("tenant_id"): + execution_params["tenant_id"] = auth_config["tenant_id"] + if auth_config.get("client_secret"): + execution_params["client_secret"] = auth_config["client_secret"] + + # Build complete result + result = { + "dax_query": dax_result["dax_query"], + "explanation": dax_result["explanation"], + "confidence": dax_result["confidence"], + "question": question, + "metadata": metadata, + "metadata_tables_count": len(metadata.get("tables", [])), + "ready_for_execution": True, + "execution_params": execution_params, + "next_step": ( + "Use DatabricksJobsTool to execute this DAX query. " + "Pass the execution_params as job_params to the powerbi_dax_executor notebook." + ) + } + + logger.info("✅ PowerBI Service: DAX generation complete and ready for execution") + + return result + + except Exception as e: + logger.error(f"Error in PowerBI Service: {str(e)}", exc_info=True) + raise + + async def execute_dax_query( + self, + dax_query: str, + semantic_model_id: str, + workspace_id: str, + auth_config: Dict[str, str] + ) -> Dict[str, Any]: + """ + Execute a DAX query via the powerbi_dax_executor notebook. + + Args: + dax_query: DAX query to execute + semantic_model_id: Power BI semantic model ID + workspace_id: Power BI workspace ID + auth_config: Authentication configuration + + Returns: + Query execution results + """ + try: + # Get authenticated user's email for notebook path + current_user = self.workspace_client.current_user.me() + user_email = current_user.user_name + + # Notebook path + notebook_path = f"/Users/{user_email}/kasal_notebooks/powerbi_dax_executor" + + # Build job parameters + job_params = { + "dax_statement": dax_query, + "workspace_id": workspace_id, + "semantic_model_id": semantic_model_id, + "auth_method": auth_config.get("auth_method", "service_principal") + } + + # Add auth parameters + if auth_config.get("tenant_id"): + job_params["tenant_id"] = auth_config["tenant_id"] + if auth_config.get("client_id"): + job_params["client_id"] = auth_config["client_id"] + if auth_config.get("client_secret"): + job_params["client_secret"] = auth_config["client_secret"] + + logger.info(f"Executing DAX query via notebook: {notebook_path}") + + # Submit notebook run + run_result = self.workspace_client.jobs.submit( + run_name=f"powerbi_dax_execution_{semantic_model_id}", + tasks=[ + jobs.SubmitTask( + task_key="execute_dax", + notebook_task=jobs.NotebookTask( + notebook_path=notebook_path, + base_parameters={"job_params": json.dumps(job_params)} + ), + new_cluster=jobs.ClusterSpec( + spark_version="13.3.x-scala2.12", + node_type_id="i3.xlarge", + num_workers=0, + spark_conf={ + "spark.databricks.cluster.profile": "singleNode", + "spark.master": "local[*]" + }, + custom_tags={"ResourceClass": "SingleNode"} + ) + ) + ] + ) + + run_id = run_result.run_id + logger.info(f"DAX execution job submitted: run_id={run_id}") + + # Wait for completion + run = self.workspace_client.jobs.wait_get_run_job_terminated_or_skipped(run_id) + + # Check result + if run.state.result_state == jobs.RunResultState.SUCCESS: + logger.info(f"DAX execution completed successfully: run_id={run_id}") + + # Get the output + output = self.workspace_client.jobs.get_run_output(run_id) + + if output.notebook_output and output.notebook_output.result: + result_data = json.loads(output.notebook_output.result) + return { + "status": "success", + "run_id": run_id, + "result": result_data + } + else: + return { + "status": "success", + "run_id": run_id, + "result": None, + "message": "Execution successful but no output returned" + } + + else: + error_msg = f"DAX execution failed: {run.state.state_message}" + logger.error(error_msg) + return { + "status": "failed", + "run_id": run_id, + "error": error_msg + } + + except Exception as e: + logger.error(f"Error executing DAX query: {str(e)}", exc_info=True) + raise + + async def get_metadata_status( + self, + semantic_model_id: Optional[str] = None, + workspace_id: Optional[str] = None + ) -> Dict[str, Any]: + """ + Get metadata cache status. + + Args: + semantic_model_id: Optional semantic model ID to check + workspace_id: Optional workspace ID + + Returns: + Cache status information + """ + status = self.metadata_service.get_cache_status() + + if semantic_model_id and workspace_id: + cache_key = f"{workspace_id}:{semantic_model_id}" + status["queried_model_cached"] = cache_key in status["cache_keys"] + + return status + + async def refresh_metadata( + self, + semantic_model_id: str, + workspace_id: str, + auth_config: Dict[str, str] + ) -> Dict[str, Any]: + """ + Force refresh metadata for a semantic model. + + Args: + semantic_model_id: Power BI semantic model ID + workspace_id: Power BI workspace ID + auth_config: Authentication configuration + + Returns: + Refreshed metadata + """ + logger.info(f"Force refreshing metadata for: {semantic_model_id}") + + metadata = await self.metadata_service.get_metadata( + semantic_model_id=semantic_model_id, + workspace_id=workspace_id, + auth_config=auth_config, + force_refresh=True + ) + + return { + "status": "refreshed", + "semantic_model_id": semantic_model_id, + "workspace_id": workspace_id, + "tables_count": len(metadata.get("tables", [])), + "metadata": metadata + } diff --git a/src/backend/src/utils/notebook_deployment.py b/src/backend/src/utils/notebook_deployment.py new file mode 100644 index 00000000..82edc427 --- /dev/null +++ b/src/backend/src/utils/notebook_deployment.py @@ -0,0 +1,238 @@ +""" +Notebook Deployment Utility + +Handles deployment of notebook templates to Databricks workspace. +""" + +import logging +from pathlib import Path +from typing import Optional, List +from databricks.sdk import WorkspaceClient +from databricks.sdk.service.workspace import ImportFormat + +logger = logging.getLogger(__name__) + + +class NotebookDeployer: + """Deploy notebook templates to Databricks workspace.""" + + def __init__(self, workspace_client: Optional[WorkspaceClient] = None): + """ + Initialize NotebookDeployer. + + Args: + workspace_client: Optional WorkspaceClient instance. If not provided, + will create one using default authentication. + """ + self.client = workspace_client or WorkspaceClient() + + def deploy_notebook( + self, + notebook_path: Path, + workspace_path: str, + overwrite: bool = True, + format: ImportFormat = ImportFormat.SOURCE + ) -> bool: + """ + Deploy a single notebook to Databricks workspace. + + Args: + notebook_path: Local path to the notebook file + workspace_path: Destination path in Databricks workspace + overwrite: Whether to overwrite existing notebook + format: Import format (SOURCE, HTML, JUPYTER, or DBC) + + Returns: + bool: True if deployment successful, False otherwise + """ + try: + logger.info(f"Deploying notebook: {notebook_path.name}") + logger.info(f" Source: {notebook_path}") + logger.info(f" Destination: {workspace_path}") + + # Read notebook content + with open(notebook_path, 'rb') as f: + content = f.read() + + # Import notebook to workspace + self.client.workspace.import_( + path=workspace_path, + format=format, + content=content, + overwrite=overwrite + ) + + logger.info(f"✅ Notebook deployed successfully: {workspace_path}") + return True + + except Exception as e: + logger.error(f"❌ Failed to deploy notebook {notebook_path.name}: {str(e)}") + return False + + def deploy_notebooks_directory( + self, + notebooks_dir: Path, + workspace_base_path: str, + overwrite: bool = True, + patterns: Optional[List[str]] = None + ) -> dict: + """ + Deploy all notebooks from a directory to Databricks workspace. + + Args: + notebooks_dir: Local directory containing notebooks + workspace_base_path: Base path in Databricks workspace + overwrite: Whether to overwrite existing notebooks + patterns: Optional list of file patterns to include (e.g., ['*.py', '*.ipynb']) + + Returns: + dict: Summary of deployment with success/failure counts + """ + if not notebooks_dir.exists(): + logger.error(f"Notebooks directory not found: {notebooks_dir}") + return {"success": 0, "failed": 0, "total": 0} + + # Default patterns if none provided + if patterns is None: + patterns = ['*.py', '*.ipynb'] + + # Find all matching notebook files + notebook_files = [] + for pattern in patterns: + notebook_files.extend(notebooks_dir.glob(pattern)) + + if not notebook_files: + logger.warning(f"No notebook files found in {notebooks_dir}") + return {"success": 0, "failed": 0, "total": 0} + + logger.info(f"Found {len(notebook_files)} notebooks to deploy") + + # Deploy each notebook + success_count = 0 + failed_count = 0 + + for notebook_file in notebook_files: + # Determine workspace path + relative_path = notebook_file.relative_to(notebooks_dir) + workspace_path = f"{workspace_base_path}/{relative_path}".replace('\\', '/') + + # Remove .py or .ipynb extension from workspace path + if workspace_path.endswith('.py'): + workspace_path = workspace_path[:-3] + elif workspace_path.endswith('.ipynb'): + workspace_path = workspace_path[:-6] + + # Deploy notebook + if self.deploy_notebook(notebook_file, workspace_path, overwrite): + success_count += 1 + else: + failed_count += 1 + + summary = { + "success": success_count, + "failed": failed_count, + "total": len(notebook_files) + } + + logger.info("=" * 80) + logger.info("Notebook Deployment Summary") + logger.info("=" * 80) + logger.info(f"✅ Successfully deployed: {success_count}") + logger.info(f"❌ Failed to deploy: {failed_count}") + logger.info(f"📊 Total notebooks: {len(notebook_files)}") + logger.info("=" * 80) + + return summary + + def ensure_workspace_directory(self, workspace_path: str) -> bool: + """ + Ensure a directory exists in Databricks workspace. + + Args: + workspace_path: Path to directory in workspace + + Returns: + bool: True if directory exists or was created, False otherwise + """ + try: + # Try to get directory info + try: + self.client.workspace.get_status(workspace_path) + logger.debug(f"Directory exists: {workspace_path}") + return True + except Exception: + # Directory doesn't exist, create it + self.client.workspace.mkdirs(workspace_path) + logger.info(f"✅ Created workspace directory: {workspace_path}") + return True + + except Exception as e: + logger.error(f"❌ Failed to ensure directory {workspace_path}: {str(e)}") + return False + + +def deploy_powerbi_notebooks( + user_name: str, + workspace_client: Optional[WorkspaceClient] = None, + overwrite: bool = True +) -> dict: + """ + Deploy Power BI related notebooks to Databricks workspace. + + This function deploys the Power BI DAX executor notebook template + to the user's workspace. + + Args: + user_name: Databricks user name (e.g., user@example.com) + workspace_client: Optional WorkspaceClient instance + overwrite: Whether to overwrite existing notebooks + + Returns: + dict: Deployment summary + """ + deployer = NotebookDeployer(workspace_client) + + # Determine paths + templates_dir = Path(__file__).parent.parent / "engines" / "crewai" / "tools" / "templates" / "notebooks" + workspace_base_path = f"/Users/{user_name}/kasal_notebooks" + + logger.info(f"Deploying Power BI notebooks from: {templates_dir}") + logger.info(f"Deploying to: {workspace_base_path}") + + # Ensure workspace directory exists + deployer.ensure_workspace_directory(workspace_base_path) + + # Deploy notebooks + summary = deployer.deploy_notebooks_directory( + notebooks_dir=templates_dir, + workspace_base_path=workspace_base_path, + overwrite=overwrite, + patterns=['powerbi_*.py'] # Only deploy Power BI notebooks + ) + + return summary + + +if __name__ == "__main__": + import sys + + if len(sys.argv) < 2: + print("Usage: python notebook_deployment.py ") + print("Example: python notebook_deployment.py user@example.com") + sys.exit(1) + + user_name = sys.argv[1] + + # Configure logging + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + + # Deploy notebooks + summary = deploy_powerbi_notebooks(user_name) + + if summary["failed"] > 0: + sys.exit(1) + else: + sys.exit(0) diff --git a/src/backend/src/utils/powerbi_connector.py b/src/backend/src/utils/powerbi_connector.py new file mode 100644 index 00000000..6cf1d44a --- /dev/null +++ b/src/backend/src/utils/powerbi_connector.py @@ -0,0 +1,189 @@ +""" +PowerBI Connector Utility + +This module provides connectivity to Power BI datasets via XMLA endpoints. +It's extracted from the reference implementation to provide DAX query generation +capabilities without the execution component (execution happens in Databricks notebooks). +""" + +import logging +import re +from typing import Any, Dict, List, Optional + +logger = logging.getLogger(__name__) + + +def clean_dax_query(dax_query: str) -> str: + """ + Remove HTML/XML tags and other artifacts from DAX queries. + + Args: + dax_query: Raw DAX query string that may contain artifacts + + Returns: + Cleaned DAX query string + """ + # Remove HTML/XML tags like , , etc. + cleaned = re.sub(r"<[^>]+>", "", dax_query) + # Collapse extra whitespace + cleaned = " ".join(cleaned.split()) + return cleaned + + +class PowerBIMetadataExtractor: + """ + Extracts metadata from Power BI datasets without requiring ADOMD.NET. + + This class provides methods to discover tables, columns, measures, and relationships + from Power BI datasets. It's designed to work with the metadata structure + without executing queries. + + Note: Actual XMLA connection requires pyadomd which is Windows-only. + For production use with Databricks, metadata should be cached or provided + via configuration. + """ + + def __init__(self): + """Initialize the metadata extractor.""" + self.metadata_cache: Dict[str, Any] = {} + + def set_metadata(self, metadata: Dict[str, Any]) -> None: + """ + Set cached metadata for a Power BI dataset. + + Args: + metadata: Dictionary containing tables, columns, measures, and relationships + """ + self.metadata_cache = metadata + logger.info(f"Metadata cache updated with {len(metadata.get('tables', []))} tables") + + def get_tables(self) -> List[Dict[str, Any]]: + """ + Get list of tables from cached metadata. + + Returns: + List of table dictionaries with name, description, and relationships + """ + return self.metadata_cache.get('tables', []) + + def get_table_schema(self, table_name: str) -> Optional[Dict[str, Any]]: + """ + Get schema information for a specific table. + + Args: + table_name: Name of the table + + Returns: + Dictionary with table schema including columns and their types + """ + tables = self.metadata_cache.get('tables', []) + for table in tables: + if table.get('name') == table_name: + return table + return None + + def get_relationships(self) -> List[Dict[str, Any]]: + """ + Get all relationships from the dataset. + + Returns: + List of relationship dictionaries + """ + relationships = [] + tables = self.metadata_cache.get('tables', []) + for table in tables: + table_relationships = table.get('relationships', []) + relationships.extend(table_relationships) + return relationships + + def format_metadata_for_llm(self) -> str: + """ + Format metadata as a readable string for LLM context. + + Returns: + Formatted string describing the dataset structure + """ + tables = self.get_tables() + if not tables: + return "No metadata available" + + output = "Power BI Dataset Structure:\n\n" + + for table in tables: + table_name = table.get('name', 'Unknown') + description = table.get('description', 'No description') + columns = table.get('columns', []) + relationships = table.get('relationships', []) + + output += f"Table: {table_name}\n" + output += f"Description: {description}\n" + + if columns: + output += "Columns:\n" + for col in columns: + col_name = col.get('name', 'Unknown') + col_desc = col.get('description', 'No description') + col_type = col.get('data_type', 'Unknown') + output += f" - {col_name} ({col_type}): {col_desc}\n" + + if relationships: + output += "Relationships:\n" + for rel in relationships: + related_table = rel.get('relatedTable', 'Unknown') + from_col = rel.get('fromColumn', 'Unknown') + to_col = rel.get('toColumn', 'Unknown') + rel_type = rel.get('relationshipType', 'Unknown') + output += f" - {rel_type} with {related_table}: {from_col} → {to_col}\n" + + output += "\n" + + return output + + +class PowerBIConnectorConfig: + """Configuration for Power BI connection.""" + + def __init__( + self, + xmla_endpoint: str, + dataset_name: str, + tenant_id: Optional[str] = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None + ): + """ + Initialize Power BI connection configuration. + + Args: + xmla_endpoint: Power BI XMLA endpoint URL (e.g., powerbi://api.powerbi.com/v1.0/myorg/workspace) + dataset_name: Name of the Power BI dataset + tenant_id: Azure AD tenant ID (optional, for service principal auth) + client_id: Service principal client ID (optional) + client_secret: Service principal client secret (optional) + """ + self.xmla_endpoint = xmla_endpoint + self.dataset_name = dataset_name + self.tenant_id = tenant_id + self.client_id = client_id + self.client_secret = client_secret + + def to_dict(self) -> Dict[str, Any]: + """Convert configuration to dictionary.""" + return { + "xmla_endpoint": self.xmla_endpoint, + "dataset_name": self.dataset_name, + "tenant_id": self.tenant_id, + "client_id": self.client_id, + # Don't include client_secret in dict representation + } + + @classmethod + def from_dict(cls, config_dict: Dict[str, Any]) -> "PowerBIConnectorConfig": + """Create configuration from dictionary.""" + return cls( + xmla_endpoint=config_dict["xmla_endpoint"], + dataset_name=config_dict["dataset_name"], + tenant_id=config_dict.get("tenant_id"), + client_id=config_dict.get("client_id"), + client_secret=config_dict.get("client_secret") + ) diff --git a/src/backend/src/utils/powerbi_job_setup.py b/src/backend/src/utils/powerbi_job_setup.py new file mode 100644 index 00000000..2f7fd520 --- /dev/null +++ b/src/backend/src/utils/powerbi_job_setup.py @@ -0,0 +1,300 @@ +""" +Power BI Job Setup Utility + +Uploads Power BI notebooks to Databricks and creates persistent jobs. +Similar to gmaps_search job setup pattern. +""" + +import logging +from pathlib import Path +from typing import Optional, Dict, Any + +from databricks.sdk import WorkspaceClient +from databricks.sdk.service.workspace import ImportFormat, Language +from databricks.sdk.service import jobs + +logger = logging.getLogger(__name__) + + +class PowerBIJobSetup: + """Setup Power BI notebooks and jobs in Databricks.""" + + def __init__(self, workspace_client: Optional[WorkspaceClient] = None): + """ + Initialize the job setup utility. + + Args: + workspace_client: Optional Databricks workspace client + """ + self.client = workspace_client or WorkspaceClient() + + # Get notebooks directory + current_file = Path(__file__) + self.notebooks_dir = ( + current_file.parent.parent / "engines" / "crewai" / "tools" / "templates" / "notebooks" + ) + + def upload_notebook( + self, + notebook_name: str, + user_email: Optional[str] = None + ) -> str: + """ + Upload a notebook to Databricks workspace. + + Args: + notebook_name: Name of the notebook (without .py extension) + user_email: Optional user email for workspace path + + Returns: + Workspace path where notebook was uploaded + """ + # Determine workspace path + if user_email: + workspace_path = f"/Workspace/Users/{user_email}/notebooks/{notebook_name}" + else: + current_user = self.client.current_user.me() + workspace_path = f"/Workspace/Users/{current_user.user_name}/notebooks/{notebook_name}" + + # Local notebook path + local_notebook_path = self.notebooks_dir / f"{notebook_name}.py" + + if not local_notebook_path.exists(): + raise FileNotFoundError(f"Notebook not found: {local_notebook_path}") + + logger.info(f"Uploading notebook from: {local_notebook_path}") + logger.info(f"To workspace path: {workspace_path}") + + # Read notebook content + with open(local_notebook_path, 'r', encoding='utf-8') as f: + content = f.read() + + # Ensure parent directory exists + parent_path = str(Path(workspace_path).parent) + try: + self.client.workspace.mkdirs(parent_path) + except Exception as e: + logger.warning(f"Could not create parent directory (may already exist): {e}") + + # Upload notebook + self.client.workspace.upload( + path=workspace_path, + content=content.encode('utf-8'), + format=ImportFormat.SOURCE, + language=Language.PYTHON, + overwrite=True + ) + + logger.info(f"✅ Uploaded notebook to {workspace_path}") + + return workspace_path + + def create_metadata_extractor_job( + self, + user_email: Optional[str] = None, + use_serverless: bool = False + ) -> int: + """ + Create a persistent job for Power BI metadata extraction. + + Args: + user_email: Optional user email for workspace path + use_serverless: Whether to use serverless compute + + Returns: + Job ID of created job + """ + notebook_name = "powerbi_metadata_extractor" + + # Upload notebook + workspace_path = self.upload_notebook(notebook_name, user_email) + + # Job configuration + job_name = f"powerbi_metadata_extractor_{user_email or 'default'}" + + # Create task + if use_serverless: + # Serverless compute + task = jobs.Task( + task_key="extract_metadata", + notebook_task=jobs.NotebookTask( + notebook_path=workspace_path, + base_parameters={} + ), + timeout_seconds=3600, + environment_key="Default" # Serverless environment + ) + else: + # Single-node cluster + task = jobs.Task( + task_key="extract_metadata", + notebook_task=jobs.NotebookTask( + notebook_path=workspace_path, + base_parameters={} + ), + timeout_seconds=3600, + new_cluster=jobs.ClusterSpec( + spark_version="13.3.x-scala2.12", + node_type_id="i3.xlarge", + num_workers=0, + spark_conf={ + "spark.databricks.cluster.profile": "singleNode", + "spark.master": "local[*]" + }, + custom_tags={"ResourceClass": "SingleNode"} + ) + ) + + # Create job + response = self.client.jobs.create( + name=job_name, + description="Extract metadata from Power BI semantic models", + format=jobs.Format.MULTI_TASK, + tasks=[task], + max_concurrent_runs=3, + timeout_seconds=3600 + ) + + logger.info(f"✅ Created metadata extractor job with ID: {response.job_id}") + + return response.job_id + + def create_dax_executor_job( + self, + user_email: Optional[str] = None, + use_serverless: bool = False + ) -> int: + """ + Create a persistent job for Power BI DAX query execution. + + Args: + user_email: Optional user email for workspace path + use_serverless: Whether to use serverless compute + + Returns: + Job ID of created job + """ + notebook_name = "powerbi_dax_executor" + + # Upload notebook + workspace_path = self.upload_notebook(notebook_name, user_email) + + # Job configuration + job_name = f"powerbi_dax_executor_{user_email or 'default'}" + + # Create task + if use_serverless: + # Serverless compute + task = jobs.Task( + task_key="execute_dax", + notebook_task=jobs.NotebookTask( + notebook_path=workspace_path, + base_parameters={} + ), + timeout_seconds=3600, + environment_key="Default" # Serverless environment + ) + else: + # Single-node cluster + task = jobs.Task( + task_key="execute_dax", + notebook_task=jobs.NotebookTask( + notebook_path=workspace_path, + base_parameters={} + ), + timeout_seconds=3600, + new_cluster=jobs.ClusterSpec( + spark_version="13.3.x-scala2.12", + node_type_id="i3.xlarge", + num_workers=0, + spark_conf={ + "spark.databricks.cluster.profile": "singleNode", + "spark.master": "local[*]" + }, + custom_tags={"ResourceClass": "SingleNode"} + ) + ) + + # Create job + response = self.client.jobs.create( + name=job_name, + description="Execute DAX queries against Power BI datasets", + format=jobs.Format.MULTI_TASK, + tasks=[task], + max_concurrent_runs=5, + timeout_seconds=3600 + ) + + logger.info(f"✅ Created DAX executor job with ID: {response.job_id}") + + return response.job_id + + def setup_all_jobs( + self, + user_email: Optional[str] = None, + use_serverless: bool = False + ) -> Dict[str, int]: + """ + Setup all Power BI jobs. + + Args: + user_email: Optional user email for workspace path + use_serverless: Whether to use serverless compute + + Returns: + Dictionary with job IDs: {"metadata_extractor_job_id": ..., "dax_executor_job_id": ...} + """ + logger.info("Setting up Power BI jobs...") + + metadata_job_id = self.create_metadata_extractor_job(user_email, use_serverless) + dax_job_id = self.create_dax_executor_job(user_email, use_serverless) + + result = { + "metadata_extractor_job_id": metadata_job_id, + "dax_executor_job_id": dax_job_id + } + + logger.info("✅ All Power BI jobs created successfully!") + logger.info(f"Metadata Extractor Job ID: {metadata_job_id}") + logger.info(f"DAX Executor Job ID: {dax_job_id}") + + return result + + +def setup_powerbi_jobs( + user_email: Optional[str] = None, + use_serverless: bool = False +) -> Dict[str, int]: + """ + Convenience function to setup Power BI jobs. + + Args: + user_email: Optional user email for workspace path + use_serverless: Whether to use serverless compute + + Returns: + Dictionary with job IDs + """ + setup = PowerBIJobSetup() + return setup.setup_all_jobs(user_email, use_serverless) + + +# CLI usage +if __name__ == "__main__": + import sys + + user_email = sys.argv[1] if len(sys.argv) > 1 else None + use_serverless = "--serverless" in sys.argv + + print(f"Setting up Power BI jobs for user: {user_email or 'current user'}") + print(f"Using serverless: {use_serverless}") + + result = setup_powerbi_jobs(user_email, use_serverless) + + print("\n" + "="*60) + print("✅ Setup Complete!") + print("="*60) + print(f"Metadata Extractor Job ID: {result['metadata_extractor_job_id']}") + print(f"DAX Executor Job ID: {result['dax_executor_job_id']}") + print("\nSave these job IDs - you'll need them for your crew configuration!") + print("="*60) diff --git a/src/deploy.py b/src/deploy.py index cf521536..08e586ce 100644 --- a/src/deploy.py +++ b/src/deploy.py @@ -340,10 +340,74 @@ def deploy_source_to_databricks( logger.info(f"Starting app: {app_name}") client.apps.start(app_name) logger.info(f"App started. Check the app URL: {client.config.host}#apps/{app_name}") + + # Create Power BI reference jobs after successful deployment + try: + logger.info("=" * 60) + logger.info("📊 Creating Power BI reference jobs...") + logger.info("=" * 60) + + from backend.src.utils.powerbi_job_setup import PowerBIJobSetup + + # Get notebook paths from deployed location + notebooks_dir = Path(workspace_dir) / "backend" / "src" / "engines" / "crewai" / "tools" / "templates" / "notebooks" + + # Initialize job setup with deployed workspace client + job_setup = PowerBIJobSetup(workspace_client=client) + + # Override notebooks_dir to point to deployed location + job_setup.notebooks_dir = notebooks_dir + + # Create jobs + result = job_setup.setup_all_jobs(user_email=user_name, use_serverless=False) + + logger.info("=" * 60) + logger.info("✅ Power BI Jobs Created Successfully!") + logger.info("=" * 60) + logger.info(f"📌 Metadata Extractor Job ID: {result['metadata_extractor_job_id']}") + logger.info(f"📌 DAX Executor Job ID: {result['dax_executor_job_id']}") + logger.info("") + logger.info("💡 Save these job IDs - you'll need them for crew configuration!") + logger.info("=" * 60) + + except Exception as job_error: + logger.warning(f"⚠️ Power BI job creation failed (non-critical): {job_error}") + logger.warning("You can create jobs manually later with: python -m src.utils.powerbi_job_setup") + return True except Exception as start_error: if "compute is in ACTIVE state" in str(start_error): logger.info("App is already running - deployment successful!") + + # Try to create Power BI jobs even if app was already running + try: + logger.info("=" * 60) + logger.info("📊 Creating Power BI reference jobs...") + logger.info("=" * 60) + + from backend.src.utils.powerbi_job_setup import PowerBIJobSetup + + # Get notebook paths from deployed location + notebooks_dir = Path(workspace_dir) / "backend" / "src" / "engines" / "crewai" / "tools" / "templates" / "notebooks" + + job_setup = PowerBIJobSetup(workspace_client=client) + job_setup.notebooks_dir = notebooks_dir + + result = job_setup.setup_all_jobs(user_email=user_name, use_serverless=False) + + logger.info("=" * 60) + logger.info("✅ Power BI Jobs Created Successfully!") + logger.info("=" * 60) + logger.info(f"📌 Metadata Extractor Job ID: {result['metadata_extractor_job_id']}") + logger.info(f"📌 DAX Executor Job ID: {result['dax_executor_job_id']}") + logger.info("") + logger.info("💡 Save these job IDs - you'll need them for crew configuration!") + logger.info("=" * 60) + + except Exception as job_error: + logger.warning(f"⚠️ Power BI job creation failed (non-critical): {job_error}") + logger.warning("You can create jobs manually later with: python -m src.utils.powerbi_job_setup") + return True logger.error(f"Error starting app: {start_error}") try: diff --git a/src/docs/DEVELOPER_GUIDE.md b/src/docs/DEVELOPER_GUIDE.md new file mode 100644 index 00000000..093f54cf --- /dev/null +++ b/src/docs/DEVELOPER_GUIDE.md @@ -0,0 +1,168 @@ +## Developer Guide + +### Requirements +- Python 3.9+ +- Node.js 18+ +- Postgres (recommended) or SQLite for local dev +- Databricks access if exercising Databricks features + +### Quick start +```bash +# Backend +cd src/backend +python -m venv .venv && source .venv/bin/activate +pip install -r ../requirements.txt +./run.sh # http://localhost:8000 (OpenAPI at /api-docs if enabled) + +# Frontend +cd ../frontend +npm install +npm start # http://localhost:3000 +``` + +Health check: +```bash +curl http://localhost:8000/health +# {"status":"healthy"} +``` + +### Configuration +Backend settings: `src/backend/src/config/settings.py` +- Core: `DEBUG_MODE`, `LOG_LEVEL`, `DOCS_ENABLED`, `AUTO_SEED_DATABASE` +- Database: + - `DATABASE_TYPE=postgres|sqlite` (default: `postgres`) + - Postgres: `POSTGRES_SERVER`, `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` + - SQLite: `SQLITE_DB_PATH=./app.db` + - SQL logging: `SQL_DEBUG=true|false` +- Notes: + - `USE_NULLPOOL` is set early in `main.py` to avoid asyncpg pool issues + - Logs written under `src/backend/src/logs/` + +Frontend API base URL (`REACT_APP_API_URL`) at build-time: +```bash +# Option A: dev default already points to http://localhost:8000/api/v1 +# Option B: override explicitly for a build (Unix/macOS) +REACT_APP_API_URL="http://localhost:8000/api/v1" npm run build + +# When using the top-level build script: +# The env var will propagate into the "npm run build" it runs +cd src +REACT_APP_API_URL="http://localhost:8000/api/v1" python build.py +``` + +### Conventions +- Routers (`api/*`): Validate with `schemas/*`, delegate to `services/*` +- Services: Business logic only; use repositories for I/O +- Repositories: All SQL/external I/O; don’t leak ORM to services +- Models: SQLAlchemy in `models/*`; Schemas: Pydantic in `schemas/*` + +### Add a new API resource (“widgets” example) +1) Model: `models/widget.py`; import in `db/all_models.py` +2) Schemas: `schemas/widget.py` (Create/Update/Read DTOs) +3) Repository: `repositories/widget_repository.py` +4) Service: `services/widget_service.py` +5) Router: `api/widgets_router.py` (validate → call service) +6) Register router in `api/__init__.py` +7) Frontend: add `src/frontend/src/api/widgets.ts` + components/views/state +8) Tests: `src/backend/tests/` + +### Add a new CrewAI tool +- Implement under `engines/crewai/tools/` (follow existing patterns) +- Expose configuration via service/router if user-configurable +- Ensure discovery/registration in the execution path (e.g., prep or service) + +### Executions and tracing +- Start executions via `executions_router.py` endpoints +- Services invoke engine flow (`engines/crewai/*`) +- Logs/traces: + - Execution logs via `execution_logs_*` + - Traces via `execution_trace_*` +```bash +# Kick off an execution +curl -X POST http://localhost:8000/api/v1/executions -H "Content-Type: application/json" -d '{...}' + +# Get execution status +curl http://localhost:8000/api/v1/executions/ + +# Fetch logs/trace +curl http://localhost:8000/api/v1/execution-logs/ +curl http://localhost:8000/api/v1/execution-trace/ +``` + +### Background processing +- Scheduler: starts on DB-ready startup (`scheduler_service.py`) +- Embedding queue (SQLite): `embedding_queue_service.py` batches writes +- Cleanup on startup/shutdown: `execution_cleanup_service.py` + +### Database & migrations +- SQLite for quick local dev (`DATABASE_TYPE=sqlite`), Postgres for multi-user +- Alembic: +```bash +# after model changes +alembic revision --autogenerate -m "add widgets" +alembic upgrade head +``` + +### Auth, identity, tenancy +- Databricks headers parsed by `utils/user_context.py` +- Group-aware tenants; selected group passed in `group_id` header +- JWT/basic auth in `auth_router.py`, users in `users_router.py` +- Authorization checks in `core/permissions.py` + +### Logging & debugging +- App logs: `src/backend/src/logs/` (managed by `core/logger.py`) +- Verbose SQL: `export SQL_DEBUG=true` +- SQLite “database is locked”: mitigated via retry/backoff; reduce writers or use Postgres + +### Frontend notes +- Axios client and base URL: +```1:13:/Users/anshu.roy/Documents/kasal/src/frontend/src/config/api/ApiConfig.ts +export const config = { + apiUrl: + process.env.REACT_APP_API_URL || + (process.env.NODE_ENV === 'development' + ? 'http://localhost:8000/api/v1' + : '/api/v1'), +}; +export const apiClient = axios.create({ baseURL: config.apiUrl, headers: { 'Content-Type': 'application/json' } }); +``` + +### Testing +```bash +# Backend +python run_tests.py + +# Frontend +cd src/frontend +npm test +``` + +### Production checklist +- Use Postgres (or managed DB), not SQLite +- Harden secrets/tokens; externalize (e.g., Databricks Secrets/Vault) +- Enforce TLS and CORS +- Monitor logs/traces; set alerts +- Review `DOCS_ENABLED`, `LOG_LEVEL`, `DEBUG_MODE` + +## Resources + +### Quick Links +- [API Playground](/api/docs) +- [Video Tutorials](https://kasal.ai/videos) +- [Discord Community](https://discord.gg/kasal) +- [Report Issues](https://github.com/kasal/issues) + +### Code Examples +- [Basic Agent Setup](https://github.com/kasal/examples/basic) +- [Multi-Agent Collaboration](https://github.com/kasal/examples/multi-agent) +- [Custom Tools](https://github.com/kasal/examples/tools) +- [Production Deployment](https://github.com/kasal/examples/deploy) + +### Support +- **Chat**: Available in-app 24/7 +- **Email**: dev@kasal.ai +- **Slack**: #kasal-developers + +--- + +*Build smarter, ship faster with Kasal* \ No newline at end of file diff --git a/src/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md b/src/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md new file mode 100644 index 00000000..6493ba32 --- /dev/null +++ b/src/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md @@ -0,0 +1,400 @@ +# Power BI Notebook Deployment Guide + +## Quick Start + +The Power BI DAX executor notebook is automatically included when you deploy the Kasal application. + +### Automatic Deployment (Included in App Deployment) + +When you deploy Kasal, the notebook is automatically deployed: + +```bash +python src/deploy.py --app-name kasal --user-name your.email@company.com +``` + +**Deployed Notebooks**: +- `/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor` +- `/Users/your.email@company.com/kasal_notebooks/powerbi_metadata_extractor` + +### Manual Notebook Deployment (Optional) + +If you only need to deploy/update the notebooks: + +```bash +cd src/backend +python -m src.utils.notebook_deployment your.email@company.com +``` + +## Using the Deployed Notebook + +### Option 1: Create Databricks Job (Recommended) + +Use the DatabricksJobsTool or Databricks UI to create a job: + +```json +{ + "name": "Power BI DAX Executor", + "tasks": [ + { + "task_key": "execute_dax", + "notebook_task": { + "notebook_path": "/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor", + "base_parameters": {} + }, + "job_cluster_key": "default_cluster" + } + ], + "job_clusters": [ + { + "job_cluster_key": "default_cluster", + "new_cluster": { + "spark_version": "13.3.x-scala2.12", + "node_type_id": "i3.xlarge", + "num_workers": 2 + } + } + ] +} +``` + +### Option 2: Run with Parameters + +Execute the job with these parameters (as a single `job_params` JSON string): + +```json +{ + "job_params": "{\"dax_statement\": \"EVALUATE SUMMARIZECOLUMNS('TestData'[product], \\\"Total NSR\\\", SUM('TestData'[nsr]))\", \"workspace_id\": \"12345678-1234-1234-1234-123456789012\", \"semantic_model_id\": \"87654321-4321-4321-4321-210987654321\", \"auth_method\": \"service_principal\", \"client_id\": \"your-client-id\", \"tenant_id\": \"your-tenant-id\", \"client_secret\": \"your-secret\"}" +} +``` + +## Power BI Metadata Extractor + +The metadata extractor notebook helps you semi-automatically create metadata for PowerBITool. + +### Deploying Metadata Extractor + +The metadata extractor is automatically deployed alongside the DAX executor: + +```bash +python src/deploy.py --app-name kasal --user-name your.email@company.com +``` + +**Deployed to**: `/Users/your.email@company.com/kasal_notebooks/powerbi_metadata_extractor` + +### Using the Metadata Extractor + +The metadata extractor uses Power BI's `INFO.TABLES` and `INFO.COLUMNS` DMV functions to extract schema information. These functions are compatible with the Power BI REST API `executeQueries` endpoint. + +Run the notebook with these parameters: + +```json +{ + "job_params": { + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "your-client-id", + "tenant_id": "your-tenant-id", + "client_secret": "your-secret", + "include_hidden": false, + "include_relationships": true, + "output_format": "json" + } +} +``` + +**Output**: The notebook will extract and format metadata in the exact structure needed for PowerBITool: + +```json +{ + "tables": [ + { + "name": "TestData", + "columns": [ + {"name": "product", "data_type": "string"}, + {"name": "nsr", "data_type": "decimal"}, + {"name": "country", "data_type": "string"} + ] + } + ] +} +``` + +### Metadata Extractor Parameters + +| Parameter | Description | Default | Required | +|-----------|-------------|---------|----------| +| `workspace_id` | Power BI workspace ID | - | ✅ Yes | +| `semantic_model_id` | Dataset ID | - | ✅ Yes | +| `auth_method` | "device_code" or "service_principal" | "device_code" | ❌ No | +| `include_hidden` | Include hidden tables/columns | false | ❌ No | +| `include_relationships` | Include table relationships | true | ❌ No | +| `output_format` | "json" or "python_dict" | "json" | ❌ No | + +## Complete Workflow: Agent → DAX → Execution + +### Step 0: Extract Metadata (First Time Setup) + +Use the metadata extractor notebook to get your dataset structure: + +1. Create a Databricks job for the metadata extractor notebook +2. Run it with your workspace_id and semantic_model_id +3. Copy the compact metadata output + +### Step 1: Generate DAX Query + +Use PowerBITool in your crew to generate DAX: + +```json +{ + "dataset_name": "test_pbi", + "metadata": { + "tables": [ + { + "name": "TestData", + "columns": [ + {"name": "product", "data_type": "string"}, + {"name": "nsr", "data_type": "decimal"} + ] + } + ] + } +} +``` + +**Result**: DAX query generated by agent + +```dax +EVALUATE +SUMMARIZECOLUMNS( + 'TestData'[product], + "Total NSR", SUM('TestData'[nsr]) +) +``` + +### Step 2: Execute DAX in Databricks + +Pass the generated DAX to the deployed notebook via Databricks job: + +```python +# Using DatabricksJobsTool +{ + "action": "run", + "job_id": 12345, + "job_params": { + "dax_statement": "EVALUATE SUMMARIZECOLUMNS('TestData'[product], \"Total NSR\", SUM('TestData'[nsr]))", + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "your-client-id", + "tenant_id": "your-tenant-id", + "client_secret": "your-secret" + } +} +``` + +### Step 3: Get Results + +The notebook will: +1. Connect to Power BI via XMLA +2. Execute the DAX query +3. Return results as Spark DataFrame +4. Display results in notebook +5. Return execution summary as JSON + +## Notebook Template Details + +### What's Included + +The deployed notebook (`powerbi_dax_executor`) includes: + +✅ **Automatic Setup**: Installs `pyadomd` package +✅ **Connection Management**: Builds connection string from parameters +✅ **Error Handling**: Comprehensive error handling with troubleshooting tips +✅ **Multiple Output Formats**: + - Raw dictionary results + - Spark DataFrame + - Display in notebook UI + - JSON response for downstream processing +✅ **Execution Logging**: Detailed progress and status logging +✅ **Optional Persistence**: Can save results to Delta tables + +### Required Parameters + +**All parameters are passed via `job_params` as a JSON object:** + +| Parameter | Description | Example | Required | +|-----------|-------------|---------|----------| +| `dax_statement` | DAX query to execute | `EVALUATE 'TestData'` | ✅ Yes | +| `workspace_id` | Power BI workspace ID | `12345678-1234-1234-1234-123456789012` | ✅ Yes | +| `semantic_model_id` | Power BI semantic model/dataset ID | `87654321-4321-4321-4321-210987654321` | ✅ Yes | +| `auth_method` | Authentication method | `"device_code"` or `"service_principal"` | ❌ No (default: `device_code`) | + +**For Service Principal authentication (`auth_method: "service_principal"`), also provide:** + +| Parameter | Description | Example | Required | +|-----------|-------------|---------|----------| +| `client_id` | Azure AD app client ID | `11111111-1111-1111-1111-111111111111` | ✅ Yes | +| `tenant_id` | Azure AD tenant ID | `22222222-2222-2222-2222-222222222222` | ✅ Yes | +| `client_secret` | Service principal secret | `your-secret-value` | ✅ Yes | + +**Example job_params JSON:** +```json +{ + "dax_statement": "EVALUATE SUMMARIZECOLUMNS('TestData'[product], \"Total NSR\", SUM('TestData'[nsr]))", + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "11111111-1111-1111-1111-111111111111", + "tenant_id": "22222222-2222-2222-2222-222222222222", + "client_secret": "your-secret-value" +} + +### Service Principal Setup + +To use the notebook, you need a Service Principal with Power BI access: + +1. **Create Azure AD App Registration**: + - Go to Azure Portal → Azure Active Directory → App registrations + - Create new registration + - Note the Application (client) ID and Tenant ID + +2. **Create Client Secret**: + - In your app registration, go to Certificates & secrets + - Create new client secret + - Note the secret value (you can only see it once!) + +3. **Grant Power BI Permissions**: + - Go to Power BI workspace settings + - Add the service principal as a Member or Admin + - Ensure "Service principals can access Power BI APIs" is enabled in tenant settings + +4. **Test Connection**: + - Use the credentials in the notebook + - Verify you can connect and query data + +## Verification + +After deployment, verify the notebook exists: + +```python +from databricks.sdk import WorkspaceClient + +w = WorkspaceClient() + +# Check if notebook exists +try: + notebook_info = w.workspace.get_status( + "/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor" + ) + print(f"✅ Notebook deployed: {notebook_info.path}") +except Exception as e: + print(f"❌ Notebook not found: {e}") +``` + +Or check in Databricks UI: +1. Navigate to Workspace +2. Go to `/Users/your.email@company.com/` +3. Look for `kasal_notebooks` folder +4. Verify `powerbi_dax_executor` exists + +## Updating the Notebook + +If you need to update the notebook template: + +1. **Edit Template**: + ```bash + # Edit the template file + vim src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_dax_executor.py + ``` + +2. **Redeploy**: + ```bash + # Redeploy notebooks only + python -m src.utils.notebook_deployment your.email@company.com + ``` + +3. **Verify Update**: + - Check notebook in Databricks UI + - Or run a test job to verify changes + +## Troubleshooting + +### Issue: Notebook not found after deployment + +**Solution**: +```bash +# Manually deploy notebooks +python -m src.utils.notebook_deployment your.email@company.com + +# Verify deployment +databricks workspace ls /Users/your.email@company.com/kasal_notebooks/ +``` + +### Issue: azure-identity import error + +**Cause**: Package not installed or Python not restarted + +**Solution**: Both notebooks include: +```python +%pip install azure-identity requests pandas +dbutils.library.restartPython() +``` + +If still failing, check cluster has internet access for package installation. + +### Issue: Connection failed to Power BI + +**Cause**: Service Principal permissions or authentication + +**Solution**: +1. Verify Service Principal has Read access to workspace +2. Check that "Service principals can access Power BI APIs" is enabled in tenant settings +3. Verify client_id, tenant_id, and client_secret are correct +4. Test credentials by running the metadata extractor first + +### Issue: DAX syntax error + +**Cause**: Invalid DAX query + +**Solution**: +1. Test DAX query in Power BI Desktop first +2. Use PowerBITool to generate correct DAX +3. Check for special characters or escaping issues + +## Integration with PowerBITool + +Complete workflow integration: + +```mermaid +graph LR + A[Extract Metadata] --> B[PowerBITool] + B --> C[Generate DAX] + C --> D[DatabricksJobsTool] + D --> E[powerbi_dax_executor notebook] + E --> F[Power BI REST API] + F --> G[Results] +``` + +**Step-by-step**: +1. **First time setup**: Run metadata extractor to get dataset structure +2. User asks question: "What is total NSR per product?" +3. PowerBITool generates DAX using metadata +4. DatabricksJobsTool creates/runs job with generated DAX +5. Deployed notebook executes DAX against Power BI via REST API +6. Results returned as DataFrame and JSON + +## Summary + +✅ **Automatic Deployment**: Both notebooks deployed with application +✅ **Pre-Configured**: Ready to use with parameters +✅ **Metadata Extraction**: Semi-automatic metadata generation for PowerBITool +✅ **Error Handling**: Comprehensive error handling built-in +✅ **Multiple Outputs**: Results in various formats +✅ **Easy Integration**: Works seamlessly with PowerBITool and DatabricksJobsTool + +**Deployed Locations**: +- `/Users/{your_email}/kasal_notebooks/powerbi_dax_executor` +- `/Users/{your_email}/kasal_notebooks/powerbi_metadata_extractor` + +For more details, see [NOTEBOOK_TEMPLATES.md](./NOTEBOOK_TEMPLATES.md) diff --git a/src/docs/POWRBI_QUICKSTART.md b/src/docs/POWRBI_QUICKSTART.md new file mode 100644 index 00000000..5eea426c --- /dev/null +++ b/src/docs/POWRBI_QUICKSTART.md @@ -0,0 +1,266 @@ +# Power BI DAX Generator - Quick Start Guide + +This guide will help you get started with the Power BI DAX Generator in under 5 minutes. This guide explains how to use the PowerBITool with runtime parameters, similar to DatabricksJobsTool's `job_params` pattern. + +## Overview + +The PowerBITool now supports passing dataset metadata and configuration as **runtime parameters** when the agent calls the tool, rather than requiring pre-configuration in the tool settings or task configuration. + +This provides maximum flexibility: +- ✅ Different datasets can be queried without changing tool configuration +- ✅ Metadata can be dynamically generated or retrieved at runtime +- ✅ Same tool instance can work with multiple Power BI datasets +- ✅ No need to update crew JSON or database for new datasets + +## Prerequisites + +- Kasal backend running +- Access to a Power BI workspace with XMLA endpoint enabled +- Power BI dataset metadata (tables, columns, relationships) + +## Requirements +- Python 3.9+ +- Node.js 18+ +- Postgres (recommended) or SQLite for local dev +- Databricks access if exercising Databricks features + +## Step 1: Local tests +```bash +# Backend +cd src/backend +python -m venv .venv && source .venv/bin/activate +pip install -r ../requirements.txt +./run.sh # http://localhost:8000 (OpenAPI at /api-docs if enabled) + +# Frontend +cd ../frontend +npm install +npm start # http://localhost:3000 +``` + +Health check: +```bash +curl http://localhost:8000/health +# {"status":"healthy"} +``` + +## Step 2: Deploy semi-automatically + +Create static frontend: +```bash +# Within the src dir +python3 build.py +``` + +Deploy the app: +```bash +# Within the src dir +python3 deploy.py --app-name kasal-david --user-name david.schwarzenbacher@databricks.com +``` + +# Step 3: Configuration of the deployed items +- From the uploaded notebook (src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_full_pipeline.py) create a job +- This job will have ONE task (taskname is SUPER important): pbi_e2e_pipeline & link the notebook from above to the task +- Feel free to edit, if needed, default variables. However, we suggest to refrain from this +- This job will give you a job-ID --> copy this and put it into the configuration of the Kasal-app you have running for the PowerBI Tool, which you have to enable +- As Databricks-host please enter your host-IP address WITHOUT the https +- Don't forget to set the Databricks-API key in the the configuration plane + +## Step 3: Frontend UI testing + +As a reference this is one example of a crew setup that you can upload in the frontend: +ATTENTION: In the front-end you need to make sure that the parameters set in the task match YOUR environment (aka your semantic_model_id, workspace_id, etc.). In general as authentication methodology we suggest service_principal, but you need to have this configured within your environment, thus default is device-control-flow, but please note this is nice for experiments, but NOT production ready then as it will need interactice authentication. + +```json +{ + "id": "3980587e-5a1e-44b3-a264-1dc11feb72f2", + "name": "test", + "agent_ids": [ + "4379d037-4a1b-4101-bb19-18f8de1be668" + ], + "task_ids": [ + "97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f" + ], + "nodes": [ + { + "id": "agent-4379d037-4a1b-4101-bb19-18f8de1be668", + "type": "agentNode", + "position": { + "x": 63.96047192664271, + "y": -341.6588050410664 + }, + "data": { + "label": "PowerBI Job Orchestrator", + "role": "PowerBI Job Manager", + "goal": "Orchestrate and manage PowerBI jobs efficiently\n\nYou will make sure that the action run will only trigger 1 time and not more. ", + "backstory": "Experienced in managing and optimizing Databricks workflows for PowerBI, with expertise in job scheduling and execution.", + "tools": [ + "71" + ], + "agentId": "4379d037-4a1b-4101-bb19-18f8de1be668", + "taskId": null, + "llm": "databricks-llama-4-maverick", + "function_calling_llm": null, + "max_iter": 25, + "max_rpm": 300, + "max_execution_time": 300, + "verbose": false, + "allow_delegation": false, + "cache": false, + "memory": false, + "embedder_config": { + "provider": "openai", + "config": { + "model": "text-embedding-3-small" + } + }, + "system_template": null, + "prompt_template": null, + "response_template": null, + "allow_code_execution": false, + "code_execution_mode": "safe", + "max_retry_limit": 2, + "use_system_prompt": true, + "respect_context_window": true, + "type": "agent", + "description": null, + "expected_output": null, + "icon": null, + "advanced_config": null, + "config": null, + "context": [], + "async_execution": false, + "knowledge_sources": [], + "markdown": false + }, + "width": null, + "height": null, + "selected": null, + "positionAbsolute": null, + "dragging": null, + "style": null + }, + { + "id": "task-97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "type": "taskNode", + "position": { + "x": 303.15458030615144, + "y": -338.9256934052662 + }, + "data": { + "label": "Run Job with Custom Parameters", + "role": null, + "goal": null, + "backstory": null, + "tools": [ + "71" + ], + "agentId": null, + "taskId": "97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "llm": null, + "function_calling_llm": null, + "max_iter": null, + "max_rpm": null, + "max_execution_time": null, + "verbose": null, + "allow_delegation": null, + "cache": null, + "memory": true, + "embedder_config": null, + "system_template": null, + "prompt_template": null, + "response_template": null, + "allow_code_execution": null, + "code_execution_mode": null, + "max_retry_limit": null, + "use_system_prompt": null, + "respect_context_window": null, + "type": "task", + "description": "Execute job ID 365257288725339 ONE TIME ONLY. Do not retry if you receive a successful run_id. Execute the job with those parameters:\n- question: {question}\n- workspace_id: 'bcb084ed-f8c9-422c-b148-29839c0f9227'\n- semantic_model_id: 'a17de62e-8dc0-4a8a-acaa-2a9954de8c75'\n- auth_method: 'device_code'\n- tenant_id: '9f37a392-f0ae-4280-9796-f1864a10effc'\n- client_id: '1950a258-227b-4e31-a9cf-717495945fc2'\"\n- client_secret: 'TBD'\n- sample_size: 100\n- metadata: \"json\"\n- databricks_host: \"https://e2-demo-field-eng.cloud.databricks.com/\"\n- databricks_token: \n\nI don't want you to list or get the job; I want you to run it once; you are not allowed to run more than once. Use PowerBITool to execute this query.\n\nIMPORTANT: You will make sure that the action run will only trigger 1 time and not more.", + "expected_output": "A job execution result containing the response data from running job ID 365257288725339 with the custom parameters. The output will include any result_data and various other parameters.", + "icon": null, + "advanced_config": null, + "config": { + "cache_response": false, + "cache_ttl": 3600, + "retry_on_fail": false, + "max_retries": 0, + "timeout": null, + "priority": 1, + "error_handling": "default", + "output_file": null, + "output_json": null, + "output_pydantic": null, + "validation_function": null, + "callback_function": null, + "human_input": false, + "markdown": false + }, + "context": [], + "async_execution": false, + "knowledge_sources": null, + "markdown": false + }, + "width": null, + "height": null, + "selected": null, + "positionAbsolute": null, + "dragging": null, + "style": null + } + ], + "edges": [ + { + "source": "agent-4379d037-4a1b-4101-bb19-18f8de1be668", + "target": "task-97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "id": "reactflow__edge-agent-83ec5a5f-7b9a-46ea-b12d-63bfaad2d9d0-task-ebd1eaaf-e42b-4e36-bb5b-b486be841bf2-default-default", + "sourceHandle": null, + "targetHandle": null + } + ], + "created_at": "2025-10-16T18:39:31.203804", + "updated_at": "2025-10-16T18:39:31.203806" +} +``` + +Exectue the crew and set these parameters: +- question: Generate a DAX query to calculate Net Sales Revenue (NSR) and Cost Of Goods Sold (COGS) per product +- You can even think of ingesting the semantic_model_id dynamically as only the question and this one will change + +**Expected Response:** +```json +{ + "success": true, + "run_id": 1086410411823064, + "question": "Generate a DAX query to calculate Net Sales Revenue (NSR) and Cost Of Goods Sold (COGS) per product", + "elapsed_seconds": 81.7, + "dax_query": null, + "result_data": [ + { + "TestData[product]": "product_a", + "[Net Sales Revenue]": 20892722.53, + "[Cost Of Goods Sold]": 10275850.23 + }, + { + "TestData[product]": "product_b", + "[Net Sales Revenue]": 20705392.63, + "[Cost Of Goods Sold]": 10425699.56 + }, + { + "TestData[product]": "product_c", + "[Net Sales Revenue]": 18076406.91, + "[Cost Of Goods Sold]": 8797758.1 + } + ], + "message": "Successfully executed Power BI query in 81.7s" +} +``` + +## Summary + +- **Tool Level**: Configure XMLA endpoint once (connection details) +- **Runtime Level**: Agent provides dataset_name and metadata when calling tool +- **Result**: Maximum flexibility without needing to update crew configurations +- **Pattern**: Same approach as DatabricksJobsTool's job_params + +This approach gives agents the power to work with any Power BI dataset by providing the metadata at runtime, rather than requiring pre-configuration in the crew JSON or database. diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 48ac7d03..c3ace3e0 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -8366,40 +8366,6 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mdx-js/mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", @@ -11405,13 +11371,6 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead" }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true, - "peer": true - }, "node_modules/abs-svg-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", @@ -11815,13 +11774,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true, - "peer": true - }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -11842,21 +11794,6 @@ } ] }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "optional": true, - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -13927,16 +13864,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -14149,13 +14076,6 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "optional": true, - "peer": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -16303,13 +16223,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true, - "peer": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -18718,39 +18631,6 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true - }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -18809,28 +18689,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "optional": true, - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -19330,13 +19188,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "optional": true, - "peer": true - }, "node_modules/has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -21306,35 +21157,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-jsdom/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "peer": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-environment-jsdom/node_modules/escodegen": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", @@ -21426,31 +21248,6 @@ } } }, - "node_modules/jest-environment-jsdom/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-environment-jsdom/node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "peer": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/jest-environment-jsdom/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -24206,40 +24003,6 @@ "node": ">=8" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -24293,13 +24056,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", - "optional": true, - "peer": true - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -24647,27 +24403,6 @@ "node": ">=18" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -24686,22 +24421,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -24777,20 +24496,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "optional": true, - "peer": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", @@ -29473,13 +29178,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "optional": true, - "peer": true - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -30774,24 +30472,6 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "optional": true, - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/tar-fs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", @@ -30820,36 +30500,6 @@ "node": ">=6" } }, - "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -31211,13 +30861,6 @@ "node": ">=16" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true, - "peer": true - }, "node_modules/tree-changes": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.5.1.tgz", @@ -32180,13 +31823,6 @@ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true, - "peer": true - }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", @@ -32542,17 +32178,6 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "peer": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -32648,16 +32273,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", diff --git a/src/frontend/public/docs/DEVELOPER_GUIDE.md b/src/frontend/public/docs/DEVELOPER_GUIDE.md new file mode 100644 index 00000000..093f54cf --- /dev/null +++ b/src/frontend/public/docs/DEVELOPER_GUIDE.md @@ -0,0 +1,168 @@ +## Developer Guide + +### Requirements +- Python 3.9+ +- Node.js 18+ +- Postgres (recommended) or SQLite for local dev +- Databricks access if exercising Databricks features + +### Quick start +```bash +# Backend +cd src/backend +python -m venv .venv && source .venv/bin/activate +pip install -r ../requirements.txt +./run.sh # http://localhost:8000 (OpenAPI at /api-docs if enabled) + +# Frontend +cd ../frontend +npm install +npm start # http://localhost:3000 +``` + +Health check: +```bash +curl http://localhost:8000/health +# {"status":"healthy"} +``` + +### Configuration +Backend settings: `src/backend/src/config/settings.py` +- Core: `DEBUG_MODE`, `LOG_LEVEL`, `DOCS_ENABLED`, `AUTO_SEED_DATABASE` +- Database: + - `DATABASE_TYPE=postgres|sqlite` (default: `postgres`) + - Postgres: `POSTGRES_SERVER`, `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` + - SQLite: `SQLITE_DB_PATH=./app.db` + - SQL logging: `SQL_DEBUG=true|false` +- Notes: + - `USE_NULLPOOL` is set early in `main.py` to avoid asyncpg pool issues + - Logs written under `src/backend/src/logs/` + +Frontend API base URL (`REACT_APP_API_URL`) at build-time: +```bash +# Option A: dev default already points to http://localhost:8000/api/v1 +# Option B: override explicitly for a build (Unix/macOS) +REACT_APP_API_URL="http://localhost:8000/api/v1" npm run build + +# When using the top-level build script: +# The env var will propagate into the "npm run build" it runs +cd src +REACT_APP_API_URL="http://localhost:8000/api/v1" python build.py +``` + +### Conventions +- Routers (`api/*`): Validate with `schemas/*`, delegate to `services/*` +- Services: Business logic only; use repositories for I/O +- Repositories: All SQL/external I/O; don’t leak ORM to services +- Models: SQLAlchemy in `models/*`; Schemas: Pydantic in `schemas/*` + +### Add a new API resource (“widgets” example) +1) Model: `models/widget.py`; import in `db/all_models.py` +2) Schemas: `schemas/widget.py` (Create/Update/Read DTOs) +3) Repository: `repositories/widget_repository.py` +4) Service: `services/widget_service.py` +5) Router: `api/widgets_router.py` (validate → call service) +6) Register router in `api/__init__.py` +7) Frontend: add `src/frontend/src/api/widgets.ts` + components/views/state +8) Tests: `src/backend/tests/` + +### Add a new CrewAI tool +- Implement under `engines/crewai/tools/` (follow existing patterns) +- Expose configuration via service/router if user-configurable +- Ensure discovery/registration in the execution path (e.g., prep or service) + +### Executions and tracing +- Start executions via `executions_router.py` endpoints +- Services invoke engine flow (`engines/crewai/*`) +- Logs/traces: + - Execution logs via `execution_logs_*` + - Traces via `execution_trace_*` +```bash +# Kick off an execution +curl -X POST http://localhost:8000/api/v1/executions -H "Content-Type: application/json" -d '{...}' + +# Get execution status +curl http://localhost:8000/api/v1/executions/ + +# Fetch logs/trace +curl http://localhost:8000/api/v1/execution-logs/ +curl http://localhost:8000/api/v1/execution-trace/ +``` + +### Background processing +- Scheduler: starts on DB-ready startup (`scheduler_service.py`) +- Embedding queue (SQLite): `embedding_queue_service.py` batches writes +- Cleanup on startup/shutdown: `execution_cleanup_service.py` + +### Database & migrations +- SQLite for quick local dev (`DATABASE_TYPE=sqlite`), Postgres for multi-user +- Alembic: +```bash +# after model changes +alembic revision --autogenerate -m "add widgets" +alembic upgrade head +``` + +### Auth, identity, tenancy +- Databricks headers parsed by `utils/user_context.py` +- Group-aware tenants; selected group passed in `group_id` header +- JWT/basic auth in `auth_router.py`, users in `users_router.py` +- Authorization checks in `core/permissions.py` + +### Logging & debugging +- App logs: `src/backend/src/logs/` (managed by `core/logger.py`) +- Verbose SQL: `export SQL_DEBUG=true` +- SQLite “database is locked”: mitigated via retry/backoff; reduce writers or use Postgres + +### Frontend notes +- Axios client and base URL: +```1:13:/Users/anshu.roy/Documents/kasal/src/frontend/src/config/api/ApiConfig.ts +export const config = { + apiUrl: + process.env.REACT_APP_API_URL || + (process.env.NODE_ENV === 'development' + ? 'http://localhost:8000/api/v1' + : '/api/v1'), +}; +export const apiClient = axios.create({ baseURL: config.apiUrl, headers: { 'Content-Type': 'application/json' } }); +``` + +### Testing +```bash +# Backend +python run_tests.py + +# Frontend +cd src/frontend +npm test +``` + +### Production checklist +- Use Postgres (or managed DB), not SQLite +- Harden secrets/tokens; externalize (e.g., Databricks Secrets/Vault) +- Enforce TLS and CORS +- Monitor logs/traces; set alerts +- Review `DOCS_ENABLED`, `LOG_LEVEL`, `DEBUG_MODE` + +## Resources + +### Quick Links +- [API Playground](/api/docs) +- [Video Tutorials](https://kasal.ai/videos) +- [Discord Community](https://discord.gg/kasal) +- [Report Issues](https://github.com/kasal/issues) + +### Code Examples +- [Basic Agent Setup](https://github.com/kasal/examples/basic) +- [Multi-Agent Collaboration](https://github.com/kasal/examples/multi-agent) +- [Custom Tools](https://github.com/kasal/examples/tools) +- [Production Deployment](https://github.com/kasal/examples/deploy) + +### Support +- **Chat**: Available in-app 24/7 +- **Email**: dev@kasal.ai +- **Slack**: #kasal-developers + +--- + +*Build smarter, ship faster with Kasal* \ No newline at end of file diff --git a/src/frontend/public/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md b/src/frontend/public/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md new file mode 100644 index 00000000..6493ba32 --- /dev/null +++ b/src/frontend/public/docs/POWERBI_NOTEBOOK_DEPLOYMENT.md @@ -0,0 +1,400 @@ +# Power BI Notebook Deployment Guide + +## Quick Start + +The Power BI DAX executor notebook is automatically included when you deploy the Kasal application. + +### Automatic Deployment (Included in App Deployment) + +When you deploy Kasal, the notebook is automatically deployed: + +```bash +python src/deploy.py --app-name kasal --user-name your.email@company.com +``` + +**Deployed Notebooks**: +- `/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor` +- `/Users/your.email@company.com/kasal_notebooks/powerbi_metadata_extractor` + +### Manual Notebook Deployment (Optional) + +If you only need to deploy/update the notebooks: + +```bash +cd src/backend +python -m src.utils.notebook_deployment your.email@company.com +``` + +## Using the Deployed Notebook + +### Option 1: Create Databricks Job (Recommended) + +Use the DatabricksJobsTool or Databricks UI to create a job: + +```json +{ + "name": "Power BI DAX Executor", + "tasks": [ + { + "task_key": "execute_dax", + "notebook_task": { + "notebook_path": "/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor", + "base_parameters": {} + }, + "job_cluster_key": "default_cluster" + } + ], + "job_clusters": [ + { + "job_cluster_key": "default_cluster", + "new_cluster": { + "spark_version": "13.3.x-scala2.12", + "node_type_id": "i3.xlarge", + "num_workers": 2 + } + } + ] +} +``` + +### Option 2: Run with Parameters + +Execute the job with these parameters (as a single `job_params` JSON string): + +```json +{ + "job_params": "{\"dax_statement\": \"EVALUATE SUMMARIZECOLUMNS('TestData'[product], \\\"Total NSR\\\", SUM('TestData'[nsr]))\", \"workspace_id\": \"12345678-1234-1234-1234-123456789012\", \"semantic_model_id\": \"87654321-4321-4321-4321-210987654321\", \"auth_method\": \"service_principal\", \"client_id\": \"your-client-id\", \"tenant_id\": \"your-tenant-id\", \"client_secret\": \"your-secret\"}" +} +``` + +## Power BI Metadata Extractor + +The metadata extractor notebook helps you semi-automatically create metadata for PowerBITool. + +### Deploying Metadata Extractor + +The metadata extractor is automatically deployed alongside the DAX executor: + +```bash +python src/deploy.py --app-name kasal --user-name your.email@company.com +``` + +**Deployed to**: `/Users/your.email@company.com/kasal_notebooks/powerbi_metadata_extractor` + +### Using the Metadata Extractor + +The metadata extractor uses Power BI's `INFO.TABLES` and `INFO.COLUMNS` DMV functions to extract schema information. These functions are compatible with the Power BI REST API `executeQueries` endpoint. + +Run the notebook with these parameters: + +```json +{ + "job_params": { + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "your-client-id", + "tenant_id": "your-tenant-id", + "client_secret": "your-secret", + "include_hidden": false, + "include_relationships": true, + "output_format": "json" + } +} +``` + +**Output**: The notebook will extract and format metadata in the exact structure needed for PowerBITool: + +```json +{ + "tables": [ + { + "name": "TestData", + "columns": [ + {"name": "product", "data_type": "string"}, + {"name": "nsr", "data_type": "decimal"}, + {"name": "country", "data_type": "string"} + ] + } + ] +} +``` + +### Metadata Extractor Parameters + +| Parameter | Description | Default | Required | +|-----------|-------------|---------|----------| +| `workspace_id` | Power BI workspace ID | - | ✅ Yes | +| `semantic_model_id` | Dataset ID | - | ✅ Yes | +| `auth_method` | "device_code" or "service_principal" | "device_code" | ❌ No | +| `include_hidden` | Include hidden tables/columns | false | ❌ No | +| `include_relationships` | Include table relationships | true | ❌ No | +| `output_format` | "json" or "python_dict" | "json" | ❌ No | + +## Complete Workflow: Agent → DAX → Execution + +### Step 0: Extract Metadata (First Time Setup) + +Use the metadata extractor notebook to get your dataset structure: + +1. Create a Databricks job for the metadata extractor notebook +2. Run it with your workspace_id and semantic_model_id +3. Copy the compact metadata output + +### Step 1: Generate DAX Query + +Use PowerBITool in your crew to generate DAX: + +```json +{ + "dataset_name": "test_pbi", + "metadata": { + "tables": [ + { + "name": "TestData", + "columns": [ + {"name": "product", "data_type": "string"}, + {"name": "nsr", "data_type": "decimal"} + ] + } + ] + } +} +``` + +**Result**: DAX query generated by agent + +```dax +EVALUATE +SUMMARIZECOLUMNS( + 'TestData'[product], + "Total NSR", SUM('TestData'[nsr]) +) +``` + +### Step 2: Execute DAX in Databricks + +Pass the generated DAX to the deployed notebook via Databricks job: + +```python +# Using DatabricksJobsTool +{ + "action": "run", + "job_id": 12345, + "job_params": { + "dax_statement": "EVALUATE SUMMARIZECOLUMNS('TestData'[product], \"Total NSR\", SUM('TestData'[nsr]))", + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "your-client-id", + "tenant_id": "your-tenant-id", + "client_secret": "your-secret" + } +} +``` + +### Step 3: Get Results + +The notebook will: +1. Connect to Power BI via XMLA +2. Execute the DAX query +3. Return results as Spark DataFrame +4. Display results in notebook +5. Return execution summary as JSON + +## Notebook Template Details + +### What's Included + +The deployed notebook (`powerbi_dax_executor`) includes: + +✅ **Automatic Setup**: Installs `pyadomd` package +✅ **Connection Management**: Builds connection string from parameters +✅ **Error Handling**: Comprehensive error handling with troubleshooting tips +✅ **Multiple Output Formats**: + - Raw dictionary results + - Spark DataFrame + - Display in notebook UI + - JSON response for downstream processing +✅ **Execution Logging**: Detailed progress and status logging +✅ **Optional Persistence**: Can save results to Delta tables + +### Required Parameters + +**All parameters are passed via `job_params` as a JSON object:** + +| Parameter | Description | Example | Required | +|-----------|-------------|---------|----------| +| `dax_statement` | DAX query to execute | `EVALUATE 'TestData'` | ✅ Yes | +| `workspace_id` | Power BI workspace ID | `12345678-1234-1234-1234-123456789012` | ✅ Yes | +| `semantic_model_id` | Power BI semantic model/dataset ID | `87654321-4321-4321-4321-210987654321` | ✅ Yes | +| `auth_method` | Authentication method | `"device_code"` or `"service_principal"` | ❌ No (default: `device_code`) | + +**For Service Principal authentication (`auth_method: "service_principal"`), also provide:** + +| Parameter | Description | Example | Required | +|-----------|-------------|---------|----------| +| `client_id` | Azure AD app client ID | `11111111-1111-1111-1111-111111111111` | ✅ Yes | +| `tenant_id` | Azure AD tenant ID | `22222222-2222-2222-2222-222222222222` | ✅ Yes | +| `client_secret` | Service principal secret | `your-secret-value` | ✅ Yes | + +**Example job_params JSON:** +```json +{ + "dax_statement": "EVALUATE SUMMARIZECOLUMNS('TestData'[product], \"Total NSR\", SUM('TestData'[nsr]))", + "workspace_id": "12345678-1234-1234-1234-123456789012", + "semantic_model_id": "87654321-4321-4321-4321-210987654321", + "auth_method": "service_principal", + "client_id": "11111111-1111-1111-1111-111111111111", + "tenant_id": "22222222-2222-2222-2222-222222222222", + "client_secret": "your-secret-value" +} + +### Service Principal Setup + +To use the notebook, you need a Service Principal with Power BI access: + +1. **Create Azure AD App Registration**: + - Go to Azure Portal → Azure Active Directory → App registrations + - Create new registration + - Note the Application (client) ID and Tenant ID + +2. **Create Client Secret**: + - In your app registration, go to Certificates & secrets + - Create new client secret + - Note the secret value (you can only see it once!) + +3. **Grant Power BI Permissions**: + - Go to Power BI workspace settings + - Add the service principal as a Member or Admin + - Ensure "Service principals can access Power BI APIs" is enabled in tenant settings + +4. **Test Connection**: + - Use the credentials in the notebook + - Verify you can connect and query data + +## Verification + +After deployment, verify the notebook exists: + +```python +from databricks.sdk import WorkspaceClient + +w = WorkspaceClient() + +# Check if notebook exists +try: + notebook_info = w.workspace.get_status( + "/Users/your.email@company.com/kasal_notebooks/powerbi_dax_executor" + ) + print(f"✅ Notebook deployed: {notebook_info.path}") +except Exception as e: + print(f"❌ Notebook not found: {e}") +``` + +Or check in Databricks UI: +1. Navigate to Workspace +2. Go to `/Users/your.email@company.com/` +3. Look for `kasal_notebooks` folder +4. Verify `powerbi_dax_executor` exists + +## Updating the Notebook + +If you need to update the notebook template: + +1. **Edit Template**: + ```bash + # Edit the template file + vim src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_dax_executor.py + ``` + +2. **Redeploy**: + ```bash + # Redeploy notebooks only + python -m src.utils.notebook_deployment your.email@company.com + ``` + +3. **Verify Update**: + - Check notebook in Databricks UI + - Or run a test job to verify changes + +## Troubleshooting + +### Issue: Notebook not found after deployment + +**Solution**: +```bash +# Manually deploy notebooks +python -m src.utils.notebook_deployment your.email@company.com + +# Verify deployment +databricks workspace ls /Users/your.email@company.com/kasal_notebooks/ +``` + +### Issue: azure-identity import error + +**Cause**: Package not installed or Python not restarted + +**Solution**: Both notebooks include: +```python +%pip install azure-identity requests pandas +dbutils.library.restartPython() +``` + +If still failing, check cluster has internet access for package installation. + +### Issue: Connection failed to Power BI + +**Cause**: Service Principal permissions or authentication + +**Solution**: +1. Verify Service Principal has Read access to workspace +2. Check that "Service principals can access Power BI APIs" is enabled in tenant settings +3. Verify client_id, tenant_id, and client_secret are correct +4. Test credentials by running the metadata extractor first + +### Issue: DAX syntax error + +**Cause**: Invalid DAX query + +**Solution**: +1. Test DAX query in Power BI Desktop first +2. Use PowerBITool to generate correct DAX +3. Check for special characters or escaping issues + +## Integration with PowerBITool + +Complete workflow integration: + +```mermaid +graph LR + A[Extract Metadata] --> B[PowerBITool] + B --> C[Generate DAX] + C --> D[DatabricksJobsTool] + D --> E[powerbi_dax_executor notebook] + E --> F[Power BI REST API] + F --> G[Results] +``` + +**Step-by-step**: +1. **First time setup**: Run metadata extractor to get dataset structure +2. User asks question: "What is total NSR per product?" +3. PowerBITool generates DAX using metadata +4. DatabricksJobsTool creates/runs job with generated DAX +5. Deployed notebook executes DAX against Power BI via REST API +6. Results returned as DataFrame and JSON + +## Summary + +✅ **Automatic Deployment**: Both notebooks deployed with application +✅ **Pre-Configured**: Ready to use with parameters +✅ **Metadata Extraction**: Semi-automatic metadata generation for PowerBITool +✅ **Error Handling**: Comprehensive error handling built-in +✅ **Multiple Outputs**: Results in various formats +✅ **Easy Integration**: Works seamlessly with PowerBITool and DatabricksJobsTool + +**Deployed Locations**: +- `/Users/{your_email}/kasal_notebooks/powerbi_dax_executor` +- `/Users/{your_email}/kasal_notebooks/powerbi_metadata_extractor` + +For more details, see [NOTEBOOK_TEMPLATES.md](./NOTEBOOK_TEMPLATES.md) diff --git a/src/frontend/public/docs/POWRBI_QUICKSTART.md b/src/frontend/public/docs/POWRBI_QUICKSTART.md new file mode 100644 index 00000000..fbf9b3e0 --- /dev/null +++ b/src/frontend/public/docs/POWRBI_QUICKSTART.md @@ -0,0 +1,268 @@ +# Power BI DAX Generator - Quick Start Guide + +This guide will help you get started with the Power BI DAX Generator in under 5 minutes. This guide explains how to use the PowerBITool with runtime parameters, similar to DatabricksJobsTool's `job_params` pattern. + +## Overview + +The PowerBITool now supports passing dataset metadata and configuration as **runtime parameters** when the agent calls the tool, rather than requiring pre-configuration in the tool settings or task configuration. + +This provides maximum flexibility: +- ✅ Different datasets can be queried without changing tool configuration +- ✅ Metadata can be dynamically generated or retrieved at runtime +- ✅ Same tool instance can work with multiple Power BI datasets +- ✅ No need to update crew JSON or database for new datasets + +## Prerequisites + +- Kasal backend running +- Access to a Power BI workspace with XMLA endpoint enabled +- Power BI dataset metadata (tables, columns, relationships) + +## Requirements +- Python 3.9+ +- Node.js 18+ +- Postgres (recommended) or SQLite for local dev +- Databricks access if exercising Databricks features + +## Step 1: Local tests +```bash +# Backend +cd src/backend +python -m venv .venv && source .venv/bin/activate +pip install -r ../requirements.txt +./run.sh # http://localhost:8000 (OpenAPI at /api-docs if enabled) + +# Frontend +cd ../frontend +npm install +npm start # http://localhost:3000 +``` + +Health check: +```bash +curl http://localhost:8000/health +# {"status":"healthy"} +``` + +## Step 2: Deploy semi-automatically + +Create static frontend: +```bash +# Within the src dir +python3 build.py +``` + +Deploy the app: +```bash +# Within the src dir +python3 deploy.py --app-name kasal-david --user-name david.schwarzenbacher@databricks.com +``` + +# Step 3: Configuration of the deployed items +- From the uploaded notebook (src/backend/src/engines/crewai/tools/templates/notebooks/powerbi_full_pipeline.py) create a job +- This job will have ONE task (taskname is SUPER important): pbi_e2e_pipeline & link the notebook from above to the task +- Feel free to edit, if needed, default variables. However, we suggest to refrain from this +- This job will give you a job-ID --> copy this and put it into the configuration of the Kasal-app you have running for the PowerBI Tool, which you have to enable +- As Databricks-host please enter your host-IP address WITHOUT the https +- Don't forget to set the Databricks-API key in the the configuration plane + +## Step 3: Frontend UI testing + +As a reference this is one example of a crew setup that you can upload in the frontend: +ATTENTION: In the front-end you need to make sure that the parameters set in the task match YOUR environment (aka your semantic_model_id, workspace_id, etc.). In general as authentication methodology we suggest service_principal, but you need to have this configured within your environment, thus default is device-control-flow, but please note this is nice for experiments, but NOT production ready then as it will need interactice authentication. + +Please note that if the job-fails it most likely has to do with the access - simply add the SVP from the app you spun up as a manager of your job-notebook, which should fix the issue. + +```json +{ + "id": "3980587e-5a1e-44b3-a264-1dc11feb72f2", + "name": "test", + "agent_ids": [ + "4379d037-4a1b-4101-bb19-18f8de1be668" + ], + "task_ids": [ + "97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f" + ], + "nodes": [ + { + "id": "agent-4379d037-4a1b-4101-bb19-18f8de1be668", + "type": "agentNode", + "position": { + "x": 63.96047192664271, + "y": -341.6588050410664 + }, + "data": { + "label": "PowerBI Job Orchestrator", + "role": "PowerBI Job Manager", + "goal": "Orchestrate and manage PowerBI jobs efficiently\n\nYou will make sure that the action run will only trigger 1 time and not more. ", + "backstory": "Experienced in managing and optimizing Databricks workflows for PowerBI, with expertise in job scheduling and execution.", + "tools": [ + "71" + ], + "agentId": "4379d037-4a1b-4101-bb19-18f8de1be668", + "taskId": null, + "llm": "databricks-llama-4-maverick", + "function_calling_llm": null, + "max_iter": 25, + "max_rpm": 300, + "max_execution_time": 300, + "verbose": false, + "allow_delegation": false, + "cache": false, + "memory": false, + "embedder_config": { + "provider": "openai", + "config": { + "model": "text-embedding-3-small" + } + }, + "system_template": null, + "prompt_template": null, + "response_template": null, + "allow_code_execution": false, + "code_execution_mode": "safe", + "max_retry_limit": 2, + "use_system_prompt": true, + "respect_context_window": true, + "type": "agent", + "description": null, + "expected_output": null, + "icon": null, + "advanced_config": null, + "config": null, + "context": [], + "async_execution": false, + "knowledge_sources": [], + "markdown": false + }, + "width": null, + "height": null, + "selected": null, + "positionAbsolute": null, + "dragging": null, + "style": null + }, + { + "id": "task-97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "type": "taskNode", + "position": { + "x": 303.15458030615144, + "y": -338.9256934052662 + }, + "data": { + "label": "Run Job with Custom Parameters", + "role": null, + "goal": null, + "backstory": null, + "tools": [ + "71" + ], + "agentId": null, + "taskId": "97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "llm": null, + "function_calling_llm": null, + "max_iter": null, + "max_rpm": null, + "max_execution_time": null, + "verbose": null, + "allow_delegation": null, + "cache": null, + "memory": true, + "embedder_config": null, + "system_template": null, + "prompt_template": null, + "response_template": null, + "allow_code_execution": null, + "code_execution_mode": null, + "max_retry_limit": null, + "use_system_prompt": null, + "respect_context_window": null, + "type": "task", + "description": "Execute job ID 365257288725339 ONE TIME ONLY. Do not retry if you receive a successful run_id. Execute the job with those parameters:\n- question: {question}\n- workspace_id: 'bcb084ed-f8c9-422c-b148-29839c0f9227'\n- semantic_model_id: 'a17de62e-8dc0-4a8a-acaa-2a9954de8c75'\n- auth_method: 'device_code'\n- tenant_id: '9f37a392-f0ae-4280-9796-f1864a10effc'\n- client_id: '1950a258-227b-4e31-a9cf-717495945fc2'\"\n- client_secret: 'TBD'\n- sample_size: 100\n- metadata: \"json\"\n- databricks_host: \"https://e2-demo-field-eng.cloud.databricks.com/\"\n- databricks_token: \n\nI don't want you to list or get the job; I want you to run it once; you are not allowed to run more than once. Use PowerBITool to execute this query.\n\nIMPORTANT: You will make sure that the action run will only trigger 1 time and not more.", + "expected_output": "A job execution result containing the response data from running job ID 365257288725339 with the custom parameters. The output will include any result_data and various other parameters.", + "icon": null, + "advanced_config": null, + "config": { + "cache_response": false, + "cache_ttl": 3600, + "retry_on_fail": false, + "max_retries": 0, + "timeout": null, + "priority": 1, + "error_handling": "default", + "output_file": null, + "output_json": null, + "output_pydantic": null, + "validation_function": null, + "callback_function": null, + "human_input": false, + "markdown": false + }, + "context": [], + "async_execution": false, + "knowledge_sources": null, + "markdown": false + }, + "width": null, + "height": null, + "selected": null, + "positionAbsolute": null, + "dragging": null, + "style": null + } + ], + "edges": [ + { + "source": "agent-4379d037-4a1b-4101-bb19-18f8de1be668", + "target": "task-97b2f77c-f5a1-49ac-9e98-31f1b0c13c8f", + "id": "reactflow__edge-agent-83ec5a5f-7b9a-46ea-b12d-63bfaad2d9d0-task-ebd1eaaf-e42b-4e36-bb5b-b486be841bf2-default-default", + "sourceHandle": null, + "targetHandle": null + } + ], + "created_at": "2025-10-16T18:39:31.203804", + "updated_at": "2025-10-16T18:39:31.203806" +} +``` + +Exectue the crew and set these parameters: +- question: Generate a DAX query to calculate Net Sales Revenue (NSR) and Cost Of Goods Sold (COGS) per product +- You can even think of ingesting the semantic_model_id dynamically as only the question and this one will change + +**Expected Response:** +```json +{ + "success": true, + "run_id": 1086410411823064, + "question": "Generate a DAX query to calculate Net Sales Revenue (NSR) and Cost Of Goods Sold (COGS) per product", + "elapsed_seconds": 81.7, + "dax_query": null, + "result_data": [ + { + "TestData[product]": "product_a", + "[Net Sales Revenue]": 20892722.53, + "[Cost Of Goods Sold]": 10275850.23 + }, + { + "TestData[product]": "product_b", + "[Net Sales Revenue]": 20705392.63, + "[Cost Of Goods Sold]": 10425699.56 + }, + { + "TestData[product]": "product_c", + "[Net Sales Revenue]": 18076406.91, + "[Cost Of Goods Sold]": 8797758.1 + } + ], + "message": "Successfully executed Power BI query in 81.7s" +} +``` + +## Summary + +- **Tool Level**: Configure XMLA endpoint once (connection details) +- **Runtime Level**: Agent provides dataset_name and metadata when calling tool +- **Result**: Maximum flexibility without needing to update crew configurations +- **Pattern**: Same approach as DatabricksJobsTool's job_params + +This approach gives agents the power to work with any Power BI dataset by providing the metadata at runtime, rather than requiring pre-configuration in the crew JSON or database. diff --git a/src/frontend_static/asset-manifest.json b/src/frontend_static/asset-manifest.json index f2031fbb..d4d90917 100644 --- a/src/frontend_static/asset-manifest.json +++ b/src/frontend_static/asset-manifest.json @@ -1,13 +1,13 @@ { "files": { "main.css": "/static/css/main.4c919b79.css", - "main.js": "/static/js/main.9e9d125d.js", + "main.js": "/static/js/main.7eade3e7.js", "static/js/531.af561043.chunk.js": "/static/js/531.af561043.chunk.js", "static/js/685.2bdf37ba.chunk.js": "/static/js/685.2bdf37ba.chunk.js", "index.html": "/index.html" }, "entrypoints": [ "static/css/main.4c919b79.css", - "static/js/main.9e9d125d.js" + "static/js/main.7eade3e7.js" ] } \ No newline at end of file diff --git a/src/frontend_static/docs/DEVELOPER_GUIDE.md b/src/frontend_static/docs/DEVELOPER_GUIDE.md new file mode 100644 index 00000000..093f54cf --- /dev/null +++ b/src/frontend_static/docs/DEVELOPER_GUIDE.md @@ -0,0 +1,168 @@ +## Developer Guide + +### Requirements +- Python 3.9+ +- Node.js 18+ +- Postgres (recommended) or SQLite for local dev +- Databricks access if exercising Databricks features + +### Quick start +```bash +# Backend +cd src/backend +python -m venv .venv && source .venv/bin/activate +pip install -r ../requirements.txt +./run.sh # http://localhost:8000 (OpenAPI at /api-docs if enabled) + +# Frontend +cd ../frontend +npm install +npm start # http://localhost:3000 +``` + +Health check: +```bash +curl http://localhost:8000/health +# {"status":"healthy"} +``` + +### Configuration +Backend settings: `src/backend/src/config/settings.py` +- Core: `DEBUG_MODE`, `LOG_LEVEL`, `DOCS_ENABLED`, `AUTO_SEED_DATABASE` +- Database: + - `DATABASE_TYPE=postgres|sqlite` (default: `postgres`) + - Postgres: `POSTGRES_SERVER`, `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` + - SQLite: `SQLITE_DB_PATH=./app.db` + - SQL logging: `SQL_DEBUG=true|false` +- Notes: + - `USE_NULLPOOL` is set early in `main.py` to avoid asyncpg pool issues + - Logs written under `src/backend/src/logs/` + +Frontend API base URL (`REACT_APP_API_URL`) at build-time: +```bash +# Option A: dev default already points to http://localhost:8000/api/v1 +# Option B: override explicitly for a build (Unix/macOS) +REACT_APP_API_URL="http://localhost:8000/api/v1" npm run build + +# When using the top-level build script: +# The env var will propagate into the "npm run build" it runs +cd src +REACT_APP_API_URL="http://localhost:8000/api/v1" python build.py +``` + +### Conventions +- Routers (`api/*`): Validate with `schemas/*`, delegate to `services/*` +- Services: Business logic only; use repositories for I/O +- Repositories: All SQL/external I/O; don’t leak ORM to services +- Models: SQLAlchemy in `models/*`; Schemas: Pydantic in `schemas/*` + +### Add a new API resource (“widgets” example) +1) Model: `models/widget.py`; import in `db/all_models.py` +2) Schemas: `schemas/widget.py` (Create/Update/Read DTOs) +3) Repository: `repositories/widget_repository.py` +4) Service: `services/widget_service.py` +5) Router: `api/widgets_router.py` (validate → call service) +6) Register router in `api/__init__.py` +7) Frontend: add `src/frontend/src/api/widgets.ts` + components/views/state +8) Tests: `src/backend/tests/` + +### Add a new CrewAI tool +- Implement under `engines/crewai/tools/` (follow existing patterns) +- Expose configuration via service/router if user-configurable +- Ensure discovery/registration in the execution path (e.g., prep or service) + +### Executions and tracing +- Start executions via `executions_router.py` endpoints +- Services invoke engine flow (`engines/crewai/*`) +- Logs/traces: + - Execution logs via `execution_logs_*` + - Traces via `execution_trace_*` +```bash +# Kick off an execution +curl -X POST http://localhost:8000/api/v1/executions -H "Content-Type: application/json" -d '{...}' + +# Get execution status +curl http://localhost:8000/api/v1/executions/ + +# Fetch logs/trace +curl http://localhost:8000/api/v1/execution-logs/ +curl http://localhost:8000/api/v1/execution-trace/ +``` + +### Background processing +- Scheduler: starts on DB-ready startup (`scheduler_service.py`) +- Embedding queue (SQLite): `embedding_queue_service.py` batches writes +- Cleanup on startup/shutdown: `execution_cleanup_service.py` + +### Database & migrations +- SQLite for quick local dev (`DATABASE_TYPE=sqlite`), Postgres for multi-user +- Alembic: +```bash +# after model changes +alembic revision --autogenerate -m "add widgets" +alembic upgrade head +``` + +### Auth, identity, tenancy +- Databricks headers parsed by `utils/user_context.py` +- Group-aware tenants; selected group passed in `group_id` header +- JWT/basic auth in `auth_router.py`, users in `users_router.py` +- Authorization checks in `core/permissions.py` + +### Logging & debugging +- App logs: `src/backend/src/logs/` (managed by `core/logger.py`) +- Verbose SQL: `export SQL_DEBUG=true` +- SQLite “database is locked”: mitigated via retry/backoff; reduce writers or use Postgres + +### Frontend notes +- Axios client and base URL: +```1:13:/Users/anshu.roy/Documents/kasal/src/frontend/src/config/api/ApiConfig.ts +export const config = { + apiUrl: + process.env.REACT_APP_API_URL || + (process.env.NODE_ENV === 'development' + ? 'http://localhost:8000/api/v1' + : '/api/v1'), +}; +export const apiClient = axios.create({ baseURL: config.apiUrl, headers: { 'Content-Type': 'application/json' } }); +``` + +### Testing +```bash +# Backend +python run_tests.py + +# Frontend +cd src/frontend +npm test +``` + +### Production checklist +- Use Postgres (or managed DB), not SQLite +- Harden secrets/tokens; externalize (e.g., Databricks Secrets/Vault) +- Enforce TLS and CORS +- Monitor logs/traces; set alerts +- Review `DOCS_ENABLED`, `LOG_LEVEL`, `DEBUG_MODE` + +## Resources + +### Quick Links +- [API Playground](/api/docs) +- [Video Tutorials](https://kasal.ai/videos) +- [Discord Community](https://discord.gg/kasal) +- [Report Issues](https://github.com/kasal/issues) + +### Code Examples +- [Basic Agent Setup](https://github.com/kasal/examples/basic) +- [Multi-Agent Collaboration](https://github.com/kasal/examples/multi-agent) +- [Custom Tools](https://github.com/kasal/examples/tools) +- [Production Deployment](https://github.com/kasal/examples/deploy) + +### Support +- **Chat**: Available in-app 24/7 +- **Email**: dev@kasal.ai +- **Slack**: #kasal-developers + +--- + +*Build smarter, ship faster with Kasal* \ No newline at end of file diff --git a/src/frontend_static/index.html b/src/frontend_static/index.html index 3ea501e8..ba4fcf90 100644 --- a/src/frontend_static/index.html +++ b/src/frontend_static/index.html @@ -1 +1 @@ -Kasal
\ No newline at end of file +Kasal
\ No newline at end of file diff --git a/src/frontend_static/static/js/main.9e9d125d.js b/src/frontend_static/static/js/main.9e9d125d.js deleted file mode 100644 index 9a52cc2e..00000000 --- a/src/frontend_static/static/js/main.9e9d125d.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.9e9d125d.js.LICENSE.txt */ -(()=>{var e={37:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8z"}),"ArrowUpward")},86:(e,t,n)=>{"use strict";function r(e,t){const n=this;if(n.vars&&"function"===typeof n.getColorSchemeSelector){const r=n.getColorSchemeSelector(e).replace(/(\[[^\]]+\])/,"*:where($1)");return{[r]:t}}return n.palette.mode===e?t:{}}n.d(t,{A:()=>r})},116:(e,t,n)=>{"use strict";n.r(t),n.d(t,{GlobalStyles:()=>w.A,StyledEngineProvider:()=>x,ThemeContext:()=>o.T,css:()=>A.AH,default:()=>C,internal_processStyles:()=>E,keyframes:()=>A.i7});var r=n(8168),o=n(7370),i=n(9015),a=n(6477),s=n(1783),l=n(9950),c=n(7923),u=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,d=(0,c.A)((function(e){return u.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91})),h=function(e){return"theme"!==e},f=function(e){return"string"===typeof e&&e.charCodeAt(0)>96?d:h},p=function(e,t,n){var r;if(t){var o=t.shouldForwardProp;r=e.__emotion_forwardProp&&o?function(t){return e.__emotion_forwardProp(t)&&o(t)}:o}return"function"!==typeof r&&n&&(r=e.__emotion_forwardProp),r},g=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;return(0,s.SF)(t,n,r),(0,a.s)((function(){return(0,s.sk)(t,n,r)})),null},m=function e(t,n){var a,c,u=t.__emotion_real===t,d=u&&t.__emotion_base||t;void 0!==n&&(a=n.label,c=n.target);var h=p(t,n,u),m=h||f(d),A=!m("as");return function(){var v=arguments,y=u&&void 0!==t.__emotion_styles?t.__emotion_styles.slice(0):[];if(void 0!==a&&y.push("label:"+a+";"),null==v[0]||void 0===v[0].raw)y.push.apply(y,v);else{var b=v[0];y.push(b[0]);for(var x=v.length,w=1;w{Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}},155:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M20 4H4c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2m0 14H4V8h16zm-2-1h-6v-2h6zM7.5 17l-1.41-1.41L8.67 13l-2.59-2.59L7.5 9l4 4z"}),"Terminal")},167:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.mode.CFB=function(){var e=t.lib.BlockCipherMode.extend();function n(e,t,n,r){var o,i=this._iv;i?(o=i.slice(0),this._iv=void 0):o=this._prevBlock,r.encryptBlock(o,0);for(var a=0;a{"use strict";n.d(t,{A:()=>r});const r=(0,n(4436).A)()},237:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(8587),i=n(7483),a=n(8076);const s=["sx"],l=e=>{var t,n;const r={systemProps:{},otherProps:{}},o=null!=(t=null==e||null==(n=e.theme)?void 0:n.unstable_sxConfig)?t:a.A;return Object.keys(e).forEach((t=>{o[t]?r.systemProps[t]=e[t]:r.otherProps[t]=e[t]})),r};function c(e){const{sx:t}=e,n=(0,o.A)(e,s),{systemProps:a,otherProps:c}=l(n);let u;return u=Array.isArray(t)?[a,...t]:"function"===typeof t?function(){const e=t(...arguments);return(0,i.Q)(e)?(0,r.A)({},a,e):a}:(0,r.A)({},a,t),(0,r.A)({},c,{sx:u})}},304:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A});var r=n(5501)},392:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"ChevronRight")},395:e=>{"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},423:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>i});var r=n(4501);const o={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function i(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Mui";const i=o[t];return i?"".concat(n,"-").concat(i):"".concat(r.A.generate(e),"-").concat(t)}},477:()=>{},505:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,k:()=>l});var r=n(5501),o=n(6206),i=n(2703),a=n(8286),s=n(8076);function l(){function e(e,t,n,o){const s={[e]:t,theme:n},l=o[e];if(!l)return{[e]:t};const{cssProperty:c=e,themeKey:u,transform:d,style:h}=l;if(null==t)return null;if("typography"===u&&"inherit"===t)return{[e]:t};const f=(0,i.Yn)(n,u)||{};if(h)return h(s);return(0,a.NI)(s,t,(t=>{let n=(0,i.BO)(f,d,t);return t===n&&"string"===typeof t&&(n=(0,i.BO)(f,d,"".concat(e).concat("default"===t?"":(0,r.A)(t)),t)),!1===c?n:{[c]:n}}))}return function t(n){var r;const{sx:i,theme:l={}}=n||{};if(!i)return null;const c=null!=(r=l.unstable_sxConfig)?r:s.A;function u(n){let r=n;if("function"===typeof n)r=n(l);else if("object"!==typeof n)return n;if(!r)return null;const i=(0,a.EU)(l.breakpoints),s=Object.keys(i);let u=i;return Object.keys(r).forEach((n=>{const i=(s=r[n],d=l,"function"===typeof s?s(d):s);var s,d;if(null!==i&&void 0!==i)if("object"===typeof i)if(c[n])u=(0,o.A)(u,e(n,i,l,c));else{const e=(0,a.NI)({theme:l},i,(e=>({[n]:e})));!function(){for(var e=arguments.length,t=new Array(e),n=0;ne.concat(Object.keys(t))),[]),o=new Set(r);return t.every((e=>o.size===Object.keys(e).length))}(e,i)?u=(0,o.A)(u,e):u[n]=t({sx:i,theme:l})}else u=(0,o.A)(u,e(n,i,l,c))})),(0,a.vf)(s,u)}return Array.isArray(i)?i.map(u):u(i)}}const c=l();c.filterProps=["sx"];const u=c},630:(e,t,n)=>{"use strict";e.exports=n(2138)},676:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(3988),n(7766),n(7020),n(7755),function(){var e=t,n=e.lib.StreamCipher,r=e.algo,o=[],i=[],a=[],s=r.Rabbit=n.extend({_doReset:function(){for(var e=this._key.words,t=this.cfg.iv,n=0;n<4;n++)e[n]=16711935&(e[n]<<8|e[n]>>>24)|4278255360&(e[n]<<24|e[n]>>>8);var r=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],o=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];for(this._b=0,n=0;n<4;n++)l.call(this);for(n=0;n<8;n++)o[n]^=r[n+4&7];if(t){var i=t.words,a=i[0],s=i[1],c=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),u=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=c>>>16|4294901760&u,h=u<<16|65535&c;for(o[0]^=c,o[1]^=d,o[2]^=u,o[3]^=h,o[4]^=c,o[5]^=d,o[6]^=u,o[7]^=h,n=0;n<4;n++)l.call(this)}},_doProcessBlock:function(e,t){var n=this._X;l.call(this),o[0]=n[0]^n[5]>>>16^n[3]<<16,o[1]=n[2]^n[7]>>>16^n[5]<<16,o[2]=n[4]^n[1]>>>16^n[7]<<16,o[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++)o[r]=16711935&(o[r]<<8|o[r]>>>24)|4278255360&(o[r]<<24|o[r]>>>8),e[t+r]^=o[r]},blockSize:4,ivSize:2});function l(){for(var e=this._X,t=this._C,n=0;n<8;n++)i[n]=t[n];for(t[0]=t[0]+1295307597+this._b|0,t[1]=t[1]+3545052371+(t[0]>>>0>>0?1:0)|0,t[2]=t[2]+886263092+(t[1]>>>0>>0?1:0)|0,t[3]=t[3]+1295307597+(t[2]>>>0>>0?1:0)|0,t[4]=t[4]+3545052371+(t[3]>>>0>>0?1:0)|0,t[5]=t[5]+886263092+(t[4]>>>0>>0?1:0)|0,t[6]=t[6]+1295307597+(t[5]>>>0>>0?1:0)|0,t[7]=t[7]+3545052371+(t[6]>>>0>>0?1:0)|0,this._b=t[7]>>>0>>0?1:0,n=0;n<8;n++){var r=e[n]+t[n],o=65535&r,s=r>>>16,l=((o*o>>>17)+o*s>>>15)+s*s,c=((4294901760&r)*r|0)+((65535&r)*r|0);a[n]=l^c}e[0]=a[0]+(a[7]<<16|a[7]>>>16)+(a[6]<<16|a[6]>>>16)|0,e[1]=a[1]+(a[0]<<8|a[0]>>>24)+a[7]|0,e[2]=a[2]+(a[1]<<16|a[1]>>>16)+(a[0]<<16|a[0]>>>16)|0,e[3]=a[3]+(a[2]<<8|a[2]>>>24)+a[1]|0,e[4]=a[4]+(a[3]<<16|a[3]>>>16)+(a[2]<<16|a[2]>>>16)|0,e[5]=a[5]+(a[4]<<8|a[4]>>>24)+a[3]|0,e[6]=a[6]+(a[5]<<16|a[5]>>>16)+(a[4]<<16|a[4]>>>16)|0,e[7]=a[7]+(a[6]<<8|a[6]>>>24)+a[5]|0}e.Rabbit=n._createHelper(s)}(),t.Rabbit)}()},755:e=>{"use strict";var t=Object.prototype.hasOwnProperty,n=Object.prototype.toString,r=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=function(e){return"function"===typeof Array.isArray?Array.isArray(e):"[object Array]"===n.call(e)},a=function(e){if(!e||"[object Object]"!==n.call(e))return!1;var r,o=t.call(e,"constructor"),i=e.constructor&&e.constructor.prototype&&t.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!o&&!i)return!1;for(r in e);return"undefined"===typeof r||t.call(e,r)},s=function(e,t){r&&"__proto__"===t.name?r(e,t.name,{enumerable:!0,configurable:!0,value:t.newValue,writable:!0}):e[t.name]=t.newValue},l=function(e,n){if("__proto__"===n){if(!t.call(e,n))return;if(o)return o(e,n).value}return e[n]};e.exports=function e(){var t,n,r,o,c,u,d=arguments[0],h=1,f=arguments.length,p=!1;for("boolean"===typeof d&&(p=d,d=arguments[1]||{},h=2),(null==d||"object"!==typeof d&&"function"!==typeof d)&&(d={});h{"use strict";var r=n(9950);var o="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t},i=r.useState,a=r.useEffect,s=r.useLayoutEffect,l=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var u="undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=i({inst:{value:n,getSnapshot:t}}),o=r[0].inst,u=r[1];return s((function(){o.value=n,o.getSnapshot=t,c(o)&&u({inst:o})}),[e,n,t]),a((function(){return c(o)&&u({inst:o}),e((function(){c(o)&&u({inst:o})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},827:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(8635).A},971:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M13 3c-4.97 0-9 4.03-9 9H1l4 3.99L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9m-1 5v5l4.25 2.52.77-1.28-3.52-2.09V8z"}),"RestoreOutlined")},1014:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(3539).A},1045:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.mode.CTR=function(){var e=t.lib.BlockCipherMode.extend(),n=e.Encryptor=e.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,o=this._iv,i=this._counter;o&&(i=this._counter=o.slice(0),this._iv=void 0);var a=i.slice(0);n.encryptBlock(a,0),i[r-1]=i[r-1]+1|0;for(var s=0;s{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M10 18h4v-2h-4zM3 6v2h18V6zm3 7h12v-2H6z"}),"FilterList")},1105:e=>{e.exports="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"},1115:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),function(){var e=t,n=e.lib.CipherParams,r=e.enc.Hex;e.format.Hex={stringify:function(e){return e.ciphertext.toString(r)},parse:function(e){var t=r.parse(e);return n.create({ciphertext:t})}}}(),t.format.Hex)}()},1209:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(1927).A},1232:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1"}),"DarkMode")},1260:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M15 9H9v6h6zm-2 4h-2v-2h2zm8-2V9h-2V7c0-1.1-.9-2-2-2h-2V3h-2v2h-2V3H9v2H7c-1.1 0-2 .9-2 2v2H3v2h2v2H3v2h2v2c0 1.1.9 2 2 2h2v2h2v-2h2v2h2v-2h2c1.1 0 2-.9 2-2v-2h2v-2h-2v-2zm-4 6H7V7h10z"}),"Memory")},1285:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"m12.87 15.07-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"}),"Translate")},1318:(e,t)=>{function n(e,t){this.offset=e,this.nbits=t}t.kBlockLengthPrefixCode=[new n(1,2),new n(5,2),new n(9,2),new n(13,2),new n(17,3),new n(25,3),new n(33,3),new n(41,3),new n(49,4),new n(65,4),new n(81,4),new n(97,4),new n(113,5),new n(145,5),new n(177,5),new n(209,5),new n(241,6),new n(305,6),new n(369,7),new n(497,8),new n(753,9),new n(1265,10),new n(2289,11),new n(4337,12),new n(8433,13),new n(16625,24)],t.kInsertLengthPrefixCode=[new n(0,0),new n(1,0),new n(2,0),new n(3,0),new n(4,0),new n(5,0),new n(6,1),new n(8,1),new n(10,2),new n(14,2),new n(18,3),new n(26,3),new n(34,4),new n(50,4),new n(66,5),new n(98,5),new n(130,6),new n(194,7),new n(322,8),new n(578,9),new n(1090,10),new n(2114,12),new n(6210,14),new n(22594,24)],t.kCopyLengthPrefixCode=[new n(2,0),new n(3,0),new n(4,0),new n(5,0),new n(6,0),new n(7,0),new n(8,0),new n(9,0),new n(10,1),new n(12,1),new n(14,2),new n(18,2),new n(22,3),new n(30,3),new n(38,4),new n(54,4),new n(70,5),new n(102,5),new n(134,6),new n(198,7),new n(326,8),new n(582,9),new n(1094,10),new n(2118,24)],t.kInsertRangeLut=[0,0,8,8,0,16,8,16,16],t.kCopyRangeLut=[0,8,0,8,16,0,16,8,16]},1328:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M8 5v14l11-7z"}),"PlayArrow")},1352:(e,t,n)=>{"use strict";var r=n(7119);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},1375:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(9950),o=n(1824);let i=!0,a=!1;const s=new o.E,l={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function c(e){e.metaKey||e.altKey||e.ctrlKey||(i=!0)}function u(){i=!1}function d(){"hidden"===this.visibilityState&&a&&(i=!0)}function h(e){const{target:t}=e;try{return t.matches(":focus-visible")}catch(n){}return i||function(e){const{type:t,tagName:n}=e;return!("INPUT"!==n||!l[t]||e.readOnly)||"TEXTAREA"===n&&!e.readOnly||!!e.isContentEditable}(t)}function f(){const e=r.useCallback((e=>{var t;null!=e&&((t=e.ownerDocument).addEventListener("keydown",c,!0),t.addEventListener("mousedown",u,!0),t.addEventListener("pointerdown",u,!0),t.addEventListener("touchstart",u,!0),t.addEventListener("visibilitychange",d,!0))}),[]),t=r.useRef(!1);return{isFocusVisibleRef:t,onFocus:function(e){return!!h(e)&&(t.current=!0,!0)},onBlur:function(){return!!t.current&&(a=!0,s.start(100,(()=>{a=!1})),t.current=!1,!0)},ref:e}}},1399:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(9950);const o="undefined"!==typeof window?r.useLayoutEffect:r.useEffect},1420:(e,t,n)=>{var r=n(7212);function o(e,t){return e>t?t:e}function i(e,t){return e359;)e-=360;return e}(e),t=i(o(t,100),0),n=i(o(n,100),0),"#"+r(e,t/=100,n/=100).map((function(e){return(256+e).toString(16).substr(-2)})).join("")}},1506:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(5393).A},1573:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(1375).A},1589:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z"}),"Error")},1596:e=>{"function"===typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},1602:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)([(0,i.jsx)("path",{d:"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2M12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8"},"0"),(0,i.jsx)("path",{d:"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"},"1")],"Schedule")},1676:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(5501).A},1722:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M15 16h4v2h-4zm0-8h7v2h-7zm0 4h6v2h-6zM3 18c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V8H3zM14 5h-3l-1-1H6L5 5H2v2h12z"}),"DeleteSweep")},1763:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(423);function o(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Mui";const o={};return t.forEach((t=>{o[t]=(0,r.Ay)(e,t,n)})),o}},1783:(e,t,n)=>{"use strict";n.d(t,{Rk:()=>r,SF:()=>o,sk:()=>i});function r(e,t,n){var r="";return n.split(" ").forEach((function(n){void 0!==e[n]?t.push(e[n]+";"):n&&(r+=n+" ")})),r}var o=function(e,t,n){var r=e.key+"-"+t.name;!1===n&&void 0===e.registered[r]&&(e.registered[r]=t.styles)},i=function(e,t,n){o(e,t,n);var r=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var i=t;do{e.insert(t===i?"."+r:"",i,e.sheet,!0),i=i.next}while(void 0!==i)}}},1789:(e,t)=>{function n(e,t){this.bits=e,this.value=t}t.z=n;var r=15;function o(e,t){for(var n=1<>=1;return(e&n-1)+n}function i(e,t,r,o,i){do{e[t+(o-=r)]=new n(i.bits,i.value)}while(o>0)}function a(e,t,n){for(var o=1<0;--x[u])i(e,t+h,f,A,new n(255&u,65535&y[d++])),h=o(h,u);for(g=v-1,p=-1,u=s+1,f=2;u<=r;++u,f<<=1)for(;x[u]>0;--x[u])(h&g)!==p&&(t+=A,v+=A=1<<(m=a(x,u,s)),e[b+(p=h&g)]=new n(m+s&255,t-b-p&65535)),i(e,t+(h>>s),f,A,new n(u-s&255,65535&y[d++])),h=o(h,u);return v}},1807:e=>{function t(){this.table=new Uint16Array(16),this.trans=new Uint16Array(288)}function n(e,n){this.source=e,this.sourceIndex=0,this.tag=0,this.bitcount=0,this.dest=n,this.destLen=0,this.ltree=new t,this.dtree=new t}var r=new t,o=new t,i=new Uint8Array(30),a=new Uint16Array(30),s=new Uint8Array(30),l=new Uint16Array(30),c=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),u=new t,d=new Uint8Array(320);function h(e,t,n,r){var o,i;for(o=0;o>>=1,t}function m(e,t,n){if(!t)return n;for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<>>16-t;return e.tag>>>=t,e.bitcount-=t,r+n}function A(e,t){for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<>>=1,++o,n+=t.table[o],r-=t.table[o]}while(r>=0);return e.tag=i,e.bitcount-=o,t.trans[n+r]}function v(e,t,n){var r,o,i,a,s,l;for(r=m(e,5,257),o=m(e,5,1),i=m(e,4,4),a=0;a<19;++a)d[a]=0;for(a=0;a8;)e.sourceIndex--,e.bitcount-=8;if((t=256*(t=e.source[e.sourceIndex+1])+e.source[e.sourceIndex])!==(65535&~(256*e.source[e.sourceIndex+3]+e.source[e.sourceIndex+2])))return-3;for(e.sourceIndex+=4,n=t;n;--n)e.dest[e.destLen++]=e.source[e.sourceIndex++];return e.bitcount=0,0}!function(e,t){var n;for(n=0;n<7;++n)e.table[n]=0;for(e.table[7]=24,e.table[8]=152,e.table[9]=112,n=0;n<24;++n)e.trans[n]=256+n;for(n=0;n<144;++n)e.trans[24+n]=n;for(n=0;n<8;++n)e.trans[168+n]=280+n;for(n=0;n<112;++n)e.trans[176+n]=144+n;for(n=0;n<5;++n)t.table[n]=0;for(t.table[5]=32,n=0;n<32;++n)t.trans[n]=n}(r,o),h(i,a,4,3),h(s,l,2,1),i[28]=0,a[28]=258,e.exports=function(e,t){var i,a,s=new n(e,t);do{switch(i=g(s),m(s,2,0)){case 0:a=b(s);break;case 1:a=y(s,r,o);break;case 2:v(s,s.ltree,s.dtree),a=y(s,s.ltree,s.dtree);break;default:a=-3}if(0!==a)throw new Error("Data error")}while(!i);return s.destLen{"use strict";n.d(t,{E:()=>a,A:()=>s});var r=n(9950);const o={};const i=[];class a{constructor(){this.currentId=null,this.clear=()=>{null!==this.currentId&&(clearTimeout(this.currentId),this.currentId=null)},this.disposeEffect=()=>this.clear}static create(){return new a}start(e,t){this.clear(),this.currentId=setTimeout((()=>{this.currentId=null,t()}),e)}}function s(){const e=function(e,t){const n=r.useRef(o);return n.current===o&&(n.current=e(t)),n}(a.create).current;var t;return t=e.disposeEffect,r.useEffect(t,i),e}},1875:e=>{"use strict";e.exports=function(e,t,n,r){for(var o=65535&e,i=e>>>16&65535,a=0;0!==n;){n-=a=n>2e3?2e3:n;do{i=i+(o=o+t[r++]|0)|0}while(--a);o%=65521,i%=65521}return o|i<<16}},1927:(e,t,n)=>{"use strict";function r(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:166;function r(){for(var r=arguments.length,o=new Array(r),i=0;i{e.apply(this,o)}),n)}return r.clear=()=>{clearTimeout(t)},r}n.d(t,{A:()=>r})},1935:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.camelCase=void 0;var n=/^--[a-zA-Z0-9_-]+$/,r=/-([a-z])/g,o=/^[^-]+$/,i=/^-(webkit|moz|ms|o|khtml)-/,a=/^-(ms)-/,s=function(e,t){return t.toUpperCase()},l=function(e,t){return"".concat(t,"-")};t.camelCase=function(e,t){return void 0===t&&(t={}),function(e){return!e||o.test(e)||n.test(e)}(e)?e:(e=e.toLowerCase(),(e=t.reactCompat?e.replace(a,l):e.replace(i,l)).replace(r,s))}},1960:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=function(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}},1967:function(e,t,n){"use strict";var r=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(n(6999)),o=n(1935);function i(e,t){var n={};return e&&"string"===typeof e?((0,r.default)(e,(function(e,r){e&&r&&(n[(0,o.camelCase)(e,t)]=r)})),n):n}i.default=i,e.exports=i},1976:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(2529).A},2004:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var i=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",i=arguments.length;n{var r=n(8211);t.init=function(){t.dictionary=r.init()},t.offsetsByLength=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),t.sizeBitsByLength=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]),t.minDictionaryWordLength=4,t.maxDictionaryWordLength=24},2036:(e,t,n)=>{var r=n(2010),o=10,i=11;function a(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(var r=0;r'),new a("",0,"\n"),new a("",3,""),new a("",0,"]"),new a("",0," for "),new a("",14,""),new a("",2,""),new a("",0," a "),new a("",0," that "),new a(" ",o,""),new a("",0,". "),new a(".",0,""),new a(" ",0,", "),new a("",15,""),new a("",0," with "),new a("",0,"'"),new a("",0," from "),new a("",0," by "),new a("",16,""),new a("",17,""),new a(" the ",0,""),new a("",4,""),new a("",0,". The "),new a("",i,""),new a("",0," on "),new a("",0," as "),new a("",0," is "),new a("",7,""),new a("",1,"ing "),new a("",0,"\n\t"),new a("",0,":"),new a(" ",0,". "),new a("",0,"ed "),new a("",20,""),new a("",18,""),new a("",6,""),new a("",0,"("),new a("",o,", "),new a("",8,""),new a("",0," at "),new a("",0,"ly "),new a(" the ",0," of "),new a("",5,""),new a("",9,""),new a(" ",o,", "),new a("",o,'"'),new a(".",0,"("),new a("",i," "),new a("",o,'">'),new a("",0,'="'),new a(" ",0,"."),new a(".com/",0,""),new a(" the ",0," of the "),new a("",o,"'"),new a("",0,". This "),new a("",0,","),new a(".",0," "),new a("",o,"("),new a("",o,"."),new a("",0," not "),new a(" ",0,'="'),new a("",0,"er "),new a(" ",i," "),new a("",0,"al "),new a(" ",i,""),new a("",0,"='"),new a("",i,'"'),new a("",o,". "),new a(" ",0,"("),new a("",0,"ful "),new a(" ",o,". "),new a("",0,"ive "),new a("",0,"less "),new a("",i,"'"),new a("",0,"est "),new a(" ",o,"."),new a("",i,'">'),new a(" ",0,"='"),new a("",o,","),new a("",0,"ize "),new a("",i,"."),new a("\xc2\xa0",0,""),new a(" ",0,","),new a("",o,'="'),new a("",i,'="'),new a("",0,"ous "),new a("",i,", "),new a("",o,"='"),new a(" ",o,","),new a(" ",i,'="'),new a(" ",i,", "),new a("",i,","),new a("",i,"("),new a("",i,". "),new a(" ",i,"."),new a("",i,"='"),new a(" ",i,". "),new a(" ",o,'="'),new a(" ",i,"='"),new a(" ",o,"='")];function l(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}t.kTransforms=s,t.kNumTransforms=s.length,t.transformDictionaryWord=function(e,t,n,a,c){var u,d=s[c].prefix,h=s[c].suffix,f=s[c].transform,p=f<12?0:f-11,g=0,m=t;p>a&&(p=a);for(var A=0;A0;){var v=l(e,u);u+=v,a-=v}for(var y=0;y{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),f=Symbol.iterator;var p={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,m={};function A(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||p}function v(){}function y(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||p}A.prototype.isReactComponent={},A.prototype.setState=function(e,t){if("object"!==typeof e&&"function"!==typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},A.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=A.prototype;var b=y.prototype=new v;b.constructor=y,g(b,A.prototype),b.isPureReactComponent=!0;var x=Array.isArray,w=Object.prototype.hasOwnProperty,C={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function D(e,t,r){var o,i={},a=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(a=""+t.key),t)w.call(t,o)&&!E.hasOwnProperty(o)&&(i[o]=t[o]);var l=arguments.length-2;if(1===l)i.children=r;else if(1{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3m3-10H5V5h10z"}),"Save")},2129:e=>{var t=function(){"use strict";function e(e,t){return null!=t&&e instanceof t}var t,n,r;try{t=Map}catch(s){t=function(){}}try{n=Set}catch(s){n=function(){}}try{r=Promise}catch(s){r=function(){}}function o(i,s,l,c,u){"object"===typeof s&&(l=s.depth,c=s.prototype,u=s.includeNonEnumerable,s=s.circular);var d=[],h=[],f="undefined"!=typeof Buffer;return"undefined"==typeof s&&(s=!0),"undefined"==typeof l&&(l=1/0),function i(l,p){if(null===l)return null;if(0===p)return l;var g,m;if("object"!=typeof l)return l;if(e(l,t))g=new t;else if(e(l,n))g=new n;else if(e(l,r))g=new r((function(e,t){l.then((function(t){e(i(t,p-1))}),(function(e){t(i(e,p-1))}))}));else if(o.__isArray(l))g=[];else if(o.__isRegExp(l))g=new RegExp(l.source,a(l)),l.lastIndex&&(g.lastIndex=l.lastIndex);else if(o.__isDate(l))g=new Date(l.getTime());else{if(f&&Buffer.isBuffer(l))return g=Buffer.allocUnsafe?Buffer.allocUnsafe(l.length):new Buffer(l.length),l.copy(g),g;e(l,Error)?g=Object.create(l):"undefined"==typeof c?(m=Object.getPrototypeOf(l),g=Object.create(m)):(g=Object.create(c),m=c)}if(s){var A=d.indexOf(l);if(-1!=A)return h[A];d.push(l),h.push(g)}for(var v in e(l,t)&&l.forEach((function(e,t){var n=i(t,p-1),r=i(e,p-1);g.set(n,r)})),e(l,n)&&l.forEach((function(e){var t=i(e,p-1);g.add(t)})),l){var y;m&&(y=Object.getOwnPropertyDescriptor(m,v)),y&&null==y.set||(g[v]=i(l[v],p-1))}if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(l);for(v=0;v{"use strict";var n="function"===typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,i=n?Symbol.for("react.fragment"):60107,a=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,h=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,p=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,m=n?Symbol.for("react.lazy"):60116,A=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,b=n?Symbol.for("react.scope"):60119;function x(e){if("object"===typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case i:case s:case a:case f:return e;default:switch(e=e&&e.$$typeof){case c:case h:case m:case g:case l:return e;default:return t}}case o:return t}}}function w(e){return x(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=h,t.Fragment=i,t.Lazy=m,t.Memo=g,t.Portal=o,t.Profiler=s,t.StrictMode=a,t.Suspense=f,t.isAsyncMode=function(e){return w(e)||x(e)===u},t.isConcurrentMode=w,t.isContextConsumer=function(e){return x(e)===c},t.isContextProvider=function(e){return x(e)===l},t.isElement=function(e){return"object"===typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return x(e)===h},t.isFragment=function(e){return x(e)===i},t.isLazy=function(e){return x(e)===m},t.isMemo=function(e){return x(e)===g},t.isPortal=function(e){return x(e)===o},t.isProfiler=function(e){return x(e)===s},t.isStrictMode=function(e){return x(e)===a},t.isSuspense=function(e){return x(e)===f},t.isValidElementType=function(e){return"string"===typeof e||"function"===typeof e||e===i||e===d||e===s||e===a||e===f||e===p||"object"===typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===g||e.$$typeof===l||e.$$typeof===c||e.$$typeof===h||e.$$typeof===v||e.$$typeof===y||e.$$typeof===b||e.$$typeof===A)},t.typeOf=x},2145:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"ChevronLeft")},2334:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"}),"FullscreenExit")},2354:e=>{function t(e,t){this.left=e,this.right=t,this.match=function(n){return e.match(n)&&t.match(n)}}function n(e,t){this.left=e,this.right=t,this.match=function(n){return e.match(n)||t.match(n)}}e.exports=function(e,r,o){switch(e){case"and":return new t(r,o);case",":return new n(r,o);default:throw new Error(value)}}},2375:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"}),"Visibility")},2406:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m2 14H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z"}),"Assignment")},2462:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z"}),"VisibilityOff")},2529:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(9950),o=n(1399);const i=function(e){const t=r.useRef(e);return(0,o.A)((()=>{t.current=e})),r.useRef((function(){return(0,t.current)(...arguments)})).current}},2570:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4m0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4"}),"Person")},2653:(e,t)=>{!function(e){"use strict";var t="undefined"!==typeof Uint8Array?Uint8Array:Array,n="+".charCodeAt(0),r="/".charCodeAt(0),o="0".charCodeAt(0),i="a".charCodeAt(0),a="A".charCodeAt(0),s="-".charCodeAt(0),l="_".charCodeAt(0);function c(e){var t=e.charCodeAt(0);return t===n||t===s?62:t===r||t===l?63:t0)throw new Error("Invalid string. Length must be a multiple of 4");var l=e.length;a="="===e.charAt(l-2)?2:"="===e.charAt(l-1)?1:0,s=new t(3*e.length/4-a),o=a>0?e.length-4:e.length;var u=0;function d(e){s[u++]=e}for(n=0,r=0;n>16),d((65280&i)>>8),d(255&i);return 2===a?d(255&(i=c(e.charAt(n))<<2|c(e.charAt(n+1))>>4)):1===a&&(d((i=c(e.charAt(n))<<10|c(e.charAt(n+1))<<4|c(e.charAt(n+2))>>2)>>8&255),d(255&i)),s},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,a="";function s(e){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)}for(t=0,r=e.length-i;t>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:a+=s((n=e[e.length-1])>>2),a+=s(n<<4&63),a+="==";break;case 2:a+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10),a+=s(n>>4&63),a+=s(n<<2&63),a+="="}return a}}(t)},2654:(e,t,n)=>{"use strict";var r=n(9950),o=Symbol.for("react.element"),i=Symbol.for("react.fragment"),a=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,i={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)a.call(t,r)&&!l.hasOwnProperty(r)&&(i[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===i[r]&&(i[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:i,_owner:s.current}}t.Fragment=i,t.jsx=c,t.jsxs=c},2689:function(e,t,n){!function(){var t;e.exports=(t=n(4703),function(){var e=t,n=e.lib,r=n.WordArray,o=n.Hasher,i=e.algo,a=[],s=i.SHA1=o.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],o=n[1],i=n[2],s=n[3],l=n[4],c=0;c<80;c++){if(c<16)a[c]=0|e[t+c];else{var u=a[c-3]^a[c-8]^a[c-14]^a[c-16];a[c]=u<<1|u>>>31}var d=(r<<5|r>>>27)+l+a[c];d+=c<20?1518500249+(o&i|~o&s):c<40?1859775393+(o^i^s):c<60?(o&i|o&s|i&s)-1894007588:(o^i^s)-899497514,l=s,s=i,i=o<<30|o>>>2,o=r,r=d}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+i|0,n[3]=n[3]+s|0,n[4]=n[4]+l|0},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;return t[r>>>5]|=128<<24-r%32,t[14+(r+64>>>9<<4)]=Math.floor(n/4294967296),t[15+(r+64>>>9<<4)]=n,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});e.SHA1=o._createHelper(s),e.HmacSHA1=o._createHmacHelper(s)}(),t.SHA1)}()},2703:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,BO:()=>a,Yn:()=>i});var r=n(5501),o=n(8286);function i(e,t){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(!t||"string"!==typeof t)return null;if(e&&e.vars&&n){const n="vars.".concat(t).split(".").reduce(((e,t)=>e&&e[t]?e[t]:null),e);if(null!=n)return n}return t.split(".").reduce(((e,t)=>e&&null!=e[t]?e[t]:null),e)}function a(e,t,n){let r,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:n;return r="function"===typeof e?e(n):Array.isArray(e)?e[n]||o:i(e,n)||o,t&&(r=t(r,o,e)),r}const s=function(e){const{prop:t,cssProperty:n=e.prop,themeKey:s,transform:l}=e,c=e=>{if(null==e[t])return null;const c=e[t],u=i(e.theme,s)||{};return(0,o.NI)(e,c,(e=>{let o=a(u,l,e);return e===o&&"string"===typeof e&&(o=a(u,l,"".concat(t).concat("default"===e?"":(0,r.A)(e)),e)),!1===n?o:{[n]:o}}))};return c.propTypes={},c.filterProps=[t],c}},2768:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.mode.ECB=function(){var e=t.lib.BlockCipherMode.extend();return e.Encryptor=e.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}}),e.Decryptor=e.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}}),e}(),t.mode.ECB)}()},2853:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M6 9h12v2H6zm8 5H6v-2h8zm4-6H6V6h12z"}),"Chat")},2860:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(8168),o=n(8587),i=n(7483),a=n(3628);const s={borderRadius:4};var l=n(7937);var c=n(505),u=n(8076),d=n(86);const h=["breakpoints","palette","spacing","shape"];const f=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{breakpoints:t={},palette:n={},spacing:f,shape:p={}}=e,g=(0,o.A)(e,h),m=(0,a.A)(t),A=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;if(e.mui)return e;const t=(0,l.LX)({spacing:e}),n=function(){for(var e=arguments.length,n=new Array(e),r=0;r{const n=t(e);return"number"===typeof n?"".concat(n,"px"):n})).join(" ")};return n.mui=!0,n}(f);let v=(0,i.A)({breakpoints:m,direction:"ltr",components:{},palette:(0,r.A)({mode:"light"},n),spacing:A,shape:(0,r.A)({},s,p)},g);v.applyStyles=d.A;for(var y=arguments.length,b=new Array(y>1?y-1:0),x=1;x(0,i.A)(e,t)),v),v.unstable_sxConfig=(0,r.A)({},u.A,null==g?void 0:g.unstable_sxConfig),v.unstable_sx=function(e){return(0,c.A)({sx:e,theme:this})},v}},2903:e=>{"use strict";e.exports=function(e,t){var n,r,o,i,a,s,l,c,u,d,h,f,p,g,m,A,v,y,b,x,w,C,E,D,k;n=e.state,r=e.next_in,D=e.input,o=r+(e.avail_in-5),i=e.next_out,k=e.output,a=i-(t-e.avail_out),s=i+(e.avail_out-257),l=n.dmax,c=n.wsize,u=n.whave,d=n.wnext,h=n.window,f=n.hold,p=n.bits,g=n.lencode,m=n.distcode,A=(1<>>=b=y>>>24,p-=b,0===(b=y>>>16&255))k[i++]=65535&y;else{if(!(16&b)){if(0===(64&b)){y=g[(65535&y)+(f&(1<>>=b,p-=b),p<15&&(f+=D[r++]<>>=b=y>>>24,p-=b,!(16&(b=y>>>16&255))){if(0===(64&b)){y=m[(65535&y)+(f&(1<l){e.msg="invalid distance too far back",n.mode=30;break e}if(f>>>=b,p-=b,w>(b=i-a)){if((b=w-b)>u&&n.sane){e.msg="invalid distance too far back",n.mode=30;break e}if(C=0,E=h,0===d){if(C+=c-b,b2;)k[i++]=E[C++],k[i++]=E[C++],k[i++]=E[C++],x-=3;x&&(k[i++]=E[C++],x>1&&(k[i++]=E[C++]))}else{C=i-w;do{k[i++]=k[C++],k[i++]=k[C++],k[i++]=k[C++],x-=3}while(x>2);x&&(k[i++]=k[C++],x>1&&(k[i++]=k[C++]))}break}}break}}while(r>3,f&=(1<<(p-=x<<3))-1,e.next_in=r,e.next_out=i,e.avail_in=r{"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},2969:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(!(0>>1;ri(l,n))ci(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(ci(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"===typeof performance&&"function"===typeof performance.now){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,g=!1,m=!1,A="function"===typeof setTimeout?setTimeout:null,v="function"===typeof clearTimeout?clearTimeout:null,y="undefined"!==typeof setImmediate?setImmediate:null;function b(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function x(e){if(m=!1,b(e),!g)if(null!==r(c))g=!0,T(w);else{var t=r(u);null!==t&&R(x,t.startTime-e)}}function w(e,n){g=!1,m&&(m=!1,v(k),k=-1),p=!0;var i=f;try{for(b(n),h=r(c);null!==h&&(!(h.expirationTime>n)||e&&!B());){var a=h.callback;if("function"===typeof a){h.callback=null,f=h.priorityLevel;var s=a(h.expirationTime<=n);n=t.unstable_now(),"function"===typeof s?h.callback=s:h===r(c)&&o(c),b(n)}else o(c);h=r(c)}if(null!==h)var l=!0;else{var d=r(u);null!==d&&R(x,d.startTime-n),l=!1}return l}finally{h=null,f=i,p=!1}}"undefined"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var C,E=!1,D=null,k=-1,I=5,S=-1;function B(){return!(t.unstable_now()-Se||125a?(e.sortIndex=i,n(u,e),null===r(c)&&e===r(u)&&(m?(v(k),k=-1):m=!0,R(x,i-a))):(e.sortIndex=s,n(c,e),g||p||(g=!0,T(w))),e},t.unstable_shouldYield=B,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},3044:(e,t,n)=>{"use strict";e.exports=n(9940)},3062:(e,t,n)=>{"use strict";n.d(t,{pe:()=>i});var r=n(6910);const{Axios:o,AxiosError:i,CanceledError:a,isCancel:s,CancelToken:l,VERSION:c,all:u,Cancel:d,isAxiosError:h,spread:f,toFormData:p,AxiosHeaders:g,HttpStatusCode:m,formToJSON:A,getAdapter:v,mergeConfig:y}=r.A},3137:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(3988),n(7766),n(7020),n(7755),function(){var e=t,n=e.lib.BlockCipher,r=e.algo,o=[],i=[],a=[],s=[],l=[],c=[],u=[],d=[],h=[],f=[];!function(){for(var e=[],t=0;t<256;t++)e[t]=t<128?t<<1:t<<1^283;var n=0,r=0;for(t=0;t<256;t++){var p=r^r<<1^r<<2^r<<3^r<<4;p=p>>>8^255&p^99,o[n]=p,i[p]=n;var g=e[n],m=e[g],A=e[m],v=257*e[p]^16843008*p;a[n]=v<<24|v>>>8,s[n]=v<<16|v>>>16,l[n]=v<<8|v>>>24,c[n]=v,v=16843009*A^65537*m^257*g^16843008*n,u[p]=v<<24|v>>>8,d[p]=v<<16|v>>>16,h[p]=v<<8|v>>>24,f[p]=v,n?(n=g^e[e[e[A^g]]],r^=e[e[r]]):n=r=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],g=r.AES=n.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,t=e.words,n=e.sigBytes/4,r=4*((this._nRounds=n+6)+1),i=this._keySchedule=[],a=0;a6&&a%n==4&&(c=o[c>>>24]<<24|o[c>>>16&255]<<16|o[c>>>8&255]<<8|o[255&c]):(c=o[(c=c<<8|c>>>24)>>>24]<<24|o[c>>>16&255]<<16|o[c>>>8&255]<<8|o[255&c],c^=p[a/n|0]<<24),i[a]=i[a-n]^c);for(var s=this._invKeySchedule=[],l=0;l>>24]]^d[o[c>>>16&255]]^h[o[c>>>8&255]]^f[o[255&c]]}}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,a,s,l,c,o)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,u,d,h,f,i),n=e[t+1],e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,o,i,a,s){for(var l=this._nRounds,c=e[t]^n[0],u=e[t+1]^n[1],d=e[t+2]^n[2],h=e[t+3]^n[3],f=4,p=1;p>>24]^o[u>>>16&255]^i[d>>>8&255]^a[255&h]^n[f++],m=r[u>>>24]^o[d>>>16&255]^i[h>>>8&255]^a[255&c]^n[f++],A=r[d>>>24]^o[h>>>16&255]^i[c>>>8&255]^a[255&u]^n[f++],v=r[h>>>24]^o[c>>>16&255]^i[u>>>8&255]^a[255&d]^n[f++];c=g,u=m,d=A,h=v}g=(s[c>>>24]<<24|s[u>>>16&255]<<16|s[d>>>8&255]<<8|s[255&h])^n[f++],m=(s[u>>>24]<<24|s[d>>>16&255]<<16|s[h>>>8&255]<<8|s[255&c])^n[f++],A=(s[d>>>24]<<24|s[h>>>16&255]<<16|s[c>>>8&255]<<8|s[255&u])^n[f++],v=(s[h>>>24]<<24|s[c>>>16&255]<<16|s[u>>>8&255]<<8|s[255&d])^n[f++],e[t]=g,e[t+1]=m,e[t+2]=A,e[t+3]=v},keySize:8});e.AES=n._createHelper(g)}(),t.AES)}()},3148:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M22 11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3z"}),"AccountTree")},3153:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M16.59 7.58 10 14.17l-3.59-3.58L5 12l5 5 8-8zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8"}),"CheckCircleOutline")},3158:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(9950);var r=n(8283),o=n(4414);function i(e){const{styles:t,defaultTheme:n={}}=e,i="function"===typeof t?e=>{return t(void 0===(r=e)||null===r||0===Object.keys(r).length?n:e);var r}:t;return(0,o.jsx)(r.mL,{styles:i})}},3161:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M5 17v2h14v-2zm4.5-4.2h5l.9 2.2h2.1L12.75 4h-1.5L6.5 15h2.1zM12 5.98 13.87 11h-3.74z"}),"TextFormat")},3175:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"}),"Warning")},3199:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6z"}),"KeyboardArrowRight")},3204:(e,t,n)=>{"use strict";e.exports=n(2969)},3235:(e,t,n)=>{"use strict";n.d(t,{A:()=>y});var r=n(8168),o=n(9950),i=n(8587),a=n(2004),s=n(8465),l=n(1676),c=n(8463),u=n(9254),d=n(1763),h=n(423);function f(e){return(0,h.Ay)("MuiSvgIcon",e)}(0,d.A)("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var p=n(4414);const g=["children","className","color","component","fontSize","htmlColor","inheritViewBox","titleAccess","viewBox"],m=(0,u.Ay)("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,"inherit"!==n.color&&t["color".concat((0,l.A)(n.color))],t["fontSize".concat((0,l.A)(n.fontSize))]]}})((e=>{let{theme:t,ownerState:n}=e;var r,o,i,a,s,l,c,u,d,h,f,p,g;return{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:n.hasSvgAsChild?void 0:"currentColor",flexShrink:0,transition:null==(r=t.transitions)||null==(o=r.create)?void 0:o.call(r,"fill",{duration:null==(i=t.transitions)||null==(i=i.duration)?void 0:i.shorter}),fontSize:{inherit:"inherit",small:(null==(a=t.typography)||null==(s=a.pxToRem)?void 0:s.call(a,20))||"1.25rem",medium:(null==(l=t.typography)||null==(c=l.pxToRem)?void 0:c.call(l,24))||"1.5rem",large:(null==(u=t.typography)||null==(d=u.pxToRem)?void 0:d.call(u,35))||"2.1875rem"}[n.fontSize],color:null!=(h=null==(f=(t.vars||t).palette)||null==(f=f[n.color])?void 0:f.main)?h:{action:null==(p=(t.vars||t).palette)||null==(p=p.action)?void 0:p.active,disabled:null==(g=(t.vars||t).palette)||null==(g=g.action)?void 0:g.disabled,inherit:void 0}[n.color]}})),A=o.forwardRef((function(e,t){const n=(0,c.b)({props:e,name:"MuiSvgIcon"}),{children:u,className:d,color:h="inherit",component:A="svg",fontSize:v="medium",htmlColor:y,inheritViewBox:b=!1,titleAccess:x,viewBox:w="0 0 24 24"}=n,C=(0,i.A)(n,g),E=o.isValidElement(u)&&"svg"===u.type,D=(0,r.A)({},n,{color:h,component:A,fontSize:v,instanceFontSize:e.fontSize,inheritViewBox:b,viewBox:w,hasSvgAsChild:E}),k={};b||(k.viewBox=w);const I=(e=>{const{color:t,fontSize:n,classes:r}=e,o={root:["root","inherit"!==t&&"color".concat((0,l.A)(t)),"fontSize".concat((0,l.A)(n))]};return(0,s.A)(o,f,r)})(D);return(0,p.jsxs)(m,(0,r.A)({as:A,className:(0,a.A)(I.root,d),focusable:"false",color:y,"aria-hidden":!x||void 0,role:x?"img":void 0,ref:t},k,C,E&&u.props,{ownerState:D,children:[E?u.props.children:u,x?(0,p.jsx)("title",{children:x}):null]}))}));A.muiName="SvgIcon";const v=A;function y(e,t){function n(n,o){return(0,p.jsx)(v,(0,r.A)({"data-testid":"".concat(t,"Icon"),ref:o},n,{children:e}))}return n.muiName=v.muiName,o.memo(o.forwardRef(n))}},3246:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess")},3288:e=>{var t="-".charCodeAt(0),n="+".charCodeAt(0),r=".".charCodeAt(0),o="e".charCodeAt(0),i="E".charCodeAt(0);e.exports=function(e){var a,s,l,c=0,u=e.length;if(0===u||!function(e){var o,i=e.charCodeAt(0);if(i===n||i===t){if((o=e.charCodeAt(1))>=48&&o<=57)return!0;var a=e.charCodeAt(2);return o===r&&a>=48&&a<=57}return i===r?(o=e.charCodeAt(1))>=48&&o<=57:i>=48&&i<=57}(e))return!1;for((a=e.charCodeAt(c))!==n&&a!==t||c++;c57);)c+=1;if(a=e.charCodeAt(c),s=e.charCodeAt(c+1),a===r&&s>=48&&s<=57)for(c+=2;c57);)c+=1;if(a=e.charCodeAt(c),s=e.charCodeAt(c+1),l=e.charCodeAt(c+2),(a===o||a===i)&&(s>=48&&s<=57||(s===n||s===t)&&l>=48&&l<=57))for(c+=s===n||s===t?3:2;c57);)c+=1;return{number:e.slice(0,c),unit:e.slice(c)}}},3384:e=>{"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},3539:(e,t,n)=>{"use strict";var r;n.d(t,{A:()=>s});var o=n(9950);let i=0;const a=(r||(r=n.t(o,2)))["useId".toString()];function s(e){if(void 0!==a){const t=a();return null!=e?e:t}return function(e){const[t,n]=o.useState(e),r=e||t;return o.useEffect((()=>{null==t&&(i+=1,n("mui-".concat(i)))}),[t]),r}(e)}},3589:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z"}),"KeyboardArrowDown")},3628:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8587),o=n(8168);const i=["values","unit","step"],a=e=>{const t=Object.keys(e).map((t=>({key:t,val:e[t]})))||[];return t.sort(((e,t)=>e.val-t.val)),t.reduce(((e,t)=>(0,o.A)({},e,{[t.key]:t.val})),{})};function s(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:n="px",step:s=5}=e,l=(0,r.A)(e,i),c=a(t),u=Object.keys(c);function d(e){const r="number"===typeof t[e]?t[e]:e;return"@media (min-width:".concat(r).concat(n,")")}function h(e){const r="number"===typeof t[e]?t[e]:e;return"@media (max-width:".concat(r-s/100).concat(n,")")}function f(e,r){const o=u.indexOf(r);return"@media (min-width:".concat("number"===typeof t[e]?t[e]:e).concat(n,") and ")+"(max-width:".concat((-1!==o&&"number"===typeof t[u[o]]?t[u[o]]:r)-s/100).concat(n,")")}return(0,o.A)({keys:u,values:c,up:d,down:h,between:f,only:function(e){return u.indexOf(e)+1{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2M11 16l4-4-4-4v3H1v2h10z"}),"Input")},3683:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"m22.7 19-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4"}),"Build")},3716:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z"}),"FileUpload")},3742:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M5 20h14v-2H5zm0-10h4v6h6v-6h4l-7-7z"}),"Upload")},3828:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(9950);const o=function(e,t){var n,o;return r.isValidElement(e)&&-1!==t.indexOf(null!=(n=e.type.muiName)?n:null==(o=e.type)||null==(o=o._payload)||null==(o=o.value)?void 0:o.muiName)}},3836:e=>{"use strict";e.exports=class{constructor(e){this.stateTable=e.stateTable,this.accepting=e.accepting,this.tags=e.tags}match(e){var t=this;return{*[Symbol.iterator](){for(var n=1,r=null,o=null,i=null,a=0;a=r&&(yield[r,o,t.tags[i]]),n=t.stateTable[1][s],r=null),0!==n&&null==r&&(r=a),t.accepting[n]&&(o=a),0===n&&(n=1)}null!=r&&null!=o&&o>=r&&(yield[r,o,t.tags[n]])}}}apply(e,t){for(var[n,r,o]of this.match(e))for(var i of o)"function"===typeof t[i]&&t[i](n,r,e.slice(n,r+1))}}},3876:(e,t,n)=>{"use strict";var r=n(630),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?a:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=a;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,h=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,p=Object.prototype;e.exports=function e(t,n,r){if("string"!==typeof n){if(p){var o=f(n);o&&o!==p&&e(t,o,r)}var a=u(n);d&&(a=a.concat(d(n)));for(var s=l(t),g=l(n),m=0;m{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 1 3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11z"}),"Security")},3931:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(9950);function o(e){let{controlled:t,default:n,name:o,state:i="value"}=e;const{current:a}=r.useRef(void 0!==t),[s,l]=r.useState(n);return[a?t:s,r.useCallback((e=>{a||l(e)}),[])]}},3988:function(e,t,n){!function(){var t;e.exports=(t=n(4703),function(){var e=t,n=e.lib.WordArray;function r(e,t,r){for(var o=[],i=0,a=0;a>>6-a%4*2;o[i>>>2]|=s<<24-i%4*8,i++}return n.create(o,i)}e.enc.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp();for(var o=[],i=0;i>>2]>>>24-i%4*8&255)<<16|(t[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|t[i+2>>>2]>>>24-(i+2)%4*8&255,s=0;s<4&&i+.75*s>>6*(3-s)&63));var l=r.charAt(64);if(l)for(;o.length%4;)o.push(l);return o.join("")},parse:function(e){var t=e.length,n=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i>>2];e.sigBytes-=t}},t.pad.Iso10126)}()},4278:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(3988),n(7766),n(7020),n(7755),function(){var e=t,n=e.lib.StreamCipher,r=e.algo,o=[],i=[],a=[],s=r.RabbitLegacy=n.extend({_doReset:function(){var e=this._key.words,t=this.cfg.iv,n=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],r=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(var o=0;o<4;o++)l.call(this);for(o=0;o<8;o++)r[o]^=n[o+4&7];if(t){var i=t.words,a=i[0],s=i[1],c=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),u=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=c>>>16|4294901760&u,h=u<<16|65535&c;for(r[0]^=c,r[1]^=d,r[2]^=u,r[3]^=h,r[4]^=c,r[5]^=d,r[6]^=u,r[7]^=h,o=0;o<4;o++)l.call(this)}},_doProcessBlock:function(e,t){var n=this._X;l.call(this),o[0]=n[0]^n[5]>>>16^n[3]<<16,o[1]=n[2]^n[7]>>>16^n[5]<<16,o[2]=n[4]^n[1]>>>16^n[7]<<16,o[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++)o[r]=16711935&(o[r]<<8|o[r]>>>24)|4278255360&(o[r]<<24|o[r]>>>8),e[t+r]^=o[r]},blockSize:4,ivSize:2});function l(){for(var e=this._X,t=this._C,n=0;n<8;n++)i[n]=t[n];for(t[0]=t[0]+1295307597+this._b|0,t[1]=t[1]+3545052371+(t[0]>>>0>>0?1:0)|0,t[2]=t[2]+886263092+(t[1]>>>0>>0?1:0)|0,t[3]=t[3]+1295307597+(t[2]>>>0>>0?1:0)|0,t[4]=t[4]+3545052371+(t[3]>>>0>>0?1:0)|0,t[5]=t[5]+886263092+(t[4]>>>0>>0?1:0)|0,t[6]=t[6]+1295307597+(t[5]>>>0>>0?1:0)|0,t[7]=t[7]+3545052371+(t[6]>>>0>>0?1:0)|0,this._b=t[7]>>>0>>0?1:0,n=0;n<8;n++){var r=e[n]+t[n],o=65535&r,s=r>>>16,l=((o*o>>>17)+o*s>>>15)+s*s,c=((4294901760&r)*r|0)+((65535&r)*r|0);a[n]=l^c}e[0]=a[0]+(a[7]<<16|a[7]>>>16)+(a[6]<<16|a[6]>>>16)|0,e[1]=a[1]+(a[0]<<8|a[0]>>>24)+a[7]|0,e[2]=a[2]+(a[1]<<16|a[1]>>>16)+(a[0]<<16|a[0]>>>16)|0,e[3]=a[3]+(a[2]<<8|a[2]>>>24)+a[1]|0,e[4]=a[4]+(a[3]<<16|a[3]>>>16)+(a[2]<<16|a[2]>>>16)|0,e[5]=a[5]+(a[4]<<8|a[4]>>>24)+a[3]|0,e[6]=a[6]+(a[5]<<16|a[5]>>>16)+(a[4]<<16|a[4]>>>16)|0,e[7]=a[7]+(a[6]<<8|a[6]>>>24)+a[5]|0}e.RabbitLegacy=n._createHelper(s)}(),t.RabbitLegacy)}()},4290:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(4654),function(){var e=t,n=e.lib.Hasher,r=e.x64,o=r.Word,i=r.WordArray,a=e.algo;function s(){return o.create.apply(o,arguments)}var l=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],c=[];!function(){for(var e=0;e<80;e++)c[e]=s()}();var u=a.SHA512=n.extend({_doReset:function(){this._hash=new i.init([new o.init(1779033703,4089235720),new o.init(3144134277,2227873595),new o.init(1013904242,4271175723),new o.init(2773480762,1595750129),new o.init(1359893119,2917565137),new o.init(2600822924,725511199),new o.init(528734635,4215389547),new o.init(1541459225,327033209)])},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],o=n[1],i=n[2],a=n[3],s=n[4],u=n[5],d=n[6],h=n[7],f=r.high,p=r.low,g=o.high,m=o.low,A=i.high,v=i.low,y=a.high,b=a.low,x=s.high,w=s.low,C=u.high,E=u.low,D=d.high,k=d.low,I=h.high,S=h.low,B=f,_=p,F=g,j=m,T=A,R=v,M=y,N=b,Q=x,P=w,O=C,L=E,z=D,U=k,H=I,W=S,G=0;G<80;G++){var V,K,Y=c[G];if(G<16)K=Y.high=0|e[t+2*G],V=Y.low=0|e[t+2*G+1];else{var q=c[G-15],J=q.high,X=q.low,Z=(J>>>1|X<<31)^(J>>>8|X<<24)^J>>>7,$=(X>>>1|J<<31)^(X>>>8|J<<24)^(X>>>7|J<<25),ee=c[G-2],te=ee.high,ne=ee.low,re=(te>>>19|ne<<13)^(te<<3|ne>>>29)^te>>>6,oe=(ne>>>19|te<<13)^(ne<<3|te>>>29)^(ne>>>6|te<<26),ie=c[G-7],ae=ie.high,se=ie.low,le=c[G-16],ce=le.high,ue=le.low;K=(K=(K=Z+ae+((V=$+se)>>>0<$>>>0?1:0))+re+((V+=oe)>>>0>>0?1:0))+ce+((V+=ue)>>>0>>0?1:0),Y.high=K,Y.low=V}var de,he=Q&O^~Q&z,fe=P&L^~P&U,pe=B&F^B&T^F&T,ge=_&j^_&R^j&R,me=(B>>>28|_<<4)^(B<<30|_>>>2)^(B<<25|_>>>7),Ae=(_>>>28|B<<4)^(_<<30|B>>>2)^(_<<25|B>>>7),ve=(Q>>>14|P<<18)^(Q>>>18|P<<14)^(Q<<23|P>>>9),ye=(P>>>14|Q<<18)^(P>>>18|Q<<14)^(P<<23|Q>>>9),be=l[G],xe=be.high,we=be.low,Ce=H+ve+((de=W+ye)>>>0>>0?1:0),Ee=Ae+ge;H=z,W=U,z=O,U=L,O=Q,L=P,Q=M+(Ce=(Ce=(Ce=Ce+he+((de+=fe)>>>0>>0?1:0))+xe+((de+=we)>>>0>>0?1:0))+K+((de+=V)>>>0>>0?1:0))+((P=N+de|0)>>>0>>0?1:0)|0,M=T,N=R,T=F,R=j,F=B,j=_,B=Ce+(me+pe+(Ee>>>0>>0?1:0))+((_=de+Ee|0)>>>0>>0?1:0)|0}p=r.low=p+_,r.high=f+B+(p>>>0<_>>>0?1:0),m=o.low=m+j,o.high=g+F+(m>>>0>>0?1:0),v=i.low=v+R,i.high=A+T+(v>>>0>>0?1:0),b=a.low=b+N,a.high=y+M+(b>>>0>>0?1:0),w=s.low=w+P,s.high=x+Q+(w>>>0

>>0?1:0),E=u.low=E+L,u.high=C+O+(E>>>0>>0?1:0),k=d.low=k+U,d.high=D+z+(k>>>0>>0?1:0),S=h.low=S+W,h.high=I+H+(S>>>0>>0?1:0)},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;return t[r>>>5]|=128<<24-r%32,t[30+(r+128>>>10<<5)]=Math.floor(n/4294967296),t[31+(r+128>>>10<<5)]=n,e.sigBytes=4*t.length,this._process(),this._hash.toX32()},clone:function(){var e=n.clone.call(this);return e._hash=this._hash.clone(),e},blockSize:32});e.SHA512=n._createHelper(u),e.HmacSHA512=n._createHmacHelper(u)}(),t.SHA512)}()},4302:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M2 20h20v-4H2zm2-3h2v2H4zM2 4v4h20V4zm4 3H4V5h2zm-4 7h20v-4H2zm2-3h2v2H4z"}),"Storage")},4414:(e,t,n)=>{"use strict";e.exports=n(2654)},4423:(e,t)=>{t.lookup=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),t.lookupOffsets=new Uint16Array([1024,1536,1280,1536,0,256,768,512])},4429:e=>{var t=4096,n=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function r(e){this.buf_=new Uint8Array(8224),this.input_=e,this.reset()}r.READ_SIZE=t,r.IBUF_MASK=8191,r.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(var e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,++this.pos_;return this.bit_end_pos_>0},r.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw new Error("Unexpected end of input "+this.bit_pos_+" "+this.bit_end_pos_)}else{var e=this.buf_ptr_,n=this.input_.read(this.buf_,e,t);if(n<0)throw new Error("Unexpected end of input");if(n=8;)this.val_>>>=8,this.val_|=this.buf_[8191&this.pos_]<<24,++this.pos_,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},r.prototype.readBits=function(e){32-this.bit_pos_>>this.bit_pos_&n[e];return this.bit_pos_+=e,t},e.exports=r},4436:(e,t,n)=>{"use strict";n.d(t,{A:()=>M});var r=n(8168),o=n(8587),i=n(8099),a=n(7483),s=n(8076),l=n(505),c=n(2860);var u=n(9269);const d={black:"#000",white:"#fff"},h={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},f={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},p={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},g={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},m={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},A={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},v={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},y=["mode","contrastThreshold","tonalOffset"],b={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:d.white,default:d.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},x={text:{primary:d.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:d.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function w(e,t,n,r){const o=r.light||r,i=r.dark||1.5*r;e[t]||(e.hasOwnProperty(n)?e[t]=e[n]:"light"===t?e.light=(0,u.a)(e.main,o):"dark"===t&&(e.dark=(0,u.e$)(e.main,i)))}function C(e){const{mode:t="light",contrastThreshold:n=3,tonalOffset:s=.2}=e,l=(0,o.A)(e,y),c=e.primary||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:m[200],light:m[50],dark:m[400]}:{main:m[700],light:m[400],dark:m[800]}}(t),C=e.secondary||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:f[200],light:f[50],dark:f[400]}:{main:f[500],light:f[300],dark:f[700]}}(t),E=e.error||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:p[500],light:p[300],dark:p[700]}:{main:p[700],light:p[400],dark:p[800]}}(t),D=e.info||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:A[400],light:A[300],dark:A[700]}:{main:A[700],light:A[500],dark:A[900]}}(t),k=e.success||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:v[400],light:v[300],dark:v[700]}:{main:v[800],light:v[500],dark:v[900]}}(t),I=e.warning||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:g[400],light:g[300],dark:g[700]}:{main:"#ed6c02",light:g[500],dark:g[900]}}(t);function S(e){return(0,u.eM)(e,x.text.primary)>=n?x.text.primary:b.text.primary}const B=e=>{let{color:t,name:n,mainShade:o=500,lightShade:a=300,darkShade:l=700}=e;if(t=(0,r.A)({},t),!t.main&&t[o]&&(t.main=t[o]),!t.hasOwnProperty("main"))throw new Error((0,i.A)(11,n?" (".concat(n,")"):"",o));if("string"!==typeof t.main)throw new Error((0,i.A)(12,n?" (".concat(n,")"):"",JSON.stringify(t.main)));return w(t,"light",a,s),w(t,"dark",l,s),t.contrastText||(t.contrastText=S(t.main)),t},_={dark:x,light:b};return(0,a.A)((0,r.A)({common:(0,r.A)({},d),mode:t,primary:B({color:c,name:"primary"}),secondary:B({color:C,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:B({color:E,name:"error"}),warning:B({color:I,name:"warning"}),info:B({color:D,name:"info"}),success:B({color:k,name:"success"}),grey:h,contrastThreshold:n,getContrastText:S,augmentColor:B,tonalOffset:s},_[t]),l)}const E=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"];function D(e){return Math.round(1e5*e)/1e5}const k={textTransform:"uppercase"},I='"Roboto", "Helvetica", "Arial", sans-serif';function S(e,t){const n="function"===typeof t?t(e):t,{fontFamily:i=I,fontSize:s=14,fontWeightLight:l=300,fontWeightRegular:c=400,fontWeightMedium:u=500,fontWeightBold:d=700,htmlFontSize:h=16,allVariants:f,pxToRem:p}=n,g=(0,o.A)(n,E);const m=s/14,A=p||(e=>"".concat(e/h*m,"rem")),v=(e,t,n,o,a)=>(0,r.A)({fontFamily:i,fontWeight:e,fontSize:A(t),lineHeight:n},i===I?{letterSpacing:"".concat(D(o/t),"em")}:{},a,f),y={h1:v(l,96,1.167,-1.5),h2:v(l,60,1.2,-.5),h3:v(c,48,1.167,0),h4:v(c,34,1.235,.25),h5:v(c,24,1.334,0),h6:v(u,20,1.6,.15),subtitle1:v(c,16,1.75,.15),subtitle2:v(u,14,1.57,.1),body1:v(c,16,1.5,.15),body2:v(c,14,1.43,.15),button:v(u,14,1.75,.4,k),caption:v(c,12,1.66,.4),overline:v(c,12,2.66,1,k),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}};return(0,a.A)((0,r.A)({htmlFontSize:h,pxToRem:A,fontFamily:i,fontSize:s,fontWeightLight:l,fontWeightRegular:c,fontWeightMedium:u,fontWeightBold:d},y),g,{clone:!1})}function B(){return["".concat(arguments.length<=0?void 0:arguments[0],"px ").concat(arguments.length<=1?void 0:arguments[1],"px ").concat(arguments.length<=2?void 0:arguments[2],"px ").concat(arguments.length<=3?void 0:arguments[3],"px rgba(0,0,0,").concat(.2,")"),"".concat(arguments.length<=4?void 0:arguments[4],"px ").concat(arguments.length<=5?void 0:arguments[5],"px ").concat(arguments.length<=6?void 0:arguments[6],"px ").concat(arguments.length<=7?void 0:arguments[7],"px rgba(0,0,0,").concat(.14,")"),"".concat(arguments.length<=8?void 0:arguments[8],"px ").concat(arguments.length<=9?void 0:arguments[9],"px ").concat(arguments.length<=10?void 0:arguments[10],"px ").concat(arguments.length<=11?void 0:arguments[11],"px rgba(0,0,0,").concat(.12,")")].join(",")}const _=["none",B(0,2,1,-1,0,1,1,0,0,1,3,0),B(0,3,1,-2,0,2,2,0,0,1,5,0),B(0,3,3,-2,0,3,4,0,0,1,8,0),B(0,2,4,-1,0,4,5,0,0,1,10,0),B(0,3,5,-1,0,5,8,0,0,1,14,0),B(0,3,5,-1,0,6,10,0,0,1,18,0),B(0,4,5,-2,0,7,10,1,0,2,16,1),B(0,5,5,-3,0,8,10,1,0,3,14,2),B(0,5,6,-3,0,9,12,1,0,3,16,2),B(0,6,6,-3,0,10,14,1,0,4,18,3),B(0,6,7,-4,0,11,15,1,0,4,20,3),B(0,7,8,-4,0,12,17,2,0,5,22,4),B(0,7,8,-4,0,13,19,2,0,5,24,4),B(0,7,9,-4,0,14,21,2,0,5,26,4),B(0,8,9,-5,0,15,22,2,0,6,28,5),B(0,8,10,-5,0,16,24,2,0,6,30,5),B(0,8,11,-5,0,17,26,2,0,6,32,5),B(0,9,11,-5,0,18,28,2,0,7,34,6),B(0,9,12,-6,0,19,29,2,0,7,36,6),B(0,10,13,-6,0,20,31,3,0,8,38,7),B(0,10,13,-6,0,21,33,3,0,8,40,7),B(0,10,14,-6,0,22,35,3,0,8,42,7),B(0,11,14,-7,0,23,36,3,0,9,44,8),B(0,11,15,-7,0,24,38,3,0,9,46,8)];var F=n(5361);const j={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500},T=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];function R(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{mixins:t={},palette:n={},transitions:u={},typography:d={}}=e,h=(0,o.A)(e,T);if(e.vars&&void 0===e.generateCssVars)throw new Error((0,i.A)(18));const f=C(n),p=(0,c.A)(e);let g=(0,a.A)(p,{mixins:(m=p.breakpoints,A=t,(0,r.A)({toolbar:{minHeight:56,[m.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[m.up("sm")]:{minHeight:64}}},A)),palette:f,shadows:_.slice(),typography:S(f,d),transitions:(0,F.Ay)(u),zIndex:(0,r.A)({},j)});var m,A;g=(0,a.A)(g,h);for(var v=arguments.length,y=new Array(v>1?v-1:0),b=1;b(0,a.A)(e,t)),g),g.unstable_sxConfig=(0,r.A)({},s.A,null==h?void 0:h.unstable_sxConfig),g.unstable_sx=function(e){return(0,l.A)({sx:e,theme:this})},g}const M=R},4467:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(9526);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},4501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>e,o=(()=>{let e=r;return{configure(t){e=t},generate:t=>e(t),reset(){e=r}}})()},4564:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M20 9V7c0-1.1-.9-2-2-2h-3c0-1.66-1.34-3-3-3S9 3.34 9 5H6c-1.1 0-2 .9-2 2v2c-1.66 0-3 1.34-3 3s1.34 3 3 3v4c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-4c1.66 0 3-1.34 3-3s-1.34-3-3-3M7.5 11.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5S9.83 13 9 13s-1.5-.67-1.5-1.5M16 17H8v-2h8zm-1-4c-.83 0-1.5-.67-1.5-1.5S14.17 10 15 10s1.5.67 1.5 1.5S15.83 13 15 13"}),"SmartToy")},4593:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2M9.5 16.5v-9l7 4.5z"}),"PlayCircle")},4634:e=>{function t(){return e.exports=t=Object.assign?Object.assign.bind():function(e){for(var t=1;t{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2m-9 3h2v2h-2zm0 3h2v2h-2zM8 8h2v2H8zm0 3h2v2H8zm-1 2H5v-2h2zm0-3H5V8h2zm9 7H8v-2h8zm0-4h-2v-2h2zm0-3h-2V8h2zm3 3h-2v-2h2zm0-3h-2V8h2z"}),"Keyboard")},4703:function(e,t,n){e.exports=function(){var e=e||function(e,t){var r;if("undefined"!==typeof window&&window.crypto&&(r=window.crypto),"undefined"!==typeof self&&self.crypto&&(r=self.crypto),"undefined"!==typeof globalThis&&globalThis.crypto&&(r=globalThis.crypto),!r&&"undefined"!==typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&"undefined"!==typeof n.g&&n.g.crypto&&(r=n.g.crypto),!r)try{r=n(477)}catch(m){}var o=function(){if(r){if("function"===typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(m){}if("function"===typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(m){}}throw new Error("Native crypto module could not be used to get secure random number.")},i=Object.create||function(){function e(){}return function(t){var n;return e.prototype=t,n=new e,e.prototype=null,n}}(),a={},s=a.lib={},l=s.Base={extend:function(e){var t=i(this);return e&&t.mixIn(e),t.hasOwnProperty("init")&&this.init!==t.init||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},c=s.WordArray=l.extend({init:function(e,n){e=this.words=e||[],this.sigBytes=n!=t?n:4*e.length},toString:function(e){return(e||d).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes,o=e.sigBytes;if(this.clamp(),r%4)for(var i=0;i>>2]>>>24-i%4*8&255;t[r+i>>>2]|=a<<24-(r+i)%4*8}else for(var s=0;s>>2]=n[s>>>2];return this.sigBytes+=o,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=l.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],n=0;n>>2]>>>24-o%4*8&255;r.push((i>>>4).toString(16)),r.push((15&i).toString(16))}return r.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new c.init(n,t/2)}},h=u.Latin1={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],o=0;o>>2]>>>24-o%4*8&255;r.push(String.fromCharCode(i))}return r.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new c.init(n,t)}},f=u.Utf8={stringify:function(e){try{return decodeURIComponent(escape(h.stringify(e)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(e){return h.parse(unescape(encodeURIComponent(e)))}},p=s.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n,r=this._data,o=r.words,i=r.sigBytes,a=this.blockSize,s=i/(4*a),l=(s=t?e.ceil(s):e.max((0|s)-this._minBufferSize,0))*a,u=e.min(4*l,i);if(l){for(var d=0;d>>5]>>>31-r%32&1}for(var o=this._subKeys=[],i=0;i<16;i++){var c=o[i]=[],u=l[i];for(n=0;n<24;n++)c[n/6|0]|=t[(s[n]-1+u)%28]<<31-n%6,c[4+(n/6|0)]|=t[28+(s[n+24]-1+u)%28]<<31-n%6;for(c[0]=c[0]<<1|c[0]>>>31,n=1;n<7;n++)c[n]=c[n]>>>4*(n-1)+3;c[7]=c[7]<<5|c[7]>>>27}var d=this._invSubKeys=[];for(n=0;n<16;n++)d[n]=o[15-n]},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._subKeys)},decryptBlock:function(e,t){this._doCryptBlock(e,t,this._invSubKeys)},_doCryptBlock:function(e,t,n){this._lBlock=e[t],this._rBlock=e[t+1],h.call(this,4,252645135),h.call(this,16,65535),f.call(this,2,858993459),f.call(this,8,16711935),h.call(this,1,1431655765);for(var r=0;r<16;r++){for(var o=n[r],i=this._lBlock,a=this._rBlock,s=0,l=0;l<8;l++)s|=c[l][((a^o[l])&u[l])>>>0];this._lBlock=a,this._rBlock=i^s}var d=this._lBlock;this._lBlock=this._rBlock,this._rBlock=d,h.call(this,1,1431655765),f.call(this,8,16711935),f.call(this,2,858993459),h.call(this,16,65535),h.call(this,4,252645135),e[t]=this._lBlock,e[t+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function h(e,t){var n=(this._lBlock>>>e^this._rBlock)&t;this._rBlock^=n,this._lBlock^=n<>>e^this._lBlock)&t;this._lBlock^=n,this._rBlock^=n<192.");var t=e.slice(0,2),n=e.length<4?e.slice(0,2):e.slice(2,4),o=e.length<6?e.slice(0,2):e.slice(4,6);this._des1=d.createEncryptor(r.create(t)),this._des2=d.createEncryptor(r.create(n)),this._des3=d.createEncryptor(r.create(o))},encryptBlock:function(e,t){this._des1.encryptBlock(e,t),this._des2.decryptBlock(e,t),this._des3.encryptBlock(e,t)},decryptBlock:function(e,t){this._des3.decryptBlock(e,t),this._des2.encryptBlock(e,t),this._des1.decryptBlock(e,t)},keySize:6,ivSize:2,blockSize:2});e.TripleDES=o._createHelper(p)}(),t.TripleDES)}()},4798:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7427),function(){var e=t,n=e.lib.WordArray,r=e.algo,o=r.SHA256,i=r.SHA224=o.extend({_doReset:function(){this._hash=new n.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var e=o._doFinalize.call(this);return e.sigBytes-=4,e}});e.SHA224=o._createHelper(i),e.HmacSHA224=o._createHmacHelper(i)}(),t.SHA224)}()},4804:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4z"}),"Refresh")},4814:e=>{var t=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,n=/\n/g,r=/^\s*/,o=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,a=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,s=/^[;\s]*/,l=/^\s+|\s+$/g,c="";function u(e){return e?e.replace(l,c):c}e.exports=function(e,l){if("string"!==typeof e)throw new TypeError("First argument must be a string");if(!e)return[];l=l||{};var d=1,h=1;function f(e){var t=e.match(n);t&&(d+=t.length);var r=e.lastIndexOf("\n");h=~r?e.length-r:h+e.length}function p(){var e={line:d,column:h};return function(t){return t.position=new g(e),y(),t}}function g(e){this.start=e,this.end={line:d,column:h},this.source=l.source}g.prototype.content=e;var m=[];function A(t){var n=new Error(l.source+":"+d+":"+h+": "+t);if(n.reason=t,n.filename=l.source,n.line=d,n.column=h,n.source=e,!l.silent)throw n;m.push(n)}function v(t){var n=t.exec(e);if(n){var r=n[0];return f(r),e=e.slice(r.length),n}}function y(){v(r)}function b(e){var t;for(e=e||[];t=x();)!1!==t&&e.push(t);return e}function x(){var t=p();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var n=2;c!=e.charAt(n)&&("*"!=e.charAt(n)||"/"!=e.charAt(n+1));)++n;if(n+=2,c===e.charAt(n-1))return A("End of comment missing");var r=e.slice(2,n-2);return h+=2,f(r),e=e.slice(n),h+=2,t({type:"comment",comment:r})}}function w(){var e=p(),n=v(o);if(n){if(x(),!v(i))return A("property missing ':'");var r=v(a),l=e({type:"declaration",property:u(n[0].replace(t,c)),value:r?u(r[0].replace(t,c)):c});return v(s),l}}return y(),function(){var e,t=[];for(b(t);e=w();)!1!==e&&(t.push(e),b(t));return t}()}},4867:(e,t,n)=>{"use strict";var r=n(5899);function o(e){for(var t=e.length;--t>=0;)e[t]=0}var i=256,a=286,s=30,l=15,c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],u=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],h=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],f=new Array(576);o(f);var p=new Array(60);o(p);var g=new Array(512);o(g);var m=new Array(256);o(m);var A=new Array(29);o(A);var v,y,b,x=new Array(s);function w(e,t,n,r,o){this.static_tree=e,this.extra_bits=t,this.extra_base=n,this.elems=r,this.max_length=o,this.has_stree=e&&e.length}function C(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function E(e){return e<256?g[e]:g[256+(e>>>7)]}function D(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function k(e,t,n){e.bi_valid>16-n?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=n-16):(e.bi_buf|=t<>>=1,n<<=1}while(--t>0);return n>>>1}function B(e,t,n){var r,o,i=new Array(16),a=0;for(r=1;r<=l;r++)i[r]=a=a+n[r-1]<<1;for(o=0;o<=t;o++){var s=e[2*o+1];0!==s&&(e[2*o]=S(i[s]++,s))}}function _(e){var t;for(t=0;t8?D(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function j(e,t,n,r){var o=2*t,i=2*n;return e[o]>1;n>=1;n--)T(e,i,n);o=c;do{n=e.heap[1],e.heap[1]=e.heap[e.heap_len--],T(e,i,1),r=e.heap[1],e.heap[--e.heap_max]=n,e.heap[--e.heap_max]=r,i[2*o]=i[2*n]+i[2*r],e.depth[o]=(e.depth[n]>=e.depth[r]?e.depth[n]:e.depth[r])+1,i[2*n+1]=i[2*r+1]=o,e.heap[1]=o++,T(e,i,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var n,r,o,i,a,s,c=t.dyn_tree,u=t.max_code,d=t.stat_desc.static_tree,h=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,p=t.stat_desc.extra_base,g=t.stat_desc.max_length,m=0;for(i=0;i<=l;i++)e.bl_count[i]=0;for(c[2*e.heap[e.heap_max]+1]=0,n=e.heap_max+1;n<573;n++)(i=c[2*c[2*(r=e.heap[n])+1]+1]+1)>g&&(i=g,m++),c[2*r+1]=i,r>u||(e.bl_count[i]++,a=0,r>=p&&(a=f[r-p]),s=c[2*r],e.opt_len+=s*(i+a),h&&(e.static_len+=s*(d[2*r+1]+a)));if(0!==m){do{for(i=g-1;0===e.bl_count[i];)i--;e.bl_count[i]--,e.bl_count[i+1]+=2,e.bl_count[g]--,m-=2}while(m>0);for(i=g;0!==i;i--)for(r=e.bl_count[i];0!==r;)(o=e.heap[--n])>u||(c[2*o+1]!==i&&(e.opt_len+=(i-c[2*o+1])*c[2*o],c[2*o+1]=i),r--)}}(e,t),B(i,u,e.bl_count)}function N(e,t,n){var r,o,i=-1,a=t[1],s=0,l=7,c=4;for(0===a&&(l=138,c=3),t[2*(n+1)+1]=65535,r=0;r<=n;r++)o=a,a=t[2*(r+1)+1],++s>=7;r0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,n=4093624447;for(t=0;t<=31;t++,n>>>=1)if(1&n&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t=3&&0===e.bl_tree[2*h[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),o=e.opt_len+3+7>>>3,(a=e.static_len+3+7>>>3)<=o&&(o=a)):o=a=n+5,n+4<=o&&-1!==t?O(e,t,n,r):4===e.strategy||a===o?(k(e,2+(r?1:0),3),R(e,f,p)):(k(e,4+(r?1:0),3),function(e,t,n,r){var o;for(k(e,t-257,5),k(e,n-1,5),k(e,r-4,4),o=0;o>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&n,e.last_lit++,0===t?e.dyn_ltree[2*n]++:(e.matches++,t--,e.dyn_ltree[2*(m[n]+i+1)]++,e.dyn_dtree[2*E(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){k(e,2,3),I(e,256,f),function(e){16===e.bi_valid?(D(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},4893:e=>{e.exports=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n},e.exports.__esModule=!0,e.exports.default=e.exports},4983:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z"}),"CheckCircle")},4994:e=>{e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},5003:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(3988),n(7766),n(7020),n(7755),function(){var e=t,n=e.lib.StreamCipher,r=e.algo,o=r.RC4=n.extend({_doReset:function(){for(var e=this._key,t=e.words,n=e.sigBytes,r=this._S=[],o=0;o<256;o++)r[o]=o;o=0;for(var i=0;o<256;o++){var a=o%n,s=t[a>>>2]>>>24-a%4*8&255;i=(i+r[o]+s)%256;var l=r[o];r[o]=r[i],r[i]=l}this._i=this._j=0},_doProcessBlock:function(e,t){e[t]^=i.call(this)},keySize:8,ivSize:0});function i(){for(var e=this._S,t=this._i,n=this._j,r=0,o=0;o<4;o++){n=(n+e[t=(t+1)%256])%256;var i=e[t];e[t]=e[n],e[n]=i,r|=e[(e[t]+e[n])%256]<<24-8*o}return this._i=t,this._j=n,r}e.RC4=n._createHelper(o);var a=r.RC4Drop=o.extend({cfg:o.cfg.extend({drop:192}),_doReset:function(){o._doReset.call(this);for(var e=this.cfg.drop;e>0;e--)i.call(this)}});e.RC4Drop=n._createHelper(a)}(),t.RC4)}()},5092:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6z"}),"KeyboardArrowLeft")},5281:(e,t,n)=>{"use strict";var r=n(5899),o=n(1875),i=n(6181),a=n(2903),s=n(8276),l=-2,c=12,u=30;function d(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function h(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new r.Buf32(852),t.distcode=t.distdyn=new r.Buf32(592),t.sane=1,t.back=-1,0):l}function p(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,f(e)):l}function g(e,t){var n,r;return e&&e.state?(r=e.state,t<0?(n=0,t=-t):(n=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?l:(null!==r.window&&r.wbits!==t&&(r.window=null),r.wrap=n,r.wbits=t,p(e))):l}function m(e,t){var n,r;return e?(r=new h,e.state=r,r.window=null,0!==(n=g(e,t))&&(e.state=null),n):l}var A,v,y=!0;function b(e){if(y){var t;for(A=new r.Buf32(512),v=new r.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(s(1,e.lens,0,288,A,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;s(2,e.lens,0,32,v,0,e.work,{bits:5}),y=!1}e.lencode=A,e.lenbits=9,e.distcode=v,e.distbits=5}function x(e,t,n,o){var i,a=e.state;return null===a.window&&(a.wsize=1<=a.wsize?(r.arraySet(a.window,t,n-a.wsize,a.wsize,0),a.wnext=0,a.whave=a.wsize):((i=a.wsize-a.wnext)>o&&(i=o),r.arraySet(a.window,t,n-o,i,a.wnext),(o-=i)?(r.arraySet(a.window,t,n-o,o,0),a.wnext=o,a.whave=a.wsize):(a.wnext+=i,a.wnext===a.wsize&&(a.wnext=0),a.whave>>8&255,n.check=i(n.check,P,2,0),v=0,y=0,n.mode=2;break}if(n.flags=0,n.head&&(n.head.done=!1),!(1&n.wrap)||(((255&v)<<8)+(v>>8))%31){e.msg="incorrect header check",n.mode=u;break}if(8!==(15&v)){e.msg="unknown compression method",n.mode=u;break}if(y-=4,T=8+(15&(v>>>=4)),0===n.wbits)n.wbits=T;else if(T>n.wbits){e.msg="invalid window size",n.mode=u;break}n.dmax=1<>8&1),512&n.flags&&(P[0]=255&v,P[1]=v>>>8&255,n.check=i(n.check,P,2,0)),v=0,y=0,n.mode=3;case 3:for(;y<32;){if(0===m)break e;m--,v+=h[p++]<>>8&255,P[2]=v>>>16&255,P[3]=v>>>24&255,n.check=i(n.check,P,4,0)),v=0,y=0,n.mode=4;case 4:for(;y<16;){if(0===m)break e;m--,v+=h[p++]<>8),512&n.flags&&(P[0]=255&v,P[1]=v>>>8&255,n.check=i(n.check,P,2,0)),v=0,y=0,n.mode=5;case 5:if(1024&n.flags){for(;y<16;){if(0===m)break e;m--,v+=h[p++]<>>8&255,n.check=i(n.check,P,2,0)),v=0,y=0}else n.head&&(n.head.extra=null);n.mode=6;case 6:if(1024&n.flags&&((E=n.length)>m&&(E=m),E&&(n.head&&(T=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Array(n.head.extra_len)),r.arraySet(n.head.extra,h,p,E,T)),512&n.flags&&(n.check=i(n.check,h,E,p)),m-=E,p+=E,n.length-=E),n.length))break e;n.length=0,n.mode=7;case 7:if(2048&n.flags){if(0===m)break e;E=0;do{T=h[p+E++],n.head&&T&&n.length<65536&&(n.head.name+=String.fromCharCode(T))}while(T&&E>9&1,n.head.done=!0),e.adler=n.check=0,n.mode=c;break;case 10:for(;y<32;){if(0===m)break e;m--,v+=h[p++]<>>=7&y,y-=7&y,n.mode=27;break}for(;y<3;){if(0===m)break e;m--,v+=h[p++]<>>=1)){case 0:n.mode=14;break;case 1:if(b(n),n.mode=20,6===t){v>>>=2,y-=2;break e}break;case 2:n.mode=17;break;case 3:e.msg="invalid block type",n.mode=u}v>>>=2,y-=2;break;case 14:for(v>>>=7&y,y-=7&y;y<32;){if(0===m)break e;m--,v+=h[p++]<>>16^65535)){e.msg="invalid stored block lengths",n.mode=u;break}if(n.length=65535&v,v=0,y=0,n.mode=15,6===t)break e;case 15:n.mode=16;case 16:if(E=n.length){if(E>m&&(E=m),E>A&&(E=A),0===E)break e;r.arraySet(f,h,p,E,g),m-=E,p+=E,A-=E,g+=E,n.length-=E;break}n.mode=c;break;case 17:for(;y<14;){if(0===m)break e;m--,v+=h[p++]<>>=5,y-=5,n.ndist=1+(31&v),v>>>=5,y-=5,n.ncode=4+(15&v),v>>>=4,y-=4,n.nlen>286||n.ndist>30){e.msg="too many length or distance symbols",n.mode=u;break}n.have=0,n.mode=18;case 18:for(;n.have>>=3,y-=3}for(;n.have<19;)n.lens[O[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,M={bits:n.lenbits},R=s(0,n.lens,0,19,n.lencode,0,n.work,M),n.lenbits=M.bits,R){e.msg="invalid code lengths set",n.mode=u;break}n.have=0,n.mode=19;case 19:for(;n.have>>16&255,B=65535&Q,!((I=Q>>>24)<=y);){if(0===m)break e;m--,v+=h[p++]<>>=I,y-=I,n.lens[n.have++]=B;else{if(16===B){for(N=I+2;y>>=I,y-=I,0===n.have){e.msg="invalid bit length repeat",n.mode=u;break}T=n.lens[n.have-1],E=3+(3&v),v>>>=2,y-=2}else if(17===B){for(N=I+3;y>>=I)),v>>>=3,y-=3}else{for(N=I+7;y>>=I)),v>>>=7,y-=7}if(n.have+E>n.nlen+n.ndist){e.msg="invalid bit length repeat",n.mode=u;break}for(;E--;)n.lens[n.have++]=T}}if(n.mode===u)break;if(0===n.lens[256]){e.msg="invalid code -- missing end-of-block",n.mode=u;break}if(n.lenbits=9,M={bits:n.lenbits},R=s(1,n.lens,0,n.nlen,n.lencode,0,n.work,M),n.lenbits=M.bits,R){e.msg="invalid literal/lengths set",n.mode=u;break}if(n.distbits=6,n.distcode=n.distdyn,M={bits:n.distbits},R=s(2,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,M),n.distbits=M.bits,R){e.msg="invalid distances set",n.mode=u;break}if(n.mode=20,6===t)break e;case 20:n.mode=21;case 21:if(m>=6&&A>=258){e.next_out=g,e.avail_out=A,e.next_in=p,e.avail_in=m,n.hold=v,n.bits=y,a(e,C),g=e.next_out,f=e.output,A=e.avail_out,p=e.next_in,h=e.input,m=e.avail_in,v=n.hold,y=n.bits,n.mode===c&&(n.back=-1);break}for(n.back=0;S=(Q=n.lencode[v&(1<>>16&255,B=65535&Q,!((I=Q>>>24)<=y);){if(0===m)break e;m--,v+=h[p++]<>_)])>>>16&255,B=65535&Q,!(_+(I=Q>>>24)<=y);){if(0===m)break e;m--,v+=h[p++]<>>=_,y-=_,n.back+=_}if(v>>>=I,y-=I,n.back+=I,n.length=B,0===S){n.mode=26;break}if(32&S){n.back=-1,n.mode=c;break}if(64&S){e.msg="invalid literal/length code",n.mode=u;break}n.extra=15&S,n.mode=22;case 22:if(n.extra){for(N=n.extra;y>>=n.extra,y-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;S=(Q=n.distcode[v&(1<>>16&255,B=65535&Q,!((I=Q>>>24)<=y);){if(0===m)break e;m--,v+=h[p++]<>_)])>>>16&255,B=65535&Q,!(_+(I=Q>>>24)<=y);){if(0===m)break e;m--,v+=h[p++]<>>=_,y-=_,n.back+=_}if(v>>>=I,y-=I,n.back+=I,64&S){e.msg="invalid distance code",n.mode=u;break}n.offset=B,n.extra=15&S,n.mode=24;case 24:if(n.extra){for(N=n.extra;y>>=n.extra,y-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){e.msg="invalid distance too far back",n.mode=u;break}n.mode=25;case 25:if(0===A)break e;if(E=C-A,n.offset>E){if((E=n.offset-E)>n.whave&&n.sane){e.msg="invalid distance too far back",n.mode=u;break}E>n.wnext?(E-=n.wnext,D=n.wsize-E):D=n.wnext-E,E>n.length&&(E=n.length),k=n.window}else k=f,D=g-n.offset,E=n.length;E>A&&(E=A),A-=E,n.length-=E;do{f[g++]=k[D++]}while(--E);0===n.length&&(n.mode=21);break;case 26:if(0===A)break e;f[g++]=n.length,A--,n.mode=21;break;case 27:if(n.wrap){for(;y<32;){if(0===m)break e;m--,v|=h[p++]<{"use strict";t.A=void 0;var r=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=i(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=o?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(r,a,s):r[a]=e[a]}return r.default=e,n&&n.set(e,r),r}(n(9950)),o=n(116);function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(i=function(e){return e?n:t})(e)}t.A=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;const t=r.useContext(o.ThemeContext);return t&&(n=t,0!==Object.keys(n).length)?t:e;var n}},5340:(e,t,n)=>{"use strict";e.exports=n(9487)},5355:e=>{"use strict";e.exports=function e(t,n){if(t===n)return!0;if(t&&n&&"object"==typeof t&&"object"==typeof n){if(t.constructor!==n.constructor)return!1;var r,o,i;if(Array.isArray(t)){if((r=t.length)!=n.length)return!1;for(o=r;0!==o--;)if(!e(t[o],n[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if((r=(i=Object.keys(t)).length)!==Object.keys(n).length)return!1;for(o=r;0!==o--;)if(!Object.prototype.hasOwnProperty.call(n,i[o]))return!1;for(o=r;0!==o--;){var a=i[o];if(!e(t[a],n[a]))return!1}return!0}return t!==t&&n!==n}},5361:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>u,p0:()=>s});var r=n(8587),o=n(8168);const i=["duration","easing","delay"],a={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},s={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function l(e){return"".concat(Math.round(e),"ms")}function c(e){if(!e)return 0;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}function u(e){const t=(0,o.A)({},a,e.easing),n=(0,o.A)({},s,e.duration);return(0,o.A)({getAutoHeightDuration:c,create:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["all"],o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{duration:a=n.standard,easing:s=t.easeInOut,delay:c=0}=o;(0,r.A)(o,i);return(Array.isArray(e)?e:[e]).map((e=>"".concat(e," ").concat("string"===typeof a?a:l(a)," ").concat(s," ").concat("string"===typeof c?c:l(c)))).join(",")}},e,{easing:t,duration:n})}},5391:e=>{e.exports=function(e){if("string"!==typeof e)return!1;var o=e.match(t);if(!o)return!1;var i=o[1];if(!i)return!1;if(n.test(i)||r.test(i))return!0;return!1};var t=/^(?:\w+:)?\/\/(\S+)$/,n=/^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/,r=/^[^\s\.]+\.\S{2,}$/},5393:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(9950),o=n(5587);function i(){for(var e=arguments.length,t=new Array(e),n=0;nt.every((e=>null==e))?null:e=>{t.forEach((t=>{(0,o.A)(t,e)}))}),t)}},5425:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7427),n(9787),function(){var e=t,n=e.lib,r=n.Base,o=n.WordArray,i=e.algo,a=i.SHA256,s=i.HMAC,l=i.PBKDF2=r.extend({cfg:r.extend({keySize:4,hasher:a,iterations:25e4}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n=this.cfg,r=s.create(n.hasher,e),i=o.create(),a=o.create([1]),l=i.words,c=a.words,u=n.keySize,d=n.iterations;l.length{"use strict";n.d(t,{A:()=>o});var r=n(8099);function o(e){if("string"!==typeof e)throw new Error((0,r.A)(7));return e.charAt(0).toUpperCase()+e.slice(1)}},5511:(e,t,n)=>{"use strict";function r(){for(var e=arguments.length,t=new Array(e),n=0;nnull==t?e:function(){for(var n=arguments.length,r=new Array(n),o=0;o{}))}n.d(t,{A:()=>r})},5537:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8168);function o(e,t){const n=(0,r.A)({},t);return Object.keys(e).forEach((i=>{if(i.toString().match(/^(components|slots)$/))n[i]=(0,r.A)({},e[i],n[i]);else if(i.toString().match(/^(componentsProps|slotProps)$/)){const a=e[i]||{},s=t[i];n[i]={},s&&Object.keys(s)?a&&Object.keys(a)?(n[i]=(0,r.A)({},s),Object.keys(a).forEach((e=>{n[i][e]=o(a[e],s[e])}))):n[i]=s:n[i]=a}else void 0===n[i]&&(n[i]=e[i])})),n}},5546:e=>{e.exports=function(e){return!(!e||"string"===typeof e)&&(e instanceof Array||Array.isArray(e)||e.length>=0&&(e.splice instanceof Function||Object.getOwnPropertyDescriptor(e,e.length-1)&&"String"!==e.constructor.name))}},5587:(e,t,n)=>{"use strict";function r(e,t){"function"===typeof e?e(t):e&&(e.current=t)}n.d(t,{A:()=>r})},5683:function(e,t,n){var r,o,i;o=[],void 0===(i="function"===typeof(r=function(){function e(e){var t="",n="",r=0,o=e();return function(e){for(;r"===r[0]&&(n(),e=!1):"<"!==r[0]||t(r[1])&&"/"!==r[1]||(e=!0),e}}function o(e){var n=!1;return function(r,o){return n?!t(o[0])&&t(o[1])&&(r(),n=!1):t(o[0])||o[1]!==e||(n=!0),n}}function i(e,n){return function(){var r="",o="";function i(){r+=o,o=""}function a(e){return r="",o="",e}return function(s,l){o+=s;var c=e.reduce((function(e,t){return e||t(i,[s,l])}),!1);if(!c&&(t(s)&&!t(l)&&i(),!t(s)&&t(l))){if(o.length>=n)return a([r,o]);i()}if(""===l)return(o.length{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings")},5865:(e,t,n)=>{"use strict";n.r(t),n.d(t,{capitalize:()=>o.A,createChainedFunction:()=>i.A,createSvgIcon:()=>a.A,debounce:()=>s.A,deprecatedPropType:()=>l,isMuiElement:()=>c.A,ownerDocument:()=>u.A,ownerWindow:()=>d.A,requirePropFactory:()=>h,setRef:()=>f,unstable_ClassNameGenerator:()=>x,unstable_useEnhancedEffect:()=>p.A,unstable_useId:()=>g.A,unsupportedProp:()=>m,useControlled:()=>A.A,useEventCallback:()=>v.A,useForkRef:()=>y.A,useIsFocusVisible:()=>b.A});var r=n(4501),o=n(1676),i=n(5920),a=n(3235),s=n(1209);const l=function(e,t){return()=>null};var c=n(3828),u=n(7402),d=n(827);n(8168);const h=function(e,t){return()=>null};const f=n(5587).A;var p=n(9044),g=n(1014);const m=function(e,t,n,r,o){return null};var A=n(8733),v=n(1976),y=n(1506),b=n(1573);const x={configure:e=>{r.A.configure(e)}}},5867:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)([(0,i.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"},"0"),(0,i.jsx)("path",{d:"M12 10h-2v2H9v-2H7V9h2V7h1v2h2z"},"1")],"ZoomIn")},5879:e=>{var t="(".charCodeAt(0),n=")".charCodeAt(0),r="'".charCodeAt(0),o='"'.charCodeAt(0),i="\\".charCodeAt(0),a="/".charCodeAt(0),s=",".charCodeAt(0),l=":".charCodeAt(0),c="*".charCodeAt(0),u="u".charCodeAt(0),d="U".charCodeAt(0),h="+".charCodeAt(0),f=/^[a-f0-9?-]+$/i;e.exports=function(e){for(var p,g,m,A,v,y,b,x,w,C=[],E=e,D=0,k=E.charCodeAt(D),I=E.length,S=[{nodes:C}],B=0,_="",F="",j="";D{"use strict";var n="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Int32Array;function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var n=t.shift();if(n){if("object"!==typeof n)throw new TypeError(n+"must be non-object");for(var o in n)r(n,o)&&(e[o]=n[o])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var o={arraySet:function(e,t,n,r,o){if(t.subarray&&e.subarray)e.set(t.subarray(n,n+r),o);else for(var i=0;i{"use strict";n.d(t,{A:()=>r});const r=n(5511).A},6008:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.pad.Iso97971={pad:function(e,n){e.concat(t.lib.WordArray.create([2147483648],1)),t.pad.ZeroPadding.pad(e,n)},unpad:function(e){t.pad.ZeroPadding.unpad(e),e.sigBytes--}},t.pad.Iso97971)}()},6122:(e,t,n)=>{"use strict";var r=n(5546),o=Array.prototype.concat,i=Array.prototype.slice,a=e.exports=function(e){for(var t=[],n=0,a=e.length;n{e.exports=n(7760).BrotliDecompressBuffer},6171:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,b:()=>s});var r=n(9950),o=n(5537),i=n(4414);const a=r.createContext(void 0);function s(e){let{props:t,name:n}=e;return function(e){const{theme:t,name:n,props:r}=e;if(!t||!t.components||!t.components[n])return r;const i=t.components[n];return i.defaultProps?(0,o.A)(i.defaultProps,r):i.styleOverrides||i.variants?r:(0,o.A)(i,r)}({props:t,name:n,theme:{components:r.useContext(a)}})}const l=function(e){let{value:t,children:n}=e;return(0,i.jsx)(a.Provider,{value:t,children:n})}},6181:e=>{"use strict";var t=function(){for(var e,t=[],n=0;n<256;n++){e=n;for(var r=0;r<8;r++)e=1&e?3988292384^e>>>1:e>>>1;t[n]=e}return t}();e.exports=function(e,n,r,o){var i=t,a=o+r;e^=-1;for(var s=o;s>>8^i[255&(e^n[s])];return~e}},6206:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7483);const o=function(e,t){return t?(0,r.A)(e,t,{clone:!1}):e}},6223:e=>{e.exports=function(e){var o=[];return e.replace(n,(function(e,n,i){var a=n.toLowerCase();for(i=function(e){var t=e.match(r);return t?t.map(Number):[]}(i),"m"==a&&i.length>2&&(o.push([n].concat(i.splice(0,2))),a="l",n="m"==n?"l":"L");;){if(i.length==t[a])return i.unshift(n),o.push(i);if(i.length>>24)|4278255360&(o<<24|o>>>8)}var i,h,y,b,x,w,C,E,D,k,I,S=this._hash.words,B=u.words,_=d.words,F=a.words,j=s.words,T=l.words,R=c.words;for(w=i=S[0],C=h=S[1],E=y=S[2],D=b=S[3],k=x=S[4],n=0;n<80;n+=1)I=i+e[t+F[n]]|0,I+=n<16?f(h,y,b)+B[0]:n<32?p(h,y,b)+B[1]:n<48?g(h,y,b)+B[2]:n<64?m(h,y,b)+B[3]:A(h,y,b)+B[4],I=(I=v(I|=0,T[n]))+x|0,i=x,x=b,b=v(y,10),y=h,h=I,I=w+e[t+j[n]]|0,I+=n<16?A(C,E,D)+_[0]:n<32?m(C,E,D)+_[1]:n<48?g(C,E,D)+_[2]:n<64?p(C,E,D)+_[3]:f(C,E,D)+_[4],I=(I=v(I|=0,R[n]))+k|0,w=k,k=D,D=v(E,10),E=C,C=I;I=S[1]+y+D|0,S[1]=S[2]+b+k|0,S[2]=S[3]+x+w|0,S[3]=S[4]+i+C|0,S[4]=S[0]+h+E|0,S[0]=I},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;t[r>>>5]|=128<<24-r%32,t[14+(r+64>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e.sigBytes=4*(t.length+1),this._process();for(var o=this._hash,i=o.words,a=0;a<5;a++){var s=i[a];i[a]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return o},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});function f(e,t,n){return e^t^n}function p(e,t,n){return e&t|~e&n}function g(e,t,n){return(e|~t)^n}function m(e,t,n){return e&n|t&~n}function A(e,t,n){return e^(t|~n)}function v(e,t){return e<>>32-t}e.RIPEMD160=o._createHelper(h),e.HmacRIPEMD160=o._createHmacHelper(h)}(Math),t.RIPEMD160)}()},6319:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close")},6340:(e,t,n)=>{var r=n(2958),o=n(6122),i=Object.hasOwnProperty,a=Object.create(null);for(var s in r)i.call(r,s)&&(a[r[s]]=s);var l=e.exports={to:{},get:{}};function c(e,t,n){return Math.min(Math.max(t,e),n)}function u(e){var t=Math.round(e).toString(16).toUpperCase();return t.length<2?"0"+t:t}l.get=function(e){var t,n;switch(e.substring(0,3).toLowerCase()){case"hsl":t=l.get.hsl(e),n="hsl";break;case"hwb":t=l.get.hwb(e),n="hwb";break;default:t=l.get.rgb(e),n="rgb"}return t?{model:n,value:t}:null},l.get.rgb=function(e){if(!e)return null;var t,n,o,a=[0,0,0,1];if(t=e.match(/^#([a-f0-9]{6})([a-f0-9]{2})?$/i)){for(o=t[2],t=t[1],n=0;n<3;n++){var s=2*n;a[n]=parseInt(t.slice(s,s+2),16)}o&&(a[3]=parseInt(o,16)/255)}else if(t=e.match(/^#([a-f0-9]{3,4})$/i)){for(o=(t=t[1])[3],n=0;n<3;n++)a[n]=parseInt(t[n]+t[n],16);o&&(a[3]=parseInt(o+o,16)/255)}else if(t=e.match(/^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/)){for(n=0;n<3;n++)a[n]=parseInt(t[n+1],0);t[4]&&(t[5]?a[3]=.01*parseFloat(t[4]):a[3]=parseFloat(t[4]))}else{if(!(t=e.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/)))return(t=e.match(/^(\w+)$/))?"transparent"===t[1]?[0,0,0,0]:i.call(r,t[1])?((a=r[t[1]])[3]=1,a):null:null;for(n=0;n<3;n++)a[n]=Math.round(2.55*parseFloat(t[n+1]));t[4]&&(t[5]?a[3]=.01*parseFloat(t[4]):a[3]=parseFloat(t[4]))}for(n=0;n<3;n++)a[n]=c(a[n],0,255);return a[3]=c(a[3],0,1),a},l.get.hsl=function(e){if(!e)return null;var t=e.match(/^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/);if(t){var n=parseFloat(t[4]);return[(parseFloat(t[1])%360+360)%360,c(parseFloat(t[2]),0,100),c(parseFloat(t[3]),0,100),c(isNaN(n)?1:n,0,1)]}return null},l.get.hwb=function(e){if(!e)return null;var t=e.match(/^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/);if(t){var n=parseFloat(t[4]);return[(parseFloat(t[1])%360+360)%360,c(parseFloat(t[2]),0,100),c(parseFloat(t[3]),0,100),c(isNaN(n)?1:n,0,1)]}return null},l.to.hex=function(){var e=o(arguments);return"#"+u(e[0])+u(e[1])+u(e[2])+(e[3]<1?u(Math.round(255*e[3])):"")},l.to.rgb=function(){var e=o(arguments);return e.length<4||1===e[3]?"rgb("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+")":"rgba("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+", "+e[3]+")"},l.to.rgb.percent=function(){var e=o(arguments),t=Math.round(e[0]/255*100),n=Math.round(e[1]/255*100),r=Math.round(e[2]/255*100);return e.length<4||1===e[3]?"rgb("+t+"%, "+n+"%, "+r+"%)":"rgba("+t+"%, "+n+"%, "+r+"%, "+e[3]+")"},l.to.hsl=function(){var e=o(arguments);return e.length<4||1===e[3]?"hsl("+e[0]+", "+e[1]+"%, "+e[2]+"%)":"hsla("+e[0]+", "+e[1]+"%, "+e[2]+"%, "+e[3]+")"},l.to.hwb=function(){var e=o(arguments),t="";return e.length>=4&&1!==e[3]&&(t=", "+e[3]),"hwb("+e[0]+", "+e[1]+"%, "+e[2]+"%"+t+")"},l.to.keyword=function(e){return a[e.slice(0,3)]}},6350:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5"}),"PanTool")},6456:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8z"}),"ArrowDownward")},6470:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,o){for(var i,a,s=function(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{"use strict";var r;n.d(t,{i:()=>s,s:()=>a});var o=n(9950),i=!!(r||(r=n.t(o,2))).useInsertionEffect&&(r||(r=n.t(o,2))).useInsertionEffect,a=i||function(e){return e()},s=i||o.useLayoutEffect},6523:(e,t,n)=>{var r=n(9092);e.exports=function(e,t){var n={};return Object.keys(e).forEach((function(o){r.parse(o).match(t)&&Object.assign(n,e[o])})),n}},6534:e=>{const t=18===new Uint8Array(new Uint32Array([305419896]).buffer)[0],n=(e,t,n)=>{let r=e[t];e[t]=e[n],e[n]=r};e.exports={swap32LE:e=>{t&&(e=>{const t=e.length;for(let r=0;r{"use strict";e.exports=n(759)},6676:(e,t)=>{"use strict";t.byteLength=function(e){var t=s(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,i=s(e),a=i[0],l=i[1],c=new o(function(e,t,n){return 3*(t+n)/4-n}(0,a,l)),u=0,d=l>0?a-4:a;for(n=0;n>16&255,c[u++]=t>>8&255,c[u++]=255&t;2===l&&(t=r[e.charCodeAt(n)]<<2|r[e.charCodeAt(n+1)]>>4,c[u++]=255&t);1===l&&(t=r[e.charCodeAt(n)]<<10|r[e.charCodeAt(n+1)]<<4|r[e.charCodeAt(n+2)]>>2,c[u++]=t>>8&255,c[u++]=255&t);return c},t.fromByteArray=function(e){for(var t,r=e.length,o=r%3,i=[],a=16383,s=0,c=r-o;sc?c:s+a));1===o?(t=e[r-1],i.push(n[t>>2]+n[t<<4&63]+"==")):2===o&&(t=(e[r-2]<<8)+e[r-1],i.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return i.join("")};for(var n=[],r=[],o="undefined"!==typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0;a<64;++a)n[a]=i[a],r[i.charCodeAt(a)]=a;function s(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,r){for(var o,i,a=[],s=t;s>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return a.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},6702:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M7 14H5v5h5v-2H7zm-2-4h2V7h3V5H5zm12 7h-3v2h5v-5h-2zM14 5v2h3v3h2V5z"}),"Fullscreen")},6722:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(3988),n(7766),n(7020),n(7755),function(){var e=t,n=e.lib.BlockCipher,r=e.algo;const o=16,i=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],a=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]];var s={pbox:[],sbox:[]};function l(e,t){let n=t>>24&255,r=t>>16&255,o=t>>8&255,i=255&t,a=e.sbox[0][n]+e.sbox[1][r];return a^=e.sbox[2][o],a+=e.sbox[3][i],a}function c(e,t,n){let r,i=t,a=n;for(let s=0;s1;--s)i^=e.pbox[s],a=l(e,i)^a,r=i,i=a,a=r;return r=i,i=a,a=r,a^=e.pbox[1],i^=e.pbox[0],{left:i,right:a}}function d(e,t,n){for(let o=0;o<4;o++){e.sbox[o]=[];for(let t=0;t<256;t++)e.sbox[o][t]=a[o][t]}let r=0;for(let a=0;a=n&&(r=0);let s=0,l=0,u=0;for(let i=0;i{"use strict";n.d(t,{A:()=>r});const r=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MIN_SAFE_INTEGER,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.MAX_SAFE_INTEGER;return Math.max(t,Math.min(e,n))}},6810:function(e,t,n){!function(){var t;e.exports=(t=n(4703),function(){if("function"==typeof ArrayBuffer){var e=t.lib.WordArray,n=e.init,r=e.init=function(e){if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),(e instanceof Int8Array||"undefined"!==typeof Uint8ClampedArray&&e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array)&&(e=new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),e instanceof Uint8Array){for(var t=e.byteLength,r=[],o=0;o>>2]|=e[o]<<24-o%4*8;n.call(this,r,t)}else n.apply(this,arguments)};r.prototype=e}}(),t.lib.WordArray)}()},6864:e=>{"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},6874:(e,t,n)=>{var r=n(1596),o=n(8981).EventEmitter;function i(e){if(!(this instanceof i))return new i(e);o.call(this),e=e||{},this.concurrency=e.concurrency||1/0,this.timeout=e.timeout||0,this.autostart=e.autostart||!1,this.results=e.results||null,this.pending=0,this.session=0,this.running=!1,this.jobs=[],this.timers={}}e.exports=i,e.exports.default=i,r(i,o);["pop","shift","indexOf","lastIndexOf"].forEach((function(e){i.prototype[e]=function(){return Array.prototype[e].apply(this.jobs,arguments)}})),i.prototype.slice=function(e,t){return this.jobs=this.jobs.slice(e,t),this},i.prototype.reverse=function(){return this.jobs.reverse(),this};function a(){for(var e in this.timers){var t=this.timers[e];delete this.timers[e],clearTimeout(t)}}function s(e){var t=this;function n(e){t.end(e)}this.on("error",n),this.on("end",(function r(o){t.removeListener("error",n),t.removeListener("end",r),e(o,this.results)}))}function l(e){this.session++,this.running=!1,this.emit("end",e)}["push","unshift","splice"].forEach((function(e){i.prototype[e]=function(){var t=Array.prototype[e].apply(this.jobs,arguments);return this.autostart&&this.start(),t}})),Object.defineProperty(i.prototype,"length",{get:function(){return this.pending+this.jobs.length}}),i.prototype.start=function(e){if(e&&s.call(this,e),this.running=!0,!(this.pending>=this.concurrency))if(0!==this.jobs.length){var t=this,n=this.jobs.shift(),r=!0,o=this.session,i=null,a=!1,c=null,u=n.hasOwnProperty("timeout")?n.timeout:this.timeout;u&&(i=setTimeout((function(){a=!0,t.listeners("timeout").length>0?t.emit("timeout",h,n):h()}),u),this.timers[i]=i),this.results&&(c=this.results.length,this.results[c]=null),this.pending++,t.emit("start",n);var d=n(h);d&&d.then&&"function"===typeof d.then&&d.then((function(e){return h(null,e)})).catch((function(e){return h(e||!0)})),this.running&&this.jobs.length>0&&this.start()}else 0===this.pending&&l.call(this);function h(e,s){r&&t.session===o&&(r=!1,t.pending--,null!==i&&(delete t.timers[i],clearTimeout(i)),e?t.emit("error",e,n):!1===a&&(null!==c&&(t.results[c]=Array.prototype.slice.call(arguments,1)),t.emit("success",s,n)),t.session===o&&(0===t.pending&&0===t.jobs.length?l.call(t):t.running&&t.start()))}},i.prototype.stop=function(){this.running=!1},i.prototype.end=function(e){a.call(this),this.jobs.length=0,this.pending=0,l.call(this,e)}},6879:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler");Symbol.for("react.provider");var s=Symbol.for("react.consumer"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.for("react.view_transition"),g=Symbol.for("react.client.reference");function m(e){if("object"===typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case o:case a:case i:case u:case d:case p:return e;default:switch(e=e&&e.$$typeof){case l:case c:case f:case h:case s:return e;default:return t}}case r:return t}}}t.vM=c,t.lD=h},6883:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(4654),n(4290),function(){var e=t,n=e.x64,r=n.Word,o=n.WordArray,i=e.algo,a=i.SHA512,s=i.SHA384=a.extend({_doReset:function(){this._hash=new o.init([new r.init(3418070365,3238371032),new r.init(1654270250,914150663),new r.init(2438529370,812702999),new r.init(355462360,4144912697),new r.init(1731405415,4290775857),new r.init(2394180231,1750603025),new r.init(3675008525,1694076839),new r.init(1203062813,3204075428)])},_doFinalize:function(){var e=a._doFinalize.call(this);return e.sigBytes-=16,e}});e.SHA384=a._createHelper(s),e.HmacSHA384=a._createHmacHelper(s)}(),t.SHA384)}()},6907:(e,t,n)=>{"use strict";function r(e){return e&&e.ownerDocument||document}n.d(t,{A:()=>r})},6910:(e,t,n)=>{"use strict";n.d(t,{A:()=>kt});var r={};function o(e,t){return function(){return e.apply(t,arguments)}}n.r(r),n.d(r,{hasBrowserEnv:()=>se,hasStandardBrowserEnv:()=>ce,hasStandardBrowserWebWorkerEnv:()=>ue,navigator:()=>le,origin:()=>de});const{toString:i}=Object.prototype,{getPrototypeOf:a}=Object,s=(l=Object.create(null),e=>{const t=i.call(e);return l[t]||(l[t]=t.slice(8,-1).toLowerCase())});var l;const c=e=>(e=e.toLowerCase(),t=>s(t)===e),u=e=>t=>typeof t===e,{isArray:d}=Array,h=u("undefined");const f=c("ArrayBuffer");const p=u("string"),g=u("function"),m=u("number"),A=e=>null!==e&&"object"===typeof e,v=e=>{if("object"!==s(e))return!1;const t=a(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},y=c("Date"),b=c("File"),x=c("Blob"),w=c("FileList"),C=c("URLSearchParams"),[E,D,k,I]=["ReadableStream","Request","Response","Headers"].map(c);function S(e,t){let n,r,{allOwnKeys:o=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),d(e))for(n=0,r=e.length;n0;)if(r=n[o],t===r.toLowerCase())return r;return null}const _="undefined"!==typeof globalThis?globalThis:"undefined"!==typeof self?self:"undefined"!==typeof window?window:global,F=e=>!h(e)&&e!==_;const j=(T="undefined"!==typeof Uint8Array&&a(Uint8Array),e=>T&&e instanceof T);var T;const R=c("HTMLFormElement"),M=(e=>{let{hasOwnProperty:t}=e;return(e,n)=>t.call(e,n)})(Object.prototype),N=c("RegExp"),Q=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};S(n,((n,o)=>{let i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)};const P=c("AsyncFunction"),O=((e,t)=>{return e?setImmediate:t?(n="axios@".concat(Math.random()),r=[],_.addEventListener("message",(e=>{let{source:t,data:o}=e;t===_&&o===n&&r.length&&r.shift()()}),!1),e=>{r.push(e),_.postMessage(n,"*")}):e=>setTimeout(e);var n,r})("function"===typeof setImmediate,g(_.postMessage)),L="undefined"!==typeof queueMicrotask?queueMicrotask.bind(_):"undefined"!==typeof process&&process.nextTick||O,z={isArray:d,isArrayBuffer:f,isBuffer:function(e){return null!==e&&!h(e)&&null!==e.constructor&&!h(e.constructor)&&g(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"===typeof FormData&&e instanceof FormData||g(e.append)&&("formdata"===(t=s(e))||"object"===t&&g(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&f(e.buffer),t},isString:p,isNumber:m,isBoolean:e=>!0===e||!1===e,isObject:A,isPlainObject:v,isReadableStream:E,isRequest:D,isResponse:k,isHeaders:I,isUndefined:h,isDate:y,isFile:b,isBlob:x,isRegExp:N,isFunction:g,isStream:e=>A(e)&&g(e.pipe),isURLSearchParams:C,isTypedArray:j,isFileList:w,forEach:S,merge:function e(){const{caseless:t}=F(this)&&this||{},n={},r=(r,o)=>{const i=t&&B(n,o)||o;v(n[i])&&v(r)?n[i]=e(n[i],r):v(r)?n[i]=e({},r):d(r)?n[i]=r.slice():n[i]=r};for(let o=0,i=arguments.length;o3&&void 0!==arguments[3]?arguments[3]:{};return S(t,((t,r)=>{n&&g(t)?e[r]=o(t,n):e[r]=t}),{allOwnKeys:r}),e},trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,i,s;const l={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),i=o.length;i-- >0;)s=o[i],r&&!r(s,e,t)||l[s]||(t[s]=e[s],l[s]=!0);e=!1!==n&&a(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:c,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(d(e))return e;let t=e.length;if(!m(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:R,hasOwnProperty:M,hasOwnProp:M,reduceDescriptors:Q,freezeMethods:e=>{Q(e,((t,n)=>{if(g(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];g(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return d(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:B,global:_,isContextDefined:F,isSpecCompliantForm:function(e){return!!(e&&g(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(A(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=d(e)?[]:{};return S(e,((e,t)=>{const i=n(e,r+1);!h(i)&&(o[t]=i)})),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:P,isThenable:e=>e&&(A(e)||g(e))&&g(e.then)&&g(e.catch),setImmediate:O,asap:L};function U(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}z.inherits(U,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:z.toJSONObject(this.config),code:this.code,status:this.status}}});const H=U.prototype,W={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{W[e]={value:e}})),Object.defineProperties(U,W),Object.defineProperty(H,"isAxiosError",{value:!0}),U.from=(e,t,n,r,o,i)=>{const a=Object.create(H);return z.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),U.call(a,e.message,t,n,r,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};const G=U;function V(e){return z.isPlainObject(e)||z.isArray(e)}function K(e){return z.endsWith(e,"[]")?e.slice(0,-2):e}function Y(e,t,n){return e?e.concat(t).map((function(e,t){return e=K(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const q=z.toFlatObject(z,{},null,(function(e){return/^is[A-Z]/.test(e)}));const J=function(e,t,n){if(!z.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=z.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!z.isUndefined(t[e])}))).metaTokens,o=n.visitor||c,i=n.dots,a=n.indexes,s=(n.Blob||"undefined"!==typeof Blob&&Blob)&&z.isSpecCompliantForm(t);if(!z.isFunction(o))throw new TypeError("visitor must be a function");function l(e){if(null===e)return"";if(z.isDate(e))return e.toISOString();if(!s&&z.isBlob(e))throw new G("Blob is not supported. Use a Buffer instead.");return z.isArrayBuffer(e)||z.isTypedArray(e)?s&&"function"===typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,n,o){let s=e;if(e&&!o&&"object"===typeof e)if(z.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(z.isArray(e)&&function(e){return z.isArray(e)&&!e.some(V)}(e)||(z.isFileList(e)||z.endsWith(n,"[]"))&&(s=z.toArray(e)))return n=K(n),s.forEach((function(e,r){!z.isUndefined(e)&&null!==e&&t.append(!0===a?Y([n],r,i):null===a?n:n+"[]",l(e))})),!1;return!!V(e)||(t.append(Y(o,n,i),l(e)),!1)}const u=[],d=Object.assign(q,{defaultVisitor:c,convertValue:l,isVisitable:V});if(!z.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!z.isUndefined(n)){if(-1!==u.indexOf(n))throw Error("Circular reference detected in "+r.join("."));u.push(n),z.forEach(n,(function(n,i){!0===(!(z.isUndefined(n)||null===n)&&o.call(t,n,z.isString(i)?i.trim():i,r,d))&&e(n,r?r.concat(i):[i])})),u.pop()}}(e),t};function X(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Z(e,t){this._pairs=[],e&&J(e,this,t)}const $=Z.prototype;$.append=function(e,t){this._pairs.push([e,t])},$.toString=function(e){const t=e?function(t){return e.call(this,t,X)}:X;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const ee=Z;function te(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function ne(e,t,n){if(!t)return e;const r=n&&n.encode||te;z.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let i;if(i=o?o(t,n):z.isURLSearchParams(t)?t.toString():new ee(t,n).toString(r),i){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}const re=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){z.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},oe={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1};var ie=n(9379);const ae={isBrowser:!0,classes:{URLSearchParams:"undefined"!==typeof URLSearchParams?URLSearchParams:ee,FormData:"undefined"!==typeof FormData?FormData:null,Blob:"undefined"!==typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},se="undefined"!==typeof window&&"undefined"!==typeof document,le="object"===typeof navigator&&navigator||void 0,ce=se&&(!le||["ReactNative","NativeScript","NS"].indexOf(le.product)<0),ue="undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"===typeof self.importScripts,de=se&&window.location.href||"http://localhost",he=(0,ie.A)((0,ie.A)({},r),ae);const fe=function(e){function t(e,n,r,o){let i=e[o++];if("__proto__"===i)return!0;const a=Number.isFinite(+i),s=o>=e.length;if(i=!i&&z.isArray(r)?r.length:i,s)return z.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!a;r[i]&&z.isObject(r[i])||(r[i]=[]);return t(e,n,r[i],o)&&z.isArray(r[i])&&(r[i]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let i;for(r=0;r{t(function(e){return z.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null};const pe={transitional:oe,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=z.isObject(e);o&&z.isHTMLForm(e)&&(e=new FormData(e));if(z.isFormData(e))return r?JSON.stringify(fe(e)):e;if(z.isArrayBuffer(e)||z.isBuffer(e)||z.isStream(e)||z.isFile(e)||z.isBlob(e)||z.isReadableStream(e))return e;if(z.isArrayBufferView(e))return e.buffer;if(z.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let i;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return J(e,new he.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return he.isNode&&z.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((i=z.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return J(i?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(z.isString(e))try{return(t||JSON.parse)(e),z.trim(e)}catch(r){if("SyntaxError"!==r.name)throw r}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||pe.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(z.isResponse(e)||z.isReadableStream(e))return e;if(e&&z.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(o){if(n){if("SyntaxError"===o.name)throw G.from(o,G.ERR_BAD_RESPONSE,this,null,this.response);throw o}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:he.classes.FormData,Blob:he.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};z.forEach(["delete","get","head","post","put","patch"],(e=>{pe.headers[e]={}}));const ge=pe,me=z.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Ae=Symbol("internals");function ve(e){return e&&String(e).trim().toLowerCase()}function ye(e){return!1===e||null==e?e:z.isArray(e)?e.map(ye):String(e)}function be(e,t,n,r,o){return z.isFunction(r)?r.call(this,t,n):(o&&(t=n),z.isString(t)?z.isString(r)?-1!==t.indexOf(r):z.isRegExp(r)?r.test(t):void 0:void 0)}class xe{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=ve(t);if(!o)throw new Error("header name must be a non-empty string");const i=z.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=ye(e))}const i=(e,t)=>z.forEach(e,((e,n)=>o(e,n,t)));if(z.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(z.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&me[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t);else if(z.isHeaders(e))for(const[a,s]of e.entries())o(s,a,n);else null!=e&&o(t,e,n);return this}get(e,t){if(e=ve(e)){const n=z.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(z.isFunction(t))return t.call(this,e,n);if(z.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=ve(e)){const n=z.findKey(this,e);return!(!n||void 0===this[n]||t&&!be(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=ve(e)){const o=z.findKey(n,e);!o||t&&!be(0,n[o],o,t)||(delete n[o],r=!0)}}return z.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!be(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return z.forEach(this,((r,o)=>{const i=z.findKey(n,o);if(i)return t[i]=ye(r),void delete t[o];const a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();a!==o&&delete t[o],t[a]=ye(r),n[a]=!0})),this}concat(){for(var e=arguments.length,t=new Array(e),n=0;n{null!=n&&!1!==n&&(t[r]=e&&z.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((e=>{let[t,n]=e;return t+": "+n})).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e){const t=new this(e);for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;ot.set(e))),t}static accessor(e){const t=(this[Ae]=this[Ae]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=ve(e);t[r]||(!function(e,t){const n=z.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return z.isArray(e)?e.forEach(r):r(e),this}}xe.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),z.reduceDescriptors(xe.prototype,((e,t)=>{let{value:n}=e,r=t[0].toUpperCase()+t.slice(1);return{get:()=>n,set(e){this[r]=e}}})),z.freezeMethods(xe);const we=xe;function Ce(e,t){const n=this||ge,r=t||n,o=we.from(r.headers);let i=r.data;return z.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function Ee(e){return!(!e||!e.__CANCEL__)}function De(e,t,n){G.call(this,null==e?"canceled":e,G.ERR_CANCELED,t,n),this.name="CanceledError"}z.inherits(De,G,{__CANCEL__:!0});const ke=De;function Ie(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new G("Request failed with status code "+n.status,[G.ERR_BAD_REQUEST,G.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}const Se=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,i=0,a=0;return t=void 0!==t?t:1e3,function(s){const l=Date.now(),c=r[a];o||(o=l),n[i]=s,r[i]=l;let u=a,d=0;for(;u!==i;)d+=n[u++],u%=e;if(i=(i+1)%e,i===a&&(a=(a+1)%e),l-o1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(null,t)};return[function(){const e=Date.now(),t=e-o;for(var s=arguments.length,l=new Array(s),c=0;c=i?a(l,e):(n=l,r||(r=setTimeout((()=>{r=null,a(n)}),i-t)))},()=>n&&a(n)]},_e=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=0;const o=Se(50,250);return Be((n=>{const i=n.loaded,a=n.lengthComputable?n.total:void 0,s=i-r,l=o(s);r=i;e({loaded:i,total:a,progress:a?i/a:void 0,bytes:s,rate:l||void 0,estimated:l&&a&&i<=a?(a-i)/l:void 0,event:n,lengthComputable:null!=a,[t?"download":"upload"]:!0})}),n)},Fe=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},je=e=>function(){for(var t=arguments.length,n=new Array(t),r=0;re(...n)))},Te=he.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,he.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(he.origin),he.navigator&&/(msie|trident)/i.test(he.navigator.userAgent)):()=>!0,Re=he.hasStandardBrowserEnv?{write(e,t,n,r,o,i){const a=[e+"="+encodeURIComponent(t)];z.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),z.isString(r)&&a.push("path="+r),z.isString(o)&&a.push("domain="+o),!0===i&&a.push("secure"),document.cookie=a.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function Me(e,t,n){let r=!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t);return e&&(r||0==n)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const Ne=e=>e instanceof we?(0,ie.A)({},e):e;function Qe(e,t){t=t||{};const n={};function r(e,t,n,r){return z.isPlainObject(e)&&z.isPlainObject(t)?z.merge.call({caseless:r},e,t):z.isPlainObject(t)?z.merge({},t):z.isArray(t)?t.slice():t}function o(e,t,n,o){return z.isUndefined(t)?z.isUndefined(e)?void 0:r(void 0,e,0,o):r(e,t,0,o)}function i(e,t){if(!z.isUndefined(t))return r(void 0,t)}function a(e,t){return z.isUndefined(t)?z.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function s(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}const l={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:s,headers:(e,t,n)=>o(Ne(e),Ne(t),0,!0)};return z.forEach(Object.keys(Object.assign({},e,t)),(function(r){const i=l[r]||o,a=i(e[r],t[r],r);z.isUndefined(a)&&i!==s||(n[r]=a)})),n}const Pe=e=>{const t=Qe({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:i,xsrfCookieName:a,headers:s,auth:l}=t;if(t.headers=s=we.from(s),t.url=ne(Me(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&s.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),z.isFormData(r))if(he.hasStandardBrowserEnv||he.hasStandardBrowserWebWorkerEnv)s.setContentType(void 0);else if(!1!==(n=s.getContentType())){const[e,...t]=n?n.split(";").map((e=>e.trim())).filter(Boolean):[];s.setContentType([e||"multipart/form-data",...t].join("; "))}if(he.hasStandardBrowserEnv&&(o&&z.isFunction(o)&&(o=o(t)),o||!1!==o&&Te(t.url))){const e=i&&a&&Re.read(a);e&&s.set(i,e)}return t},Oe="undefined"!==typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){const r=Pe(e);let o=r.data;const i=we.from(r.headers).normalize();let a,s,l,c,u,{responseType:d,onUploadProgress:h,onDownloadProgress:f}=r;function p(){c&&c(),u&&u(),r.cancelToken&&r.cancelToken.unsubscribe(a),r.signal&&r.signal.removeEventListener("abort",a)}let g=new XMLHttpRequest;function m(){if(!g)return;const r=we.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders());Ie((function(e){t(e),p()}),(function(e){n(e),p()}),{data:d&&"text"!==d&&"json"!==d?g.response:g.responseText,status:g.status,statusText:g.statusText,headers:r,config:e,request:g}),g=null}g.open(r.method.toUpperCase(),r.url,!0),g.timeout=r.timeout,"onloadend"in g?g.onloadend=m:g.onreadystatechange=function(){g&&4===g.readyState&&(0!==g.status||g.responseURL&&0===g.responseURL.indexOf("file:"))&&setTimeout(m)},g.onabort=function(){g&&(n(new G("Request aborted",G.ECONNABORTED,e,g)),g=null)},g.onerror=function(){n(new G("Network Error",G.ERR_NETWORK,e,g)),g=null},g.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||oe;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new G(t,o.clarifyTimeoutError?G.ETIMEDOUT:G.ECONNABORTED,e,g)),g=null},void 0===o&&i.setContentType(null),"setRequestHeader"in g&&z.forEach(i.toJSON(),(function(e,t){g.setRequestHeader(t,e)})),z.isUndefined(r.withCredentials)||(g.withCredentials=!!r.withCredentials),d&&"json"!==d&&(g.responseType=r.responseType),f&&([l,u]=_e(f,!0),g.addEventListener("progress",l)),h&&g.upload&&([s,c]=_e(h),g.upload.addEventListener("progress",s),g.upload.addEventListener("loadend",c)),(r.cancelToken||r.signal)&&(a=t=>{g&&(n(!t||t.type?new ke(null,e,g):t),g.abort(),g=null)},r.cancelToken&&r.cancelToken.subscribe(a),r.signal&&(r.signal.aborted?a():r.signal.addEventListener("abort",a)));const A=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);A&&-1===he.protocols.indexOf(A)?n(new G("Unsupported protocol "+A+":",G.ERR_BAD_REQUEST,e)):g.send(o||null)}))},Le=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const o=function(e){if(!n){n=!0,a();const t=e instanceof Error?e:this.reason;r.abort(t instanceof G?t:new ke(t instanceof Error?t.message:t))}};let i=t&&setTimeout((()=>{i=null,o(new G("timeout ".concat(t," of ms exceeded"),G.ETIMEDOUT))}),t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)})),e=null)};e.forEach((e=>e.addEventListener("abort",o)));const{signal:s}=r;return s.unsubscribe=()=>z.asap(a),s}};function ze(e,t){this.v=e,this.k=t}function Ue(e){return function(){return new He(e.apply(this,arguments))}}function He(e){var t,n;function r(t,n){try{var i=e[t](n),a=i.value,s=a instanceof ze;Promise.resolve(s?a.v:a).then((function(n){if(s){var l="return"===t?"return":"next";if(!a.k||n.done)return r(l,n);n=e[l](n).value}o(i.done?"return":"normal",n)}),(function(e){r("throw",e)}))}catch(e){o("throw",e)}}function o(e,o){switch(e){case"return":t.resolve({value:o,done:!0});break;case"throw":t.reject(o);break;default:t.resolve({value:o,done:!1})}(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,o){return new Promise((function(i,a){var s={key:e,arg:o,resolve:i,reject:a,next:null};n?n=n.next=s:(t=n=s,r(e,o))}))},"function"!=typeof e.return&&(this.return=void 0)}function We(e){return new ze(e,0)}function Ge(e){var t={},n=!1;function r(t,r){return n=!0,r=new Promise((function(n){n(e[t](r))})),{done:!1,value:new ze(r,1)}}return t["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},t.next=function(e){return n?(n=!1,e):r("next",e)},"function"==typeof e.throw&&(t.throw=function(e){if(n)throw n=!1,e;return r("throw",e)}),"function"==typeof e.return&&(t.return=function(e){return n?(n=!1,e):r("return",e)}),t}function Ve(e){var t,n,r,o=2;for("undefined"!=typeof Symbol&&(n=Symbol.asyncIterator,r=Symbol.iterator);o--;){if(n&&null!=(t=e[n]))return t.call(e);if(r&&null!=(t=e[r]))return new Ke(t.call(e));n="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")}function Ke(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return Ke=function(e){this.s=e,this.n=e.next},Ke.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new Ke(e)}He.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},He.prototype.next=function(e){return this._invoke("next",e)},He.prototype.throw=function(e){return this._invoke("throw",e)},He.prototype.return=function(e){return this._invoke("return",e)};const Ye=function*(e,t){let n=e.byteLength;if(!t||n{const o=qe(e,t);let i,a=0,s=e=>{i||(i=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await o.next();if(t)return s(),void e.close();let i=r.byteLength;if(n){let e=a+=i;n(e)}e.enqueue(new Uint8Array(r))}catch(t){throw s(t),t}},cancel:e=>(s(e),o.return())},{highWaterMark:2})},Ze="function"===typeof fetch&&"function"===typeof Request&&"function"===typeof Response,$e=Ze&&"function"===typeof ReadableStream,et=Ze&&("function"===typeof TextEncoder?(tt=new TextEncoder,e=>tt.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var tt;const nt=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{let e=!1;const t=new Request(he.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),ot=$e&&nt((()=>z.isReadableStream(new Response("").body))),it={stream:ot&&(e=>e.body)};var at;Ze&&(at=new Response,["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!it[e]&&(it[e]=z.isFunction(at[e])?t=>t[e]():(t,n)=>{throw new G("Response type '".concat(e,"' is not supported"),G.ERR_NOT_SUPPORT,n)})})));const st=async(e,t)=>{const n=z.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(z.isBlob(e))return e.size;if(z.isSpecCompliantForm(e)){const t=new Request(he.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return z.isArrayBufferView(e)||z.isArrayBuffer(e)?e.byteLength:(z.isURLSearchParams(e)&&(e+=""),z.isString(e)?(await et(e)).byteLength:void 0)})(t):n},lt={http:null,xhr:Oe,fetch:Ze&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:i,timeout:a,onDownloadProgress:s,onUploadProgress:l,responseType:c,headers:u,withCredentials:d="same-origin",fetchOptions:h}=Pe(e);c=c?(c+"").toLowerCase():"text";let f,p=Le([o,i&&i.toAbortSignal()],a);const g=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let m;try{if(l&&rt&&"get"!==n&&"head"!==n&&0!==(m=await st(u,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(z.isFormData(r)&&(e=n.headers.get("content-type"))&&u.setContentType(e),n.body){const[e,t]=Fe(m,_e(je(l)));r=Xe(n.body,65536,e,t)}}z.isString(d)||(d=d?"include":"omit");const o="credentials"in Request.prototype;f=new Request(t,(0,ie.A)((0,ie.A)({},h),{},{signal:p,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:"half",credentials:o?d:void 0}));let i=await fetch(f);const a=ot&&("stream"===c||"response"===c);if(ot&&(s||a&&g)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=i[t]}));const t=z.toFiniteNumber(i.headers.get("content-length")),[n,r]=s&&Fe(t,_e(je(s),!0))||[];i=new Response(Xe(i.body,65536,n,(()=>{r&&r(),g&&g()})),e)}c=c||"text";let A=await it[z.findKey(it,c)||"text"](i,e);return!a&&g&&g(),await new Promise(((t,n)=>{Ie(t,n,{data:A,headers:we.from(i.headers),status:i.status,statusText:i.statusText,config:e,request:f})}))}catch(A){if(g&&g(),A&&"TypeError"===A.name&&/fetch/i.test(A.message))throw Object.assign(new G("Network Error",G.ERR_NETWORK,e,f),{cause:A.cause||A});throw G.from(A,A&&A.code,e,f)}})};z.forEach(lt,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(n){}Object.defineProperty(e,"adapterName",{value:t})}}));const ct=e=>"- ".concat(e),ut=e=>z.isFunction(e)||null===e||!1===e,dt=e=>{e=z.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let i=0;i{let[t,n]=e;return"adapter ".concat(t," ")+(!1===n?"is not supported by the environment":"is not available in the build")}));let n=t?e.length>1?"since :\n"+e.map(ct).join("\n"):" "+ct(e[0]):"as no adapter specified";throw new G("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r};function ht(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ke(null,e)}function ft(e){ht(e),e.headers=we.from(e.headers),e.data=Ce.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return dt(e.adapter||ge.adapter)(e).then((function(t){return ht(e),t.data=Ce.call(e,e.transformResponse,t),t.headers=we.from(t.headers),t}),(function(t){return Ee(t)||(ht(e),t&&t.response&&(t.response.data=Ce.call(e,e.transformResponse,t.response),t.response.headers=we.from(t.response.headers))),Promise.reject(t)}))}const pt="1.8.4",gt={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{gt[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const mt={};gt.transitional=function(e,t,n){function r(e,t){return"[Axios v1.8.4] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,i)=>{if(!1===e)throw new G(r(o," has been removed"+(t?" in "+t:"")),G.ERR_DEPRECATED);return t&&!mt[o]&&(mt[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}},gt.spelling=function(e){return(t,n)=>(console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0)};const At={assertOptions:function(e,t,n){if("object"!==typeof e)throw new G("options must be an object",G.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const i=r[o],a=t[i];if(a){const t=e[i],n=void 0===t||a(t,i,e);if(!0!==n)throw new G("option "+i+" must be "+n,G.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new G("Unknown option "+i,G.ERR_BAD_OPTION)}},validators:gt},vt=At.validators;class yt{constructor(e){this.defaults=e,this.interceptors={request:new re,response:new re}}async request(e,t){try{return await this._request(e,t)}catch(n){if(n instanceof Error){let e={};Error.captureStackTrace?Error.captureStackTrace(e):e=new Error;const t=e.stack?e.stack.replace(/^.+\n/,""):"";try{n.stack?t&&!String(n.stack).endsWith(t.replace(/^.+\n.+\n/,""))&&(n.stack+="\n"+t):n.stack=t}catch(r){}}throw n}}_request(e,t){"string"===typeof e?(t=t||{}).url=e:t=e||{},t=Qe(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&At.assertOptions(n,{silentJSONParsing:vt.transitional(vt.boolean),forcedJSONParsing:vt.transitional(vt.boolean),clarifyTimeoutError:vt.transitional(vt.boolean)},!1),null!=r&&(z.isFunction(r)?t.paramsSerializer={serialize:r}:At.assertOptions(r,{encode:vt.function,serialize:vt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),At.assertOptions(t,{baseUrl:vt.spelling("baseURL"),withXsrfToken:vt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let i=o&&z.merge(o.common,o[t.method]);o&&z.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=we.concat(i,o);const a=[];let s=!0;this.interceptors.request.forEach((function(e){"function"===typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,a.unshift(e.fulfilled,e.rejected))}));const l=[];let c;this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));let u,d=0;if(!s){const e=[ft.bind(this),void 0];for(e.unshift.apply(e,a),e.push.apply(e,l),u=e.length,c=Promise.resolve(t);d{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new ke(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new xt((function(t){e=t})),cancel:e}}}const wt=xt;const Ct={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ct).forEach((e=>{let[t,n]=e;Ct[n]=t}));const Et=Ct;const Dt=function e(t){const n=new bt(t),r=o(bt.prototype.request,n);return z.extend(r,bt.prototype,n,{allOwnKeys:!0}),z.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Qe(t,n))},r}(ge);Dt.Axios=bt,Dt.CanceledError=ke,Dt.CancelToken=wt,Dt.isCancel=Ee,Dt.VERSION=pt,Dt.toFormData=J,Dt.AxiosError=G,Dt.Cancel=Dt.CanceledError,Dt.all=function(e){return Promise.all(e)},Dt.spread=function(e){return function(t){return e.apply(null,t)}},Dt.isAxiosError=function(e){return z.isObject(e)&&!0===e.isAxiosError},Dt.mergeConfig=Qe,Dt.AxiosHeaders=we,Dt.formToJSON=e=>fe(z.isHTMLForm(e)?new FormData(e):e),Dt.getAdapter=dt,Dt.HttpStatusCode=Et,Dt.default=Dt;const kt=Dt},6999:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=null;if(!e||"string"!==typeof e)return n;var r=(0,o.default)(e),i="function"===typeof t;return r.forEach((function(e){if("declaration"===e.type){var r=e.property,o=e.value;i?t(r,o,e):o&&((n=n||{})[r]=o)}})),n};var o=r(n(4814))},7020:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(2689),n(9787),function(){var e=t,n=e.lib,r=n.Base,o=n.WordArray,i=e.algo,a=i.MD5,s=i.EvpKDF=r.extend({cfg:r.extend({keySize:4,hasher:a,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n,r=this.cfg,i=r.hasher.create(),a=o.create(),s=a.words,l=r.keySize,c=r.iterations;s.length>>24)|4278255360&(i<<24|i>>>8),a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),(S=n[o]).high^=a,S.low^=i}for(var s=0;s<24;s++){for(var h=0;h<5;h++){for(var f=0,p=0,g=0;g<5;g++)f^=(S=n[h+5*g]).high,p^=S.low;var m=d[h];m.high=f,m.low=p}for(h=0;h<5;h++){var A=d[(h+4)%5],v=d[(h+1)%5],y=v.high,b=v.low;for(f=A.high^(y<<1|b>>>31),p=A.low^(b<<1|y>>>31),g=0;g<5;g++)(S=n[h+5*g]).high^=f,S.low^=p}for(var x=1;x<25;x++){var w=(S=n[x]).high,C=S.low,E=l[x];E<32?(f=w<>>32-E,p=C<>>32-E):(f=C<>>64-E,p=w<>>64-E);var D=d[c[x]];D.high=f,D.low=p}var k=d[0],I=n[0];for(k.high=I.high,k.low=I.low,h=0;h<5;h++)for(g=0;g<5;g++){var S=n[x=h+5*g],B=d[x],_=d[(h+1)%5+5*g],F=d[(h+2)%5+5*g];S.high=B.high^~_.high&F.high,S.low=B.low^~_.low&F.low}S=n[0];var j=u[s];S.high^=j.high,S.low^=j.low}},_doFinalize:function(){var t=this._data,n=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;n[r>>>5]|=1<<24-r%32,n[(e.ceil((r+1)/i)*i>>>5)-1]|=128,t.sigBytes=4*n.length,this._process();for(var a=this._state,s=this.cfg.outputLength/8,l=s/8,c=[],u=0;u>>24)|4278255360&(h<<24|h>>>8),f=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8),c.push(f),c.push(h)}return new o.init(c,s)},clone:function(){for(var e=i.clone.call(this),t=e._state=this._state.slice(0),n=0;n<25;n++)t[n]=t[n].clone();return e}});n.SHA3=i._createHelper(h),n.HmacSHA3=i._createHmacHelper(h)}(Math),t.SHA3)}()},7106:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14M7 9h5v1H7z"}),"ZoomOut")},7118:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.mode.CTRGladman=function(){var e=t.lib.BlockCipherMode.extend();function n(e){if(255===(e>>24&255)){var t=e>>16&255,n=e>>8&255,r=255&e;255===t?(t=0,255===n?(n=0,255===r?r=0:++r):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=r}else e+=1<<24;return e}function r(e){return 0===(e[0]=n(e[0]))&&(e[1]=n(e[1])),e}var o=e.Encryptor=e.extend({processBlock:function(e,t){var n=this._cipher,o=n.blockSize,i=this._iv,a=this._counter;i&&(a=this._counter=i.slice(0),this._iv=void 0),r(a);var s=a.slice(0);n.encryptBlock(s,0);for(var l=0;l{"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(8345)},7129:(e,t,n)=>{"use strict";var r,o=n(5899),i=n(4867),a=n(1875),s=n(6181),l=n(3384),c=-2,u=258,d=262,h=103,f=113,p=666;function g(e,t){return e.msg=l[t],t}function m(e){return(e<<1)-(e>4?9:0)}function A(e){for(var t=e.length;--t>=0;)e[t]=0}function v(e){var t=e.state,n=t.pending;n>e.avail_out&&(n=e.avail_out),0!==n&&(o.arraySet(e.output,t.pending_buf,t.pending_out,n,e.next_out),e.next_out+=n,t.pending_out+=n,e.total_out+=n,e.avail_out-=n,t.pending-=n,0===t.pending&&(t.pending_out=0))}function y(e,t){i._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,v(e.strm)}function b(e,t){e.pending_buf[e.pending++]=t}function x(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function w(e,t,n,r){var i=e.avail_in;return i>r&&(i=r),0===i?0:(e.avail_in-=i,o.arraySet(t,e.input,e.next_in,i,n),1===e.state.wrap?e.adler=a(e.adler,t,i,n):2===e.state.wrap&&(e.adler=s(e.adler,t,i,n)),e.next_in+=i,e.total_in+=i,i)}function C(e,t){var n,r,o=e.max_chain_length,i=e.strstart,a=e.prev_length,s=e.nice_match,l=e.strstart>e.w_size-d?e.strstart-(e.w_size-d):0,c=e.window,h=e.w_mask,f=e.prev,p=e.strstart+u,g=c[i+a-1],m=c[i+a];e.prev_length>=e.good_match&&(o>>=2),s>e.lookahead&&(s=e.lookahead);do{if(c[(n=t)+a]===m&&c[n+a-1]===g&&c[n]===c[i]&&c[++n]===c[i+1]){i+=2,n++;do{}while(c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&c[++i]===c[++n]&&ia){if(e.match_start=t,a=r,r>=s)break;g=c[i+a-1],m=c[i+a]}}}while((t=f[t&h])>l&&0!==--o);return a<=e.lookahead?a:e.lookahead}function E(e){var t,n,r,i,a,s=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=s+(s-d)){o.arraySet(e.window,e.window,s,s,0),e.match_start-=s,e.strstart-=s,e.block_start-=s,t=n=e.hash_size;do{r=e.head[--t],e.head[t]=r>=s?r-s:0}while(--n);t=n=s;do{r=e.prev[--t],e.prev[t]=r>=s?r-s:0}while(--n);i+=s}if(0===e.strm.avail_in)break;if(n=w(e.strm,e.window,e.strstart+e.lookahead,i),e.lookahead+=n,e.lookahead+e.insert>=3)for(a=e.strstart-e.insert,e.ins_h=e.window[a],e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<=3)if(r=i._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){o=e.strstart+e.lookahead-3,r=i._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=o&&(e.ins_h=(e.ins_h<15&&(s=2,r-=16),i<1||i>9||8!==n||r<8||r>15||t<0||t>9||a<0||a>4)return g(e,c);8===r&&(r=9);var l=new S;return e.state=l,l.strm=e,l.wrap=s,l.gzhead=null,l.w_bits=r,l.w_size=1<e.pending_buf_size-5&&(n=e.pending_buf_size-5);;){if(e.lookahead<=1){if(E(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var r=e.block_start+n;if((0===e.strstart||e.strstart>=r)&&(e.lookahead=e.strstart-r,e.strstart=r,y(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-d&&(y(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(y(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(y(e,!1),e.strm.avail_out),1)})),new I(4,4,8,4,D),new I(4,5,16,8,D),new I(4,6,32,32,D),new I(4,4,16,16,k),new I(8,16,32,32,k),new I(8,16,128,128,k),new I(8,32,128,256,k),new I(32,128,258,1024,k),new I(32,258,258,4096,k)],t.deflateInit=function(e,t){return F(e,t,8,15,8,0)},t.deflateInit2=F,t.deflateReset=_,t.deflateResetKeep=B,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?c:(e.state.gzhead=t,0):c},t.deflate=function(e,t){var n,o,a,l;if(!e||!e.state||t>5||t<0)return e?g(e,c):c;if(o=e.state,!e.output||!e.input&&0!==e.avail_in||o.status===p&&4!==t)return g(e,0===e.avail_out?-5:c);if(o.strm=e,n=o.last_flush,o.last_flush=t,42===o.status)if(2===o.wrap)e.adler=0,b(o,31),b(o,139),b(o,8),o.gzhead?(b(o,(o.gzhead.text?1:0)+(o.gzhead.hcrc?2:0)+(o.gzhead.extra?4:0)+(o.gzhead.name?8:0)+(o.gzhead.comment?16:0)),b(o,255&o.gzhead.time),b(o,o.gzhead.time>>8&255),b(o,o.gzhead.time>>16&255),b(o,o.gzhead.time>>24&255),b(o,9===o.level?2:o.strategy>=2||o.level<2?4:0),b(o,255&o.gzhead.os),o.gzhead.extra&&o.gzhead.extra.length&&(b(o,255&o.gzhead.extra.length),b(o,o.gzhead.extra.length>>8&255)),o.gzhead.hcrc&&(e.adler=s(e.adler,o.pending_buf,o.pending,0)),o.gzindex=0,o.status=69):(b(o,0),b(o,0),b(o,0),b(o,0),b(o,0),b(o,9===o.level?2:o.strategy>=2||o.level<2?4:0),b(o,3),o.status=f);else{var d=8+(o.w_bits-8<<4)<<8;d|=(o.strategy>=2||o.level<2?0:o.level<6?1:6===o.level?2:3)<<6,0!==o.strstart&&(d|=32),d+=31-d%31,o.status=f,x(o,d),0!==o.strstart&&(x(o,e.adler>>>16),x(o,65535&e.adler)),e.adler=1}if(69===o.status)if(o.gzhead.extra){for(a=o.pending;o.gzindex<(65535&o.gzhead.extra.length)&&(o.pending!==o.pending_buf_size||(o.gzhead.hcrc&&o.pending>a&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),v(e),a=o.pending,o.pending!==o.pending_buf_size));)b(o,255&o.gzhead.extra[o.gzindex]),o.gzindex++;o.gzhead.hcrc&&o.pending>a&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),o.gzindex===o.gzhead.extra.length&&(o.gzindex=0,o.status=73)}else o.status=73;if(73===o.status)if(o.gzhead.name){a=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>a&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),v(e),a=o.pending,o.pending===o.pending_buf_size)){l=1;break}l=o.gzindexa&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),0===l&&(o.gzindex=0,o.status=91)}else o.status=91;if(91===o.status)if(o.gzhead.comment){a=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>a&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),v(e),a=o.pending,o.pending===o.pending_buf_size)){l=1;break}l=o.gzindexa&&(e.adler=s(e.adler,o.pending_buf,o.pending-a,a)),0===l&&(o.status=h)}else o.status=h;if(o.status===h&&(o.gzhead.hcrc?(o.pending+2>o.pending_buf_size&&v(e),o.pending+2<=o.pending_buf_size&&(b(o,255&e.adler),b(o,e.adler>>8&255),e.adler=0,o.status=f)):o.status=f),0!==o.pending){if(v(e),0===e.avail_out)return o.last_flush=-1,0}else if(0===e.avail_in&&m(t)<=m(n)&&4!==t)return g(e,-5);if(o.status===p&&0!==e.avail_in)return g(e,-5);if(0!==e.avail_in||0!==o.lookahead||0!==t&&o.status!==p){var w=2===o.strategy?function(e,t){for(var n;;){if(0===e.lookahead&&(E(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,n=i._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,n&&(y(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(y(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(y(e,!1),0===e.strm.avail_out)?1:2}(o,t):3===o.strategy?function(e,t){for(var n,r,o,a,s=e.window;;){if(e.lookahead<=u){if(E(e),e.lookahead<=u&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(r=s[o=e.strstart-1])===s[++o]&&r===s[++o]&&r===s[++o]){a=e.strstart+u;do{}while(r===s[++o]&&r===s[++o]&&r===s[++o]&&r===s[++o]&&r===s[++o]&&r===s[++o]&&r===s[++o]&&r===s[++o]&&oe.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(n=i._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(n=i._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),n&&(y(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(y(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(y(e,!1),0===e.strm.avail_out)?1:2}(o,t):r[o.level].func(o,t);if(3!==w&&4!==w||(o.status=p),1===w||3===w)return 0===e.avail_out&&(o.last_flush=-1),0;if(2===w&&(1===t?i._tr_align(o):5!==t&&(i._tr_stored_block(o,0,0,!1),3===t&&(A(o.head),0===o.lookahead&&(o.strstart=0,o.block_start=0,o.insert=0))),v(e),0===e.avail_out))return o.last_flush=-1,0}return 4!==t?0:o.wrap<=0?1:(2===o.wrap?(b(o,255&e.adler),b(o,e.adler>>8&255),b(o,e.adler>>16&255),b(o,e.adler>>24&255),b(o,255&e.total_in),b(o,e.total_in>>8&255),b(o,e.total_in>>16&255),b(o,e.total_in>>24&255)):(x(o,e.adler>>>16),x(o,65535&e.adler)),v(e),o.wrap>0&&(o.wrap=-o.wrap),0!==o.pending?0:1)},t.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&t!==h&&t!==f&&t!==p?g(e,c):(e.state=null,t===f?g(e,-3):0):c},t.deflateSetDictionary=function(e,t){var n,r,i,s,l,u,d,h,f=t.length;if(!e||!e.state)return c;if(2===(s=(n=e.state).wrap)||1===s&&42!==n.status||n.lookahead)return c;for(1===s&&(e.adler=a(e.adler,t,f,0)),n.wrap=0,f>=n.w_size&&(0===s&&(A(n.head),n.strstart=0,n.block_start=0,n.insert=0),h=new o.Buf8(n.w_size),o.arraySet(h,t,f-n.w_size,n.w_size,0),t=h,f=n.w_size),l=e.avail_in,u=e.next_in,d=e.input,e.avail_in=f,e.next_in=0,e.input=t,E(n);n.lookahead>=3;){r=n.strstart,i=n.lookahead-2;do{n.ins_h=(n.ins_h<{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return r.createSvgIcon}});var r=n(5865)},7161:(e,t)=>{function n(e){this.buffer=e,this.pos=0}function r(e){this.buffer=e,this.pos=0}n.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(var r=0;rthis.buffer.length)throw new Error("Output buffer is not large enough");return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t},t.y=r},7212:e=>{e.exports=function(e,t,n){if(void 0==e)return[0,0,0];var r,o,i,a=(1-Math.abs(2*n-1))*t,s=e/60,l=a*(1-Math.abs(s%2-1));0===(s=Math.floor(s))?(r=a,o=l,i=0):1===s?(r=l,o=a,i=0):2===s?(r=0,o=a,i=l):3===s?(r=0,o=l,i=a):4===s?(r=l,o=0,i=a):5===s&&(r=a,o=0,i=l);var c=n-a/2;return r+=c,o+=c,i+=c,[Math.abs(Math.round(255*r)),Math.abs(Math.round(255*o)),Math.abs(Math.round(255*i))]}},7254:(e,t,n)=>{"use strict";var r=n(9950);var o="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t},i=r.useSyncExternalStore,a=r.useRef,s=r.useEffect,l=r.useMemo,c=r.useDebugValue},7256:(e,t,n)=>{"use strict";n(7254)},7257:function(e,t){var n,r,o;r=[],void 0===(o="function"===typeof(n=function(){return["0004,004,001,003,005,0005,00005,000005,0002,002,0000005,0003,00003,00505,00034,0001,00055,00004,4,05,0055,04,42,03,02,2,404,3,044,01,0505,55,5,045,041,0033,000004,22,00504,5504,0042,1,21,41,402,405,4004,43,23,000054,303,3005,022,5004,000003,252,45,25,2004,000505,054,403,401,3002,0025,144,432,00054,34,12,234,0022,014,0304,012,143,503,0403,101,052,414,212,011,043,00002,0041,0024,05005,03003,00102,0404,04303,01004,0034,025,0044,00404,00025,0103,042,0205,412,104,54,344,433,5005,253,055,0402,3004,0043,204,505,454,0000004,00303,04004,552,201,4005,0255,52,444,14,44,02004,033,05004,00045,00013,0021,0405,00044,0054,50055,000303,00001,304,0204,11,301,232,122,00305,504,000043,0104,00052,000045,50004,0023,00033,00032,00202,5003,202,0401,0000505,214,102,032,000161,004101,00501,00301,0036,0052,00023,006101,006,00401,000521,0014,0063,00012,000501,000006,000604,000601,005001,005005,0010305,00006,003012,003005,0003011,0061,013,000021,000022,000105,00211,00062,00051,000112,006013,000011,0200306,1021,0050001,003003,2102,305,000015,01030005,000035,001011,00021,16330001,0234,030006,5020001,000001,00016,0031,021,21431,002305,0350014,0000012,000063,00101,106,105,00435,00063,0300061,00041,100306,003602,023,0503,0010011,10003,1005,30011,00031,0001001,0000061,0030003,30305,001201,0301,5000101,500101,00015,000401,000065,000016,0000402,0500002,000205,030201,500301,00014,5001,000002,00030011,01034,0300006,030213,00400304,050001,05003,000311,0634,00061,0006,00000604,00050013,00213,0030001,100003,000033,30002,00003632,0003004,050003,0000021,006303,0000006,00005005,30451,03001,00231,00056,00011,6,001001,00500001,03005,503005,0000010001,1002,003001,001065,300001,32011,32,0000003,0213001,0500053,021005,10001,0000011,0001041,0020016,100032,50011,0606,5002,3001,03002,0015001,0102,00003001,000000033,0000001,300101,300015,0101003,00000101,0100501,0101,0010033,00000362,000014,0005001,031",'{".":{"a":{"c":{"h":0},"d":{"d":{"e":{"r":1}}},"f":{"t":2},"l":{"t":3},"m":{"a":{"t":4}},"n":{"c":4,"g":0,"i":{"m":5},"t":[{"e":3,"i":{"s":6}},0]},"r":{"s":4,"t":{"i":{"e":1},"y":1}},"s":{"c":3,"p":2,"s":2,"t":{"e":{"r":7}}},"t":{"o":{"m":6}},"u":{"d":2},"v":{"i":1},"w":{"n":0}},"b":{"a":{"g":1,"n":{"a":4},"s":{"e":0}},"e":{"r":[{"a":4},0],"s":{"m":3,"t":{"o":4}}},"r":{"i":8},"u":{"t":{"t":{"i":0}}}},"c":{"a":{"m":{"p":{"e":0}},"n":{"c":5},"p":{"a":{"b":6}},"r":{"o":{"l":5}},"t":1},"e":{"l":{"a":1}},"h":[{"i":{"l":{"l":{"i":7}}}},1],"i":[{"t":{"r":5}},9],"o":{"e":3,"r":[{"n":{"e":{"r":5}}},1],"n":{"g":{"r":5}}}},"d":{"e":{"m":{"o":{"i":1}},"o":3,"r":{"a":3,"i":[{"v":{"a":4}},3]},"s":{"c":0}},"i":{"c":{"t":{"i":{"o":10}}}},"o":{"t":1},"u":{"c":1,"m":{"b":6}},"r":{"i":{"v":67}}},"e":{"a":{"r":{"t":{"h":7}},"s":{"i":11}},"b":1,"e":{"r":0},"g":9,"l":{"d":4,"e":{"m":3}},"n":{"a":{"m":12},"g":3,"s":3},"q":{"u":{"i":{"t":13}}},"r":{"r":{"i":1}},"s":3,"u":[{"l":{"e":{"r":1}}},3],"y":{"e":5},"t":{"h":{"y":{"l":162}}},"v":[{"e":{"r":{"s":{"i":{"b":158}}}}},9]},"f":{"e":{"s":11},"o":{"r":{"m":{"e":{"r":5}}}}},"g":{"a":[{"s":{"o":{"m":163}}},9],"e":[{"n":{"t":14},"o":{"g":4,"m":{"e":1},"t":164}},9],"i":{"a":4,"b":1},"o":{"r":1}},"h":{"a":{"n":{"d":{"i":6},"k":5}},"e":[{"r":{"o":{"i":6,"e":3}},"s":11,"t":11,"m":{"o":165},"p":{"a":166}},9],"i":{"b":3,"e":{"r":3}},"o":{"n":{"e":{"y":5},"o":11},"v":5}},"i":{"d":{"l":1,"o":{"l":12}},"m":{"m":3,"p":{"i":{"n":4}}},"n":[{"c":{"i":3},"e":8,"k":9,"s":3,"u":{"t":167}},2],"r":{"r":4},"s":{"i":1}},"j":{"u":{"r":3}},"l":{"a":{"c":{"y":1},"m":1,"t":{"e":{"r":5},"h":6}},"e":[{"g":{"e":5},"n":0,"p":5,"v":15,"i":{"c":{"e":{"s":170}}}},9],"i":{"g":[{"a":5},1],"n":9,"o":3,"t":1}},"m":{"a":{"g":{"a":16},"l":{"o":5},"n":{"a":5},"r":{"t":{"i":5}}},"e":[{"r":{"c":11},"t":{"e":{"r":4},"a":{"l":{"a":0}}},"g":{"a":{"l":171}}},9],"i":{"s":[{"t":{"i":6},"e":{"r":{"s":173}}},15],"m":{"i":{"c":172}}},"o":{"n":{"e":11},"r":{"o":3}},"u":{"t":{"a":[{"b":6},4]}}},"n":{"i":{"c":1},"e":{"o":{"f":174}},"o":{"e":{"t":{"h":15}},"n":{"e":{"m":175}}}},"o":{"d":[{"d":5},9],"f":{"t":{"e":4}},"r":{"a":{"t":{"o":4}},"c":3,"d":2,"t":3},"s":[{"t":{"l":1}},3],"t":{"h":11},"u":{"t":11}},"p":{"e":{"d":{"a":{"l":5}},"t":{"e":4,"i":{"t":4}}},"i":{"e":1,"o":{"n":5},"t":9},"r":{"e":{"m":11,"a":{"m":15}}},"o":{"l":{"y":{"s":137}},"s":{"t":{"a":{"m":137}}}}},"r":{"a":{"c":1,"n":{"t":0},"t":{"i":{"o":{"n":{"a":7}}}},"v":{"e":{"n":{"o":176}}}},"e":{"e":[{"c":173},8],"m":{"i":{"t":4}},"s":[{"t":{"a":{"t":4}}},8]},"i":{"g":1,"t":{"u":5}},"o":{"q":1,"s":{"t":5},"w":{"d":5}},"u":{"d":1}},"s":{"c":{"i":{"e":11}},"e":{"l":{"f":6,"l":6},"n":9,"r":{"i":{"e":4}},"m":{"i":[{"c":0,"d":177,"p":36,"r":36,"s":178,"v":36},6]}},"h":9,"i":[{"n":{"g":17}},9],"t":[{"a":{"b":{"l":5}}},1],"y":9,"p":{"h":{"i":{"n":179}},"i":{"n":{"o":137}}}},"t":{"a":[{"p":{"e":{"s":{"t":{"r":180}}}}},1],"e":[{"n":{"a":{"n":5}},"l":{"e":{"g":{"r":3}}}},1],"h":9,"i":[{"l":0,"m":{"o":16},"n":{"g":17,"k":5}},9],"o":{"n":{"a":0},"p":[{"i":5,"o":{"g":170}},1],"u":{"s":5},"q":9},"r":{"i":{"b":{"u":{"t":6}}}}},"u":{"n":{"a":[{"t":{"t":144}},2],"c":{"e":3},"d":{"e":{"r":7}},"e":[{"r":{"r":181}},2],"k":4,"o":4,"u":3},"p":3,"r":{"e":11},"s":{"a":4}},"v":{"e":{"n":{"d":{"e":0}},"r":{"a":4}},"i":{"c":{"a":{"r":151}}}},"w":{"i":{"l":{"i":5}},"e":{"b":{"l":131}}},"y":{"e":1},"k":{"i":{"l":{"n":{"i":168}}},"o":{"r":{"t":{"e":169}}}}},"a":{"b":{".":18,"a":{"l":19,"n":19},"e":[{"r":{"d":4}},8],"i":{"a":5,"t":{"a":{"b":13}}},"l":{"a":{"t":4}},"o":{"l":{"i":{"z":20,"c":19}}},"r":[{"o":{"g":4}},18],"u":{"l":3}},"c":{"a":{"r":[{"d":4,"o":4},21],"b":{"l":24}},"e":{"o":{"u":19},"r":2},"h":{"e":{"t":19}},"i":[{"e":23,"n":2,"o":23},22],"r":{"o":{"b":4}},"t":{"i":{"f":5}},"u":{"l":3,"m":1}},"d":[{"d":{"i":{"n":1}},"e":{"r":{".":4}},"i":[{"a":23,"c":{"a":3},"e":{"r":0},"o":23,"t":23,"u":19},25],"l":{"e":1},"o":{"w":3},"r":{"a":{"n":4}},"s":{"u":1},"u":[{"c":23,"m":4},18]},24],"e":{"r":[{"i":{"e":17}},1]},"f":[{"f":[{"i":{"s":{"h":170}}},0]},24],"g":{"a":{"b":21,"n":0},"e":{"l":{"l":4},"o":0,"u":18},"i":2,"l":26,"n":2,"o":[{"g":27,"n":{"i":3}},24],"u":{"e":{"r":19},"l":4},"y":21},"h":{"a":23,"e":23,"l":1,"o":23},"i":[{"a":19,"c":{".":23},"l":{"y":4},"n":[{"i":{"n":5},"o":5},28],"t":{"e":{"n":5}}},9],"j":29,"k":{"e":{"n":2}},"l":{"a":{"b":4,"d":3,"r":21},"d":{"i":18},"e":[{"n":{"d":3,"t":{"i":21}},"o":30},25],"i":[{"a":{".":1},"e":0},2],"l":{"e":{"v":4},"i":{"c":18}},"m":18,"o":{"g":{".":19}},"y":{".":21,"s":[{"t":31},18],"t":32,"z":27}},"m":{"a":[{"b":4,"g":3,"r":{"a":5},"s":{"c":4},"t":{"i":{"s":21},"o":33}},18],"e":{"r":{"a":4},"n":{"t":{"a":{"b":182}}}},"i":{"c":3,"f":4,"l":{"y":4},"n":[{"o":0},2]},"o":[{"n":19,"r":{"i":6}},24],"p":{"e":{"n":5}}},"n":[{"a":{"g":{"e":3},"l":{"y":[{"s":183},27]},"r":[{"c":3,"i":17},23],"t":{"i":23}},"d":[{"e":{"s":17},"i":{"s":3},"l":2,"o":{"w":1}},18],"e":{"e":19,"n":23,"s":{"t":{".":4}},"u":23},"g":[{"i":{"e":5},"l":2},25],"i":{"c":34,"e":{"s":23},"f":35,"m":{"e":1,"i":19},"n":{"e":19},"o":3,"p":23,"s":{"h":3},"t":3,"u":23},"k":{"l":{"i":1}},"n":{"i":{"z":32}},"o":[{"t":[{"h":7},4],"a":{"c":148}},0],"s":{"a":9,"c":{"o":1},"n":1,"p":[{"o":11},9],"t":1,"u":{"r":1},"g":{"r":5},"v":11},"t":{"a":{"l":36},"i":{"e":1,"d":137,"n":184,"r":{"e":137}},"o":18,"r":9,"w":1},"u":{"a":3,"l":3,"r":19}},24],"o":18,"p":{"a":{"r":17,"t":4},"e":{"r":{"o":4},"a":{"b":{"l":{"e":132}}}},"h":{"e":{"r":23},"i":18},"i":{"l":{"l":{"a":[{"r":4},21]}},"n":3,"t":{"a":3,"u":23}},"l":24,"o":{"c":6,"l":{"a":4},"r":{"i":6},"s":{"t":12}},"s":{"e":{"s":5}},"u":23},"q":{"u":{"e":6}},"r":[{"a":{"c":{"t":3},"d":{"e":19,"i":{"s":4}},"l":3,"m":{"e":{"t":{"e":19}}},"n":{"g":17},"p":11,"t":[{"i":{"o":19,"v":4}},1],"u":19,"v":38,"w":17},"b":{"a":{"l":36}},"c":{"h":{"a":{"n":1},"e":{"t":185}}},"d":{"i":{"n":{"e":4}},"r":1},"e":{"a":{"s":4},"e":23,"n":{"t":3},"s":{"s":19}},"f":{"i":1,"l":1},"i":[{"a":{"l":4,"n":3},"e":{"t":23},"m":1,"n":{"a":{"t":4}},"o":3,"z":9},2],"m":{"i":9},"o":{"d":20,"n":{"i":19},"o":23},"p":9,"q":3,"r":{"e":17,"a":{"n":{"g":{"e":9}}}},"s":{"a":1,"h":9}},37],"s":{".":18,"a":{"b":1,"n":{"t":3}},"h":{"i":17},"i":{"a":{".":19},"b":23,"c":23,"t":39},"k":{"i":11},"l":1,"o":{"c":21},"p":{"h":4},"s":{"h":1},"t":{"e":{"n":3},"r":2},"u":{"r":{"a":6}},"y":{"m":{"p":{"t":{"o":{"t":4}}}}}},"t":{"a":[{"b":{"l":3},"c":4,"l":{"o":3},"p":4},24],"e":{"c":[{"h":4},5],"g":{"o":3},"n":{".":3},"r":{"a":3,"n":[{"a":19},6]},"s":{"t":3},"v":4},"h":[{"e":{"m":5,"n":19,"r":{"o":{"s":186}}},"o":[{"m":5},1]},18],"i":{".":18,"a":19,"b":20,"c":2,"f":3,"o":{"n":{"a":{"r":7}}},"t":{"u":3}},"o":{"g":21,"m":[{"i":{"z":4}},24],"p":21,"s":21},"r":[{"o":{"p":4}},29],"s":{"k":1},"t":{"a":{"g":1},"e":[{"s":{".":170}},4],"h":1},"u":[{"a":4,"e":4,"l":3,"r":{"a":3}},24],"y":24},"u":{"b":1,"g":{"h":[{"t":{"l":17}},12],"u":3},"l":[{"i":{"f":13}},40],"n":{"d":5},"r":3,"s":{"i":{"b":4}},"t":{"e":{"n":5},"h":2}},"v":{"a":[{"g":3,"n":19},24],"e":{"n":{"o":0},"r":{"a":3,"n":4,"y":4}},"i":[{"e":{"r":0},"g":3,"o":{"u":3}},2],"o":{"c":4,"r":29}},"w":{"a":{"y":27},"i":3,"l":{"y":1},"s":0},"x":{"i":{"c":1,"d":1}},"y":{"a":{"l":4},"e":0,"s":0},"z":{"i":{"e":{"r":0}},"z":{"i":5}}},"b":{"a":{".":32,"d":{"g":{"e":{"r":5}}},"g":{"e":1},"l":{"a":15},"n":{"d":{"a":{"g":5}},"e":0,"i":11},"r":{"b":{"i":7},"i":{"a":17},"o":{"n":{"i":{"e":187}}}},"s":{"s":{"i":0}},"t":[{"h":{"y":2}},41],"z":1,"c":{"k":{"e":{"r":{".":84}}}}},"b":[{"e":[{"r":23},24],"i":{"n":{"a":0},"t":0}},42],"d":43,"e":{".":18,"a":{"k":17,"t":12},"d":[{"a":3,"e":3,"i":3},44],"g":{"i":3,"u":4},"l":[{"i":2,"o":3},41],"m":45,"n":{"i":{"g":4},"u":4},"s":[{"p":3,"t":{"r":4}},46],"t":[{"i":{"z":5},"r":4,"w":3},27],"w":3,"y":{"o":4},"v":{"i":{"e":9}}},"f":25,"h":47,"i":{"b":9,"d":[{"i":{"f":167}},1],"e":[{"n":4,"r":1},27],"f":48,"l":[{"i":{"z":3},"l":{"a":{"b":8}}},41],"n":{"a":{"r":49},"d":0,"e":{"t":4}},"o":{"g":{"r":3},"u":4,"m":5,"r":{"b":2,"h":15}},"t":[{"i":{"o":50,"v":{"e":188}},"r":3,"u":{"a":51},"z":19},9]},"j":29,"k":1,"l":[{"a":{"t":{"h":7},"n":{"d":189}},"e":{".":21,"n":17,"s":{"p":32}},"i":{"s":23,"n":{"d":189}},"o":[{"n":{"d":190}},21],"u":{"n":{"t":17}}},52],"m":43,"n":[{"e":{"g":5}},47],"o":{"d":[{"i":11},27],"e":1,"l":{"i":{"c":11}},"m":{"b":{"i":0}},"n":{"a":[{"t":5},0]},"o":27,"r":{".":32,"a":43,"d":5,"e":32,"i":32,"n":{"o":191}},"s":53,"t":{"a":19,"h":6,"o":1,"u":{"l":192}},"u":{"n":{"d":54}}},"p":18,"r":{"i":{"t":18},"o":{"t":{"h":54}},"u":{"s":{"q":17}}},"s":[{"o":{"r":17}},55],"t":[{"l":1,"o":21,"r":23},25],"u":{"f":{"f":{"e":{"r":0}}},"g":{"a":1},"l":{"i":3},"m":{"i":17},"n":[{"t":{"i":17}},1],"r":{"e":3},"s":{"i":{"e":[{"r":193,"s":193},5]},"s":{"e":17,"i":{"n":{"g":17}}},"t":32},"t":{"a":18,"i":{"o":27},"o":19,"e":{"d":{".":8}},"t":{"e":{"d":0}}}},"v":29,"w":56,"y":{".":32,"s":0}},"c":{"a":[{"b":{"i":{"n":11},"l":2},"c":{"h":17},"d":{"e":{"n":4,"m":194}},"g":46,"h":57,"l":{"a":{"t":3},"l":{"a":0,"i":{"n":6}},"o":18},"n":{"d":5,"e":0,"i":{"c":0,"s":5,"z":11},"t":{"y":0},"y":17},"p":{"e":{"r":4}},"r":{"o":{"m":5}},"s":{"t":{"e":{"r":6},"i":{"g":5}},"y":18},"t":{"h":1,"i":{"v":18},"a":{"s":195}},"v":{"a":{"l":5}}},41],"c":[{"h":{"a":6},"i":{"a":0},"o":{"m":{"p":{"a":10}},"n":17,"u":{"t":12}}},23],"e":{".":25,"d":{".":18,"e":{"n":18}},"i":27,"l":{".":32,"l":27},"n":[{"c":27,"e":58,"i":18,"t":27},41],"p":27,"r":{"a":{"m":4}},"s":{"a":18,"s":{"i":[{"b":59},27]},"t":5},"t":[{"a":60},0],"w":0},"h":[{".":18,"a":{"b":61,"n":{"i":{"c":32,"s":20}}},"e":[{"a":{"p":54},"d":18,"l":{"o":5},"m":{"i":27},"n":{"e":4},"r":{".":3,"s":3}},8],"i":{"n":[{"e":{".":32,"s":{"s":4}},"i":32},62],"o":32,"t":27,"z":8,"e":{"v":{"o":6}}},"o":63,"t":{"i":1},"s":{".":18,"h":{"u":11}}},25],"i":[{"a":[{"b":64,"r":5},27],"c":4,"e":{"r":18},"f":{"i":{"c":{".":32}}},"i":18,"l":{"a":1,"i":27},"m":25,"n":[{"a":[{"t":27},21],"e":{"m":11},"g":[{".":19},29],"o":32,"q":8},25],"o":{"n":17},"p":{"e":18,"h":3,"i":{"c":18}},"s":{"t":{"a":18,"i":18}},"t":[{"i":{"z":11}},42],"z":32,"g":{"a":{"r":152}}},41],"k":[{"i":3},2],"l":[{"a":{"r":[{"a":{"t":{"i":{"o":19}}},"e":32},18]},"e":{"m":0,"a":{"r":0}},"i":{"c":18,"m":17},"y":0},65],"n":19,"o":[{"a":{"g":4},"e":8,"g":[{"r":1},25],"i":[{"n":{"c":3}},0],"l":{"i":5,"o":[{"r":11},32]},"m":{"e":{"r":5}},"n":{"a":0,"e":21,"g":11,"t":5},"p":{"a":3,"i":{"c":11},"l":1,"h":{"o":{"n":196}}},"r":{"b":18,"o":{"n":12}},"s":{"e":0},"v":[{"e":17},15],"w":{"a":5},"z":{"e":5,"i":4},"u":{"s":{"t":{"i":84}}}},41],"q":29,"r":{"a":{"s":{"t":6},"t":{".":32,"i":{"c":32}}},"e":{"a":{"t":11},"d":32,"t":{"a":47},"v":0},"i":[{"f":5,"n":21,"s":17,"t":{"i":[{"e":11},32]}},8],"o":{"p":{"l":0,"o":6},"s":{"e":17},"c":{"o":{"d":197}},"e":{"c":{"o":148}}},"u":{"d":0}},"s":66,"t":[{"a":{"b":0,"n":{"g":4,"t":19}},"e":[{"r":23},24],"i":{"c":{"u":21},"m":{"i":12}},"u":{"r":0},"w":21,"r":{"o":{"m":{"e":{"c":198}}}}},42],"u":{"d":5,"f":21,"i":[{"t":{"y":4}},21],"l":{"i":32,"t":{"i":{"s":0},"u":27}},"m":{"a":9,"e":23,"i":1},"n":27,"p":{"i":3,"y":4},"r":{"a":{"b":67,"n":{"c":{"e":199}}},"i":{"a":4}},"s":[{"s":{"i":17}},41],"t":[{"i":{"e":1,"v":56},"r":18},68]},"y":41,"z":{"e":0}},"d":{"a":[{".":32,"b":70,"c":{"h":17},"f":18,"g":25,"m":71,"n":{"g":11},"r":{"d":6,"k":6,"y":18},"t":[{"i":{"v":18},"o":18,"a":{"b":137}},27],"v":[{"e":5},53],"y":32,"l":{"o":{"n":{"e":48}}}},69],"b":29,"c":19,"d":[{"a":{"b":20},"i":{"b":94}},72],"e":{".":25,"a":{"f":6,"l":{"s":{".":1}}},"b":{"i":{"t":5},"o":{"n":1}},"c":{"a":{"n":36},"i":{"l":1},"o":{"m":4},"l":{"a":{"r":200},"i":{"n":{"a":64}}}},"d":42,"e":{".":18},"i":{"f":4},"l":{"i":{"e":17,"q":16},"o":4},"m":[{".":32,"i":{"c":[{".":5},27],"l":4},"o":{"n":{"s":1},"r":7,"s":9}},21],"n":[{"a":{"r":1},"o":3,"t":{"i":{"f":7}},"u":3},41],"p":[{"a":3,"i":17,"u":9},2],"q":23,"r":{"h":21,"m":32,"n":{"i":{"z":6}},"s":5},"s":[{".":24,"c":2,"o":64,"t":{"i":11,"r":3},"u":1,"i":{"c":11}},8],"t":[{"o":9,"i":{"c":9}},2],"v":[{"i":{"l":11}},2],"y":18,"f":{"i":{"n":{"i":{"t":{"i":201}}}}}},"f":43,"g":{"a":21,"e":{"t":73},"i":2,"y":24},"h":74,"i":{".":32,"a":[{"b":5},75],"c":{"a":{"m":1,"i":{"d":15}},"e":21,"t":27},"d":27,"e":{"n":76},"f":[{"f":{"r":{"a":5}}},29],"g":{"e":3},"l":{"a":{"t":{"o":1}}},"n":[{"a":41,"e":{".":27},"i":[{"z":4},32]},29],"o":[{"g":5},41],"p":{"l":1},"r":[{"e":[{"n":9,"r":9},2],"t":{"i":6}},8],"s":[{"i":32,"t":77},15],"t":{"i":24},"v":78,"m":{"e":{"t":{"h":{"y":141}}}}},"j":29,"k":79,"l":{"a":56,"e":{".":27,"d":27,"s":{".":27,"s":18},"a":{"d":42}},"o":48,"u":56,"y":25,"i":{"e":202}},"m":29,"n":80,"o":[{".":27,"d":{"e":4},"e":32,"f":57,"g":21,"l":{"a":1,"i":17,"o":{"r":4}},"m":{"i":{"z":5}},"n":{"a":{"t":3},"i":17},"o":{"d":11},"p":{"p":0},"r":21,"s":27,"u":{"t":56},"v":1,"x":27,"w":{"o":{"r":{"d":203}}}},41],"p":29,"r":[{"a":{"g":{"o":{"n":6}},"i":18},"e":[{"a":{"r":6},"n":[{"a":{"l":204}},32]},0],"i":{"b":0,"l":17,"f":{"t":{"a":189}},"p":{"l":{"e":{"g":205}}}},"o":{"p":0,"w":18,"m":{"e":{"d":206}}},"u":{"p":{"l":{"i":32}}},"y":18},41],"s":[{"p":1,"w":21,"y":21},81],"t":{"h":24,"a":{"b":23}},"u":[{"a":[{"l":{".":9}},82],"c":[{"a":29,"e":{"r":5},"t":{".":18,"s":18}},9],"e":{"l":4},"g":1,"l":{"e":23},"m":{"b":{"e":0}},"n":1,"p":[{"e":1},18],"o":{"p":{"o":{"l":207}}}},41],"v":29,"w":29,"y":[{"n":32,"s":{"e":1,"p":5}},24]},"e":{"a":{"b":72,"c":{"t":23},"d":[{"i":{"e":5}},15],"g":{"e":[{"r":4},1]},"l":[{"e":{"r":5},"o":{"u":11}},1],"m":{"e":{"r":11}},"n":{"d":19,"i":{"e":{"s":111}}},"r":{"a":11,"c":0,"e":{"s":5},"i":{"c":0,"l":0},"k":5,"t":[{"e":12},8]},"s":{"p":4,"s":23,"t":12},"t":[{"e":{"n":5},"h":{"i":12},"i":{"f":19},"u":83},9],"v":[{"e":{"n":11},"i":5,"o":5},9]},"b":[{"e":{"l":{".":21,"s":21},"n":21},"i":{"t":21},"r":23},42],"c":{"a":{"d":21,"n":{"c":6}},"c":{"a":6},"e":[{"s":{"s":{"a":4}}},29],"i":[{"b":21,"f":{"i":{"c":{"a":{"t":4}},"e":4},"y":4},"m":3,"t":[{"e":19},0]},9],"l":{"a":{"m":21},"u":{"s":21}},"o":{"l":24,"m":{"m":21,"p":{"e":21}},"n":{"c":21},"r":[{"a":3,"o":5},24]},"r":[{"e":{"m":21}},29],"t":{"a":{"n":1},"e":1},"u":[{"l":[{"a":3},21]},29],"h":{"a":{"s":23}}},"d":{"a":37,"d":61,"e":{"r":34,"s":0},"i":[{"a":23,"b":3,"c":{"a":3},"m":3,"t":2,"z":5},18],"o":[{"l":21,"n":84},18],"r":{"i":21},"u":{"l":[{"o":4,"i":{"n":{"g":2}}},21]},"g":{"l":15}},"e":{"c":9,"d":{"i":11},"f":9,"l":{"i":11,"y":1},"m":9,"n":{"a":1},"p":85,"s":[{"t":17},86],"t":{"y":1},"x":19},"f":[{"e":{"r":{"e":83}},"f":41,"i":{"c":[{"i":32},21],"l":17,"n":{"e":23,"i":{"t":{"e":20}}},"t":27},"o":{"r":{"e":{"s":6}}},"u":{"s":{"e":{".":21}}}},29],"g":{"a":{"l":18},"e":{"r":17},"i":{"b":4,"c":1,"n":{"g":4},"t":87},"n":4,"o":{".":21,"s":21},"u":{"l":2,"r":19},"y":32},"h":[{"e":{"r":17}},72],"i":[{"c":19,"d":4,"g":[{"l":4},8],"m":{"b":23},"n":{"f":23,"g":29,"s":{"t":19}},"r":{"d":0},"t":{"e":11,"h":3,"y":19}},9],"j":[{"u":{"d":[{"i":4},21]}},29],"k":{"i":{"n":0},"l":{"a":1}},"l":{"a":[{".":21,"c":21,"n":{"d":17},"t":{"i":{"v":4}},"w":21,"x":{"a":36}},29],"e":{"a":23,"b":{"r":{"a":4}},"c":32,"d":21,"g":{"a":3},"n":19,"r":34,"s":29},"f":9,"i":[{"b":{"e":23},"c":{".":33,"a":3},"e":{"r":23},"g":{"i":{"b":4}},"m":19,"n":{"g":83},"o":23,"s":[{"h":4},24],"v":88,"t":{"i":{"s":208}}},9],"l":{"a":[{"b":1},18],"o":17},"o":{"c":19,"g":4,"p":{".":3},"a":29},"s":{"h":9},"t":{"a":1},"u":{"d":19,"g":4}},"m":{"a":{"c":21,"g":21,"n":[{"a":4},19]},"b":4,"e":[{"l":24,"t":21},29],"i":{"c":{"a":3},"e":0,"g":{"r":{"a":4}},"n":[{"e":4,"i":35},89],"s":[{"h":4,"s":19},21],"z":3},"n":{"i":{"z":32}},"o":{"g":0,"n":{"i":{"o":7}}},"p":{"i":3},"u":{"l":[{"a":4},21],"n":11},"y":23},"n":{"a":{"m":{"o":4},"n":{"t":21}},"c":{"h":{"e":{"r":17}}},"d":{"i":{"c":3,"x":2}},"e":{"a":19,"e":19,"m":3,"r":{"o":4},"s":{"i":4,"t":4},"t":{"r":3},"w":23},"i":{"c":{"s":4},"e":19,"l":19,"o":23,"s":{"h":3},"t":3,"u":19,"z":32},"n":18,"o":[{"g":0,"s":21,"v":3},18],"s":{"w":1},"t":{"a":{"g":{"e":5}},"h":{"e":{"s":18}}},"u":{"a":3,"f":4},"y":{".":23},"z":61},"o":{"f":19,"g":[{"r":{"a":{"p":3}}},9],"i":90,"l":23,"p":{"a":{"r":11}},"r":[{"e":3,"o":{"l":4}},29],"s":0,"t":[{"o":1},21],"u":{"t":19},"w":19},"p":{"a":[{"i":23,"n":{"c":4}},24],"e":{"l":19,"n":{"t":23},"t":{"i":{"t":{"i":{"o":4}}}}},"h":{"e":17},"l":{"i":21},"o":29,"r":{"e":{"c":[{"a":4},21],"d":21,"h":3},"o":[{"b":21},23]},"s":{"h":1},"t":{"i":{"b":13}},"u":{"t":[{"a":4},21]},"i":{"n":{"e":{"p":{"h":209}}}}},"q":[{"u":{"i":{"l":12,"s":91}}},29],"r":{"a":[{"b":0,"n":{"d":18},"r":3,"t":{"i":{".":18}}},2],"b":[{"l":1},25],"c":{"h":[{"e":1},3]},"e":{".":25,"a":{"l":23},"c":{"o":5},"i":{"n":11},"l":{".":4},"m":{"o":3},"n":{"a":4,"c":{"e":4},"e":18,"t":3},"q":0,"s":{"s":4,"t":3},"t":17},"h":2,"i":[{"a":[{"n":{".":210}},92],"c":{"k":32},"e":{"n":23,"r":0},"n":{"e":3},"o":29,"t":18,"u":1,"v":[{"a":21},0]},2],"m":93,"n":{"i":{"s":1,"t":18,"z":32},"o":3},"o":[{"b":4,"c":19,"r":0,"u":2},25],"s":[{"e":{"t":3}},2],"t":{"e":{"r":11},"l":18,"w":3},"u":[{"t":0},18],"w":{"a":{"u":32}}},"s":{"a":[{"g":{"e":{".":21,"s":21}}},72],"c":[{"a":[{"n":4},24],"r":23,"u":4},9],"e":[{"c":[{"r":4},24],"n":{"c":4},"r":{"t":{".":21,"s":21},"v":{"a":21}}},74],"h":[{"a":23,"e":{"n":5}},18],"i":[{"c":24,"d":[{"e":{"n":4}},24],"g":{"n":{"a":4}},"m":94,"n":95,"s":{"t":{"e":17}},"u":0},29],"k":{"i":{"n":19}},"m":{"i":1},"o":{"l":[{"u":3},24],"n":[{"a":4},24]},"p":[{"e":{"r":3},"i":{"r":{"a":4}},"r":{"e":1},"a":{"c":{"i":211}}},29],"s":[{"i":{"b":96}},25],"t":{"a":{"n":36},"i":{"g":3,"m":4},"o":[{"n":23},44],"r":[{"o":19,"u":{"c":10}},25]},"u":{"r":[{"r":4},24]},"w":1},"t":{"a":{"b":0},"e":{"n":{"d":17},"o":23},"h":{"o":{"d":54},"y":{"l":{"e":{"n":{"e":162}}}}},"i":{"c":2,"d":{"e":19},"n":[{"o":0},17],"r":19,"t":{"i":{"o":19,"v":4}}},"n":18,"o":{"n":{"a":4}},"r":{"a":23,"e":23,"i":{"c":3,"f":4},"o":{"g":3,"s":4}},"u":{"a":3},"y":{"m":4},"z":4},"u":[{"n":19,"p":23,"r":{"o":3},"s":0,"t":{"e":17,"i":{"l":6},"r":4},"c":{"l":{"i":{"d":212}}}},18],"v":{"a":{"p":97,"s":[{"t":4},24]},"e":{"a":19,"l":{"l":3,"o":12},"n":{"g":19,"i":17},"r":[{"b":19},2]},"i":[{"d":3,"l":0,"n":21,"v":0},29],"o":{"c":19},"u":19},"w":{"a":[{"g":21},29],"e":{"e":19},"h":23,"i":{"l":6,"n":{"g":3},"t":23}},"x":{"p":41},"y":{"c":32,"e":{".":32},"s":0}},"f":{"a":[{"b":{"l":3,"r":11},"c":{"e":1},"g":18,"i":{"n":17},"l":{"l":{"e":6}},"m":{"a":26,"i":{"s":5}},"r":[{"t":{"h":5}},32],"t":{"a":3,"h":{"e":3},"o":18},"u":{"l":{"t":7}}},41],"b":56,"d":18,"e":{".":18,"a":{"s":17,"t":{"h":54}},"b":[{"r":{"u":{"a":15}}},1],"c":{"a":18,"t":32},"d":25,"l":{"i":3},"m":{"o":1},"n":{"d":[{"e":6},8]},"r":[{"r":32,"m":{"i":{"o":213}}},15],"v":0},"f":[{"e":{"s":21},"i":{"e":21,"n":{".":19},"s":94},"l":{"y":21},"y":24},43],"h":18,"i":[{"a":3,"c":{".":48,"a":{"l":47,"n":23,"t":{"e":18}},"e":{"n":23,"r":3},"i":[{"a":32,"e":32},0],"s":18,"u":3,"h":27},"d":{"e":{"l":4}},"g":{"h":{"t":7}},"l":{"i":5,"l":{"i":{"n":6}},"y":18},"n":[{"a":32,"d":97,"e":9,"g":98,"n":0},25],"s":{"t":{"i":0}},"t":{"t":{"e":{"d":{".":5}}}}},41],"l":[{"e":{"s":{"s":19}},"i":{"n":17},"o":{"r":{"e":11},"w":{"e":{"r":{".":84}}}},"y":100,"a":{"g":{"e":{"l":214}}},"u":{"o":{"r":27}}},99],"m":18,"n":18,"o":[{"n":[{"d":{"e":0},"t":0},32],"r":[{"a":{"t":4,"y":5},"e":{"t":6},"i":0,"t":{"a":6}},9],"s":5},41],"p":56,"r":{"a":{"t":0},"e":{"a":19,"s":{"c":6}},"i":[{"l":17},8],"o":{"l":6}},"s":48,"t":[{"o":21,"y":24},25],"u":[{"e":{"l":4},"g":18,"m":{"i":{"n":1}},"n":{"e":4},"r":{"i":3},"s":{"i":17,"s":0},"t":{"a":18}},27],"y":41},"g":{"a":[{"f":0,"l":{".":32,"i":27,"o":3},"m":[{"e":{"t":4},"o":19},25],"n":{"i":{"s":5,"z":[{"a":6},3]},"o":18},"r":{"n":67},"s":{"s":17},"t":{"h":12,"i":{"v":18}},"z":18},41],"b":23,"d":1,"e":{".":25,"d":25,"e":{"z":17},"l":{"i":{"n":0,"s":4,"z":4},"y":18},"n":[{"a":{"t":1},"i":{"z":4},"o":18,"y":18,"c":{"y":{".":8}}},41],"o":[{"m":3,"d":215},41],"r":{"y":21},"s":{"i":32},"t":{"h":6,"o":18,"y":1,"i":{"c":{".":8}}},"v":1},"g":[{"e":[{"r":23},24],"l":{"u":6},"o":0},101],"h":{"i":{"n":3},"o":{"u":{"t":4}},"t":{"o":1,"w":{"e":15}}},"i":{".":32,"a":[{"r":5},102],"c":[{"i":{"a":32},"o":21},29],"e":{"n":6,"s":{".":32}},"l":0,"m":{"e":{"n":23}},"n":{".":68,"g":{"e":5},"s":103},"o":32,"r":[{"l":0},27],"s":{"l":23},"u":1,"v":32,"z":27},"l":[{"a":[{"d":{"i":6},"s":32},0],"e":[{"a":{"d":29}},41],"i":{"b":0,"g":23,"s":{"h":43}},"o":[{"r":11,"b":{"i":{"n":106}}},27]},9],"m":[{"y":21},29],"n":{"a":[{".":21,"c":69},1],"e":{"t":{"t":17,"i":{"s":{"m":137}}}},"i":[{"n":24,"o":21},29],"o":[{"n":21,"m":{"o":5},"r":{".":216,"e":{"s":{"p":24}}}},29]},"o":[{".":27,"b":5,"e":32,"g":104,"i":{"s":3},"n":[{"a":105,"d":{"o":7},"i":[{"z":{"a":217}},3]},8],"o":32,"r":{"i":{"z":4},"o":{"u":5}},"s":{".":32},"v":15},41],"p":23,"r":[{"a":{"d":{"a":18},"i":21,"n":84,"p":{"h":{".":32,"e":{"r":[{".":7},19]},"i":{"c":32},"y":18}},"y":18},"e":{"n":0,"s":{"s":{".":18}}},"i":{"t":18,"e":{"v":213}},"o":21,"u":{"f":17}},41],"s":[{"t":{"e":19}},9],"t":{"h":11},"u":{"a":[{"r":{"d":27}},1],"e":25,"i":{"t":106},"n":27,"s":27,"t":[{"a":{"n":29}},26]},"w":23,"y":[{"n":107,"r":{"a":4}},41]},"h":{"a":{"b":{"l":73},"c":{"h":17},"e":{"m":0,"t":0},"g":{"u":19},"l":{"a":[{"m":12},3]},"m":1,"n":{"c":{"i":0,"y":0},"d":{".":32},"g":[{"e":{"r":6},"o":6},0],"i":{"z":108},"k":0,"t":{"e":0}},"p":{"l":11,"t":5,"a":{"r":{"r":218}}},"r":{"a":{"n":3,"s":4},"d":[{"e":12},8],"l":{"e":0},"p":{"e":{"n":6}},"t":{"e":{"r":5}}},"s":{"s":5},"u":{"n":17},"z":[{"a":11},32],"i":{"r":{"s":137}},"t":{"c":{"h":213}}},"b":29,"e":{"a":{"d":41,"r":27},"c":{"a":{"n":1,"t":19}},"d":[{"o":13},21],"l":{"i":93,"l":{"i":{"s":0},"y":0},"o":19},"m":{"p":0},"n":[{"a":[{"t":5},17]},9],"o":{"r":5},"p":5,"r":{"a":[{"p":12},21],"b":{"a":0},"e":{"a":6},"n":23,"o":{"u":19},"y":23},"s":[{"p":64},29],"t":[{"e":{"d":0}},1],"u":0,"x":{"a":168}},"f":29,"h":29,"i":{"a":{"n":4},"c":{"o":1},"g":{"h":6},"l":109,"m":{"e":{"r":36}},"n":{"a":21},"o":{"n":{"e":17}},"p":[{"e":{"l":{"a":219}}},1],"r":{"l":0,"o":3,"p":0,"r":0},"s":{"e":{"l":11},"s":0},"t":{"h":{"e":{"r":6}},"e":{"s":{"i":{"d":12}}}},"v":9},"k":18,"l":[{"a":{"n":17},"o":[{"r":{"i":11}},24]},80],"m":[{"e":{"t":17}},43],"n":[{"a":{"u":{"z":12}}},42],"o":{"d":{"i":{"z":19},"s":19},"g":[{"e":17},1],"l":{"a":{"r":5},"e":110},"m":{"a":1,"e":12},"n":{"a":0,"y":4},"o":{"d":27,"n":17},"r":{"a":{"t":5},"i":{"s":4,"c":{".":187}},"t":{"e":12},"u":4},"s":{"e":[{"n":4},0],"p":15},"u":{"s":[{"e":54},41]},"v":{"e":{"l":5}}},"p":56,"r":[{"e":{"e":6},"o":{"n":{"i":{"z":5}},"p":{"o":11}}},26],"s":[{"h":21},101],"t":{"a":{"r":21},"e":{"n":2,"s":4,"o":{"u":216}},"y":21},"u":{"g":1,"m":{"i":{"n":1}},"n":{"k":{"e":5},"t":0},"s":{"t":14},"t":1},"w":[{"a":{"r":{"t":21}}},29],"y":{"p":{"e":3,"h":3,"o":{"t":{"h":{"a":137}}}},"s":9}},"i":{"a":[{"l":24,"m":[{"e":{"t":{"e":5}}},0],"n":[{"c":18,"i":11,"t":46},24],"p":{"e":4},"s":{"s":17},"t":{"i":{"v":21},"r":{"i":{"c":1}},"u":21}},42],"b":{"e":[{"r":{"a":3,"t":4}},0],"i":{"a":4,"n":3,"t":{".":4,"e":4}},"l":[{"i":3},29],"o":19,"r":[{"i":94},29],"u":{"n":19}},"c":{"a":{"m":18,"p":32,"r":[{".":21,"a":21},18],"s":6,"y":21},"c":{"u":17},"e":{"o":18},"h":18,"i":[{"d":19,"n":{"a":4},"p":[{"a":3},24]},25],"l":{"y":21},"o":{"c":94},"r":[{"a":32,"y":21},43],"t":{"e":1,"u":[{"a":111},84]},"u":{"l":{"a":3},"m":1,"o":4,"r":23}},"d":[{"a":{"i":21,"n":{"c":4}},"d":4,"e":{"a":{"l":11},"s":0},"i":[{"a":{"n":4,"r":0},"e":19,"o":[{"u":5,"s":1},3],"t":2,"u":4},24],"l":{"e":23},"o":{"m":21,"w":3},"r":21,"u":[{"o":4},24]},25],"e":[{"d":{"e":0},"g":{"a":113},"l":{"d":12},"n":{"a":67,"e":0,"n":19,"t":{"i":23}},"r":{".":29},"s":{"c":23,"t":29},"t":23},112],"f":{".":18,"e":{"r":{"o":4}},"f":{"e":{"n":5},"r":1},"i":{"c":{".":18},"e":23},"l":23,"t":18,"a":{"c":{"e":{"t":137}}}},"g":[{"a":{"b":5},"e":{"r":{"a":3}},"h":{"t":{"i":12}},"i":[{"b":23,"l":3,"n":3,"t":3},18],"l":28,"o":[{"r":3,"t":4},24],"r":{"e":19},"u":{"i":5,"r":2},"n":{"i":{"t":[{"e":{"r":213}},0]}}},25],"h":23,"i":114,"j":[{"k":21},23],"k":18,"l":{"a":[{"b":93,"d":{"e":21},"m":94,"r":{"a":5}},29],"e":{"g":23,"r":2,"v":17},"f":4,"i":[{"a":3,"b":9,"o":3,"s":{"t":1},"t":25,"z":9},2],"l":{"a":{"b":5}},"n":18,"o":{"q":3},"t":{"y":1},"u":{"r":4},"v":3},"m":{"a":{"g":[{"e":3},21],"r":{"y":5}},"e":{"n":{"t":{"a":{"r":10}}},"t":18},"i":[{"d":{"a":4},"l":{"e":5},"n":{"i":19},"t":18},2],"n":{"i":1},"o":{"n":23},"u":[{"l":{"a":3}},24],"p":{"e":{"d":{"a":201}}}},"n":{".":25,"a":{"u":83,"v":18},"c":{"e":{"l":36,"r":3}},"d":[{"l":{"i":{"n":{"g":4}}}},18],"e":[{"e":23,"r":{"a":{"r":17}},"s":{"s":19}},25],"g":{"a":18,"e":[{"n":4},18],"i":18,"l":{"i":{"n":{"g":4}}},"o":18,"u":18},"i":[{".":19,"a":21,"o":3,"s":2,"t":{"e":{".":19,"l":{"y":{".":19}}},"i":{"o":32},"y":3}},25],"k":18,"l":18,"n":25,"o":[{"c":90,"s":0,"t":21},42],"s":[{"e":3,"u":{"r":{"a":7}}},25],"t":{".":25,"h":112},"u":[{"s":19},2],"y":18,"f":{"r":{"a":{"s":220}}}},"o":[{".":18,"g":{"e":17,"r":9},"l":29,"m":1,"n":{"a":{"t":11},"e":{"r":{"y":0}},"i":11},"p":{"h":4},"r":{"i":11},"s":21,"t":{"h":4,"i":19,"o":1},"u":{"r":21}},25],"p":[{"e":0,"h":{"r":{"a":{"s":115}}},"i":[{"c":1},3],"r":{"e":96},"u":{"l":3}},25],"q":{"u":{"a":23,"e":{"f":4},"i":{"d":3,"t":116}}},"r":[{"a":[{"b":0,"c":21},29],"d":{"e":5},"e":{"d":{"e":0},"f":21,"l":117,"s":21},"g":{"i":4},"i":[{"d":{"e":5},"s":1,"t":{"u":11},"z":118},2],"m":{"i":{"n":1}},"o":{"g":0,"n":{".":32}},"u":{"l":4},"r":{"e":{"v":{"o":{"c":221}}}}},18],"s":{".":25,"a":{"g":4,"r":3,"s":6},"c":[{"h":3},119],"e":[{"r":3},18],"f":27,"h":{"a":{"n":4},"o":{"n":3,"p":5}},"i":{"b":3,"d":0,"s":19,"t":{"i":{"v":4}}},"k":26,"l":{"a":{"n":36}},"m":{"s":18},"o":[{"m":{"e":{"r":5}}},24],"p":[{"i":9,"y":1},2],"s":[{"a":{"l":1},"e":{"n":36,"s":1}},62],"t":{"a":{".":1},"e":2,"i":2,"l":{"y":0},"r":{"a":{"l":18}}},"u":[{"s":4},24]},"t":{"a":{".":18,"b":{"i":0},"g":21,"m":120,"n":23,"t":23},"e":[{"r":{"a":3,"i":19},"s":[{"i":{"m":{"a":29}}},1]},25],"h":[{"i":{"l":148}},25],"i":[{"a":18,"c":[{"a":3,"k":31},22],"g":3,"l":{"l":4},"m":24,"o":25,"s":[{"m":21},18],"n":{"e":{"r":{"a":{"r":158}}}}},29],"o":{"m":121,"n":18},"r":{"a":{"m":21},"y":4},"t":18,"u":{"a":{"t":3},"d":19,"l":3},"z":{".":18}},"u":29,"v":[{"e":{"l":{"l":3},"n":{".":3},"r":{".":83,"s":{".":21}}},"i":{"l":{".":4},"o":4,"t":2},"o":{"r":{"e":19,"o":35},"t":83}},25],"w":56,"x":{"o":1},"y":18,"z":{"a":{"r":18},"i":0,"o":{"n":{"t":32}}}},"j":{"a":[{"c":{"q":0},"p":[{"a":{"n":{"e":{"s":220}}}},1],"n":{"u":{"a":12}}},32],"e":[{"r":{"s":5,"e":{"m":222}},"s":{"t":{"i":{"e":18},"y":18}},"w":11},41],"o":{"p":1},"u":{"d":{"g":32}}},"k":{"a":{".":27,"b":23,"g":19,"i":{"s":17},"l":0},"b":29,"e":{"d":24,"e":41,"g":1,"l":{"i":[{"n":{"g":223}},4]},"n":{"d":73},"r":29,"s":[{"t":{".":23}},0],"t":{"y":1}},"f":23,"h":1,"i":[{".":32,"c":122,"l":{"l":21,"o":6},"m":21,"n":{".":21,"d":{"e":0},"e":{"s":{"s":19},"t":{"i":{"c":224}}},"g":0},"p":1,"s":[{"h":19},0]},29],"k":1,"l":[{"e":{"y":18},"y":18},29],"m":29,"n":{"e":{"s":19},"o":69},"o":{"r":4,"s":{"h":17},"u":23,"v":{"i":{"a":{"n":41}}}},"r":{"o":{"n":5}},"s":[{"c":21,"l":1,"y":21,"h":{"a":23}},101],"t":19,"w":29},"l":{"a":{"b":{"i":{"c":11},"o":21},"c":{"i":[{"e":225},17]},"d":{"e":21,"y":3},"g":{"n":0},"m":{"o":11},"n":{"d":[{"l":0},27],"e":{"t":5},"t":{"e":0}},"r":{"g":0,"i":11,"c":{"e":{"n":176}}},"s":{"e":0},"t":{"a":{"n":4},"e":{"l":{"i":18}},"i":{"v":18}},"v":[{"a":95},18],"i":{"n":{"e":{"s":{"s":226}}}}},"b":[{"i":{"n":17}},42],"c":[{"e":0,"i":23,"h":{"a":{"i":23},"i":{"l":{"d":227}}}},101],"d":[{"e":[{"r":{"e":1,"i":1}},24],"i":[{"s":4},0],"r":[{"i":21},23]},25],"e":{"a":[{"d":{"e":{"r":{".":183}}},"s":{"a":228}},9],"b":{"i":1},"f":{"t":6},"g":{".":32,"g":32,"e":{"n":{"d":{"r":{"e":230}}}}},"m":{"a":{"t":[{"i":{"c":5}},1]}},"n":{".":18,"c":27,"e":{".":32},"t":41,"o":{"i":{"d":78}}},"p":{"h":3,"r":1},"r":{"a":{"b":6},"e":0,"g":27,"i":68,"o":21},"s":[{"c":{"o":4},"q":32,"s":[{".":32},27]},8],"v":{"a":23,"e":{"r":{".":0,"a":0,"s":0}}},"y":[{"e":18},27],"c":{"t":{"a":{"b":229}}}},"f":[{"r":19},25],"g":[{"a":[{"r":12},19],"e":{"s":21},"o":11},80],"h":48,"i":{"a":{"g":1,"m":9,"r":{"i":{"z":6}},"s":1,"t":{"o":1}},"b":{"i":4},"c":{"i":{"o":32},"o":{"r":1},"s":18,"t":{".":18},"u":21,"y":23},"d":{"a":23,"e":{"r":5},"i":27},"f":{"e":{"r":11},"f":21,"l":1},"g":{"a":{"t":{"e":32}},"h":27,"r":{"a":1}},"k":27,"l":123,"m":{"b":{"l":0},"i":11,"o":1,"p":90},"n":{"a":21,"e":[{"a":11},124],"i":11,"k":{"e":{"r":6}}},"o":{"g":4},"q":125,"s":{"p":0},"t":[{".":24,"i":{"c":{"a":32,"s":108}},"h":{"o":{"g":204}}},29],"v":{"e":{"r":11}},"z":29},"j":18,"k":{"a":[{"l":23,"t":0},11]},"l":[{"a":{"w":21},"e":[{"a":19,"c":23,"g":23,"l":23,"n":73,"t":73},24],"i":[{"n":[{"a":19},126],"s":{"h":231}},9],"o":[{"q":{"u":{"i":10}},"u":{"t":4},"w":19},1],"f":{"l":2}},29],"m":[{"e":{"t":19},"i":{"n":{"g":3}},"o":{"d":21,"n":[{"e":{"l":{"l":232}}},17]}},25],"n":81,"o":{".":27,"b":{"a":{"l":5},"o":{"t":{"o":233}}},"c":{"i":1},"f":18,"g":{"i":{"c":27},"o":19,"u":27,"e":{"s":{".":9}}},"m":{"e":{"r":11}},"n":{"g":32,"i":[{"z":127},0]},"o":{"d":6},"p":{"e":{".":32},"i":11,"m":23},"r":{"a":[{"t":{"o":1}},17],"i":{"e":4},"o":{"u":5}},"s":{".":32,"e":{"t":5},"o":{"p":{"h":{"i":{"z":32},"y":32}}},"t":0},"t":{"a":1},"u":{"n":{"d":6},"t":25},"v":18,"a":{"d":{"e":{"d":{".":17},"r":{".":183}}}}},"p":[{"a":{"b":5},"h":{"a":23,"i":19},"i":{"n":{"g":4},"t":23},"l":21,"r":19},25],"r":43,"s":[{"c":21,"e":24,"i":{"e":21}},81],"t":[{"a":{"g":4,"n":{"e":7}},"e":[{"n":17,"r":{"a":36},"a":23},29],"h":{"i":[{"l":{"y":148}},11]},"i":{"e":{"s":{".":19}},"s":17},"r":29,"u":[{"r":{"a":12}},8]},18],"u":{"a":4,"b":{"r":3},"c":{"h":17,"i":3},"e":{"n":3,"p":15},"f":0,"i":{"d":4},"m":{"a":1,"i":32,"n":{".":19,"i":{"a":32}},"b":{"i":{"a":{".":235}}}},"o":[{"r":11},3],"p":18,"s":{"s":17,"t":{"e":11}},"t":41,"n":{"k":{"e":{"r":234}}}},"v":{"e":{"n":19,"t":128}},"w":42,"y":[{"a":18,"b":18,"m":{"e":4},"n":{"o":3},"s":[{"e":19,"t":{"y":{"r":4}}},58],"g":{"a":{"m":{"i":236}}}},41]},"m":{"a":[{"b":25,"c":{"a":9,"h":{"i":{"n":{"e":4}}},"l":1},"g":{"i":{"n":5},"n":32},"h":25,"i":{"d":6},"l":{"d":18,"i":{"g":3,"n":4},"l":{"i":0},"t":{"y":0},"a":{"p":222}},"n":{"i":{"a":32,"s":5,"z":11},".":24,"u":{"s":{"c":237}}},"p":[{"h":{"r":{"o":244}}},18],"r":{"i":{"n":{"e":{".":4}},"z":4},"l":{"y":0},"v":11,"g":{"i":{"n":238}}},"s":{"c":{"e":4},"e":0,"t":15},"t":{"e":32,"h":12,"i":{"s":3,"z":{"a":18}}}},41],"b":[{"a":{"t":129},"i":{"l":19,"n":{"g":83},"v":0}},43],"c":56,"e":{".":18,"d":[{".":18,"i":{"a":32,"e":3,"c":[{"i":{"n":152}},84],"o":{"c":239}},"y":108},25],"g":[{"r":{"a":{"n":240}}},9],"l":{"o":{"n":5},"t":0},"m":[{"o":130},9],"n":[{"a":[{"c":5},0],"d":{"e":0},"e":18,"i":0,"s":[{"u":7},17],"t":[{"e":0},27],".":24},41],"o":{"n":4},"r":{"s":{"a":19}},"s":[{"t":{"i":27}},25],"t":{"a":[{"l":11},1],"e":2,"h":{"i":4},"r":[{"i":{"c":32,"e":4},"y":3},21]},"v":1},"f":43,"h":25,"i":{".":32,"a":3,"d":{"a":[{"b":241},0],"g":0},"g":0,"l":{"i":{"a":27,"e":108,"t":{"a":27}},"l":[{"a":{"g":208},"i":{"l":{"i":59}}},21]},"n":{"a":0,"d":27,"e":{"e":19},"g":{"l":[{"i":5,"y":19},21]},"t":0,"u":[{"t":{"e":{"r":242,"s":{"t":242}}}},21],"i":{"s":{".":174}}},"o":{"t":17},"s":[{"e":{"r":{".":0}},"l":5,"t":{"i":0,"r":{"y":19}}},24],"t":{"h":18},"z":24},"k":18,"l":43,"m":[{"a":{"r":{"y":5},"b":243}},29],"n":[{"a":1,"i":{"n":21},"o":1},43],"o":[{"c":{"r":[{"a":{"t":[{"i":{"z":32}},245]}},18]},"d":131,"g":{"o":1},"i":{"s":[{"e":5},84]},"k":18,"l":{"e":{"s":{"t":4},"c":246}},"m":{"e":3},"n":{"e":{"t":5,"y":{"l":247}},"g":{"e":5},"i":{"a":12,"s":{"m":0,"t":0},"z":3},"o":{"l":36,"c":{"h":12},"e":{"n":171},"s":249},"y":{".":3}},"r":[{"a":{".":18},"o":{"n":{"i":{"s":248}}}},9],"s":[{"e":{"y":4},"p":3},8],"t":{"h":[{"e":{"t":250}},12]},"u":{"f":19,"s":[{"i":{"n":98}},27]},"v":9,"e":{"l":{"a":{"s":167}}}},41],"p":[{"a":{"r":{"a":[{"b":5},7],"i":6}},"e":{"t":23},"h":{"a":{"s":36}},"i":[{"a":0,"e":{"s":4},"n":34,"r":19,"s":4},24],"o":{"r":{"i":11},"s":{"i":{"t":{"e":6}}},"u":{"s":21},"v":6},"t":{"r":1},"y":24},43],"r":47,"s":[{"h":[{"a":{"c":{"k":251}}},21],"i":19},101],"t":18,"u":[{"l":{"a":{"r":49},"t":[{"i":[{"u":252},54]},32]},"m":27,"n":8,"p":18,"u":1,"d":{"r":{"o":9}}},41],"w":18},"n":{"a":[{"b":[{"u":21},81],"c":{".":18,"a":1,"t":19},"g":{"e":{"r":{".":5}}},"k":0,"l":{"i":[{"a":4},1],"t":18},"m":{"i":{"t":4}},"n":[{"c":{"i":36},"i":{"t":0},"k":17},24],"r":{"c":[{"h":{"s":{".":73}}},11],"e":18,"i":11,"l":0,"m":19},"s":[{"c":0,"t":{"i":5}},21],"t":[{"a":{"l":3},"o":{"m":{"i":{"z":6}}}},24],"u":[{"s":{"e":11},"t":27},24],"v":{"e":0}},41],"b":80,"c":{"a":{"r":6},"e":{"s":{".":21}},"h":{"a":23,"e":{"o":19,"s":{"t":253}},"i":{"l":19,"s":23}},"i":{"n":2,"t":1},"o":{"u":{"r":{"a":7}}},"r":29,"u":29},"d":{"a":{"i":21,"n":19},"e":[{"s":{"t":{".":4}}},29],"i":{"b":0,"f":79,"t":29,"z":23,"e":{"c":{"k":29}}},"u":{"c":19,"r":0},"w":{"e":9},"t":{"h":{"r":3}}},"e":{".":25,"a":{"r":23},"b":[{"u":11,"a":{"c":{"k":3}}},9],"c":[{"k":32},9],"d":25,"g":{"a":{"t":[{"i":{"v":5}},1]},"e":32},"l":{"a":1,"i":{"z":5}},"m":{"i":4,"o":1},"n":[{"e":18},41],"o":27,"p":{"o":1},"q":9,"r":[{"a":{"b":6,"r":21},"e":24,"i":132,"r":0},29],"s":[{".":25,"p":18,"t":25,"w":18,"k":{"i":119}},41],"t":{"i":{"c":27}},"v":[{"e":19},1],"w":1},"f":[{"i":{"n":{"i":{"t":{"e":{"s":226}}}}}},23],"g":{"a":{"b":21},"e":{"l":23,"n":{"e":[{"s":5},133]},"r":{"e":19,"i":23}},"h":{"a":4,"o":2},"i":{"b":23,"n":2,"t":19},"l":{"a":21},"o":{"v":17},"s":{"h":4,"p":{"r":2}},"u":[{"m":21},29],"y":24},"h":[{"a":[{"b":12},0],"e":0},80],"i":{"a":[{"n":[{".":114},3],"p":1},68],"b":{"a":3,"l":1},"d":[{"i":4},1],"e":{"r":1},"f":{"i":[{"c":{"a":{"t":4}}},9]},"g":{"r":19},"k":0,"m":[{"i":{"z":3}},29],"n":[{"e":{".":32},"g":0},29],"o":1,"s":{".":32,"t":{"a":0}},"t":[{"h":21,"i":{"o":27},"o":{"r":23},"r":3},24]},"j":29,"k":[{"e":{"r":{"o":19},"t":23},"i":{"n":3},"l":29,"r":{"u":{"p":3}}},44],"l":[{"e":{"s":{"s":19}}},43],"m":[{"e":[{"t":17},0]},19],"n":[{"e":0,"i":{"a":{"l":11},"v":0}},101],"o":{"b":{"l":[{"e":3},0]},"c":{"l":19,"e":{"r":{"o":{"s":254}}}},"d":66,"e":27,"g":[{"e":17},18],"i":{"s":{"i":6}},"l":{"i":134,"o":{"g":{"i":{"s":32}}}},"m":{"i":{"c":27,"z":108,"s":{"t":82}},"o":1,"y":3,"a":{"l":214},"e":{"n":{"o":194}}},"n":[{"a":{"g":0},"i":[{"z":19,"s":{"o":255}},5],"e":{"q":15}},1],"p":[{"o":{"l":{"i":135,"y":{".":256}}}},18],"r":{"a":{"b":5,"r":{"y":1}}},"s":{"c":18,"e":0,"t":5},"t":{"a":4},"u":[{"n":27},41],"v":{"e":{"l":136,"m":{"b":2}}},"w":{"l":12}},"p":[{"i":0,"r":{"e":{"c":17}}},72],"q":29,"r":[{"u":0},29],"s":[{"a":{"b":4,"t":{"i":36}},"c":[{"e":{"i":{"v":4}}},1],"e":[{"s":83},24],"i":{"d":137,"g":17},"l":24,"m":[{"o":{"o":1}},3],"o":{"c":21},"p":{"e":1,"i":19},"t":{"a":{"b":{"l":6}}}},81],"t":[{"a":{"b":0},"e":{"r":{"s":12}},"i":[{"b":19,"e":{"r":0},"f":8,"n":{"e":23,"g":83},"p":0},9],"r":{"o":{"l":{"l":{"i":7}}},"e":{"p":137}},"s":1,"u":{"m":{"e":11}}},29],"u":{"a":2,"d":1,"e":{"n":4},"f":{"f":{"e":0}},"i":{"n":23,"t":50},"m":[{"e":2,"i":19},21],"n":138,"o":23,"t":{"r":3}},"v":74,"w":72,"y":{"m":0,"p":0},"z":[{"a":23},18]},"o":{"a":[{"d":11,"l":{"e":{"s":108}},"r":{"d":12},"s":{"e":0,"t":{"e":6}},"t":{"i":5}},18],"b":{"a":{"b":35,"r":19},"e":{"l":0},"i":[{"n":[{"g":4},24]},29],"r":23,"u":{"l":3},"l":{"i":{"g":189}}},"c":{"e":29,"h":[{"e":{"t":23},"a":{"s":23}},0],"i":{"f":12,"l":21},"l":{"a":{"m":21}},"o":{"d":21},"r":{"a":{"c":3,"t":{"i":{"z":4}}},"e":12,"i":{"t":32}},"t":{"o":{"r":{"a":7}}},"u":{"l":{"a":3},"r":{"e":19}}},"d":{"d":{"e":{"d":4}},"i":{"c":3,"o":11,"t":{"i":{"c":137}}},"o":[{"r":12},139],"u":{"c":{"t":{".":4,"s":4}}},"e":{"l":{"l":{"i":12}}}},"e":{"l":21,"n":{"g":19},"r":[{"s":{"t":257}},23],"t":{"a":1},"v":23},"f":{"i":[{"t":{"e":4,"t":17}},24]},"g":{"a":{"r":121,"t":{"i":{"v":4},"o":21}},"e":[{"n":{"e":19},"o":19,"r":21},29],"i":{"e":23,"s":140,"t":3},"l":[{"y":79},21],"n":{"i":{"z":27}},"r":{"o":21},"u":{"i":5},"y":[{"n":25},41]},"h":[{"a":{"b":6}},74],"i":[{"c":{"e":{"s":11}},"d":{"e":{"r":3}},"f":{"f":17},"g":0,"l":{"e":{"t":4}},"n":{"g":23,"t":{"e":{"r":6}}},"s":{"m":19,"o":{"n":4},"t":{"e":{"n":6}}},"t":{"e":{"r":3}}},9],"j":19,"k":[{"e":{"n":23,"s":{"t":15}},"i":{"e":4}},25],"l":{"a":[{"n":21,"s":{"s":36}},29],"d":[{"e":15},9],"e":{"r":3,"s":{"c":23,"t":{"e":{"r":88}}},"t":23},"f":{"i":1},"i":[{"a":23,"c":{"e":23},"d":{".":4},"f":73,"l":19,"n":{"g":3},"o":19,"s":{".":19,"h":3},"t":{"e":19,"i":{"o":19}},"v":19,"g":{"o":{"p":{"o":258}}}},9],"l":{"i":{"e":17}},"o":{"g":{"i":{"z":4}},"r":0,"n":{"o":{"m":259}}},"p":{"l":4},"t":9,"u":{"b":3,"m":{"e":3},"n":3,"s":19},"v":9,"y":24},"m":{"a":{"h":4,"l":5,"t":{"i":{"z":4}}},"b":{"e":9,"l":1},"e":[{"n":{"a":3},"r":{"s":{"e":4}},"t":[{"r":{"y":4}},21],"c":{"h":{"a":260}}},24],"i":{"a":23,"c":{".":3,"a":3},"d":19,"n":[{"i":19},2]},"m":{"e":{"n":{"d":32}}},"o":{"g":{"e":0},"n":21},"p":{"i":3,"r":{"o":7}}},"n":[{"a":[{"c":1,"n":23},2],"c":[{"i":{"l":27}},2],"d":[{"o":4},25],"e":{"n":23,"s":{"t":4}},"g":{"u":1},"i":{"c":2,"o":23,"s":2,"u":19},"k":{"e":{"y":3}},"o":{"d":{"i":1},"m":{"y":3,"i":{"c":137}},"r":{"m":{"a":23}},"t":{"o":{"n":261}},"u":23},"s":[{"p":{"i":[{"r":{"a":10}},36]},"u":17},3],"t":{"e":{"n":36},"i":[{"f":7},93]},"u":{"m":4},"v":{"a":6}},24],"o":[{"d":{"e":5,"i":5},"k":1,"p":{"i":11},"r":{"d":23},"s":{"t":6}},9],"p":{"a":24,"e":{"d":5,"r":[{"a":[{"g":18},27]},2]},"h":[{"a":{"n":19},"e":{"r":19}},25],"i":{"n":{"g":3},"t":23,"s":{"m":{".":2}}},"o":{"n":19,"s":{"i":21}},"r":29,"u":2,"y":5},"q":29,"r":{"a":[{".":19,"g":83,"l":{"i":{"z":4}},"n":{"g":{"e":4}}},29],"e":{"a":[{"l":19},5],"i":3,"s":{"h":5,"t":{".":4}},"w":17},"g":{"u":1},"i":{"a":56,"c":{"a":3},"l":19,"n":2,"o":29,"t":{"y":3},"u":23},"m":{"i":9},"n":{"e":8},"o":{"f":19,"u":{"g":3}},"p":{"e":4},"r":{"h":27},"s":{"e":[{"n":5},1],"t":17},"t":{"h":{"i":3,"y":3,"o":{"n":{"i":{"t":262}}},"r":{"i":137}},"y":1,"i":{"v":{"e":{"l":{"y":4}}}}},"u":{"m":19},"y":29},"s":{"a":{"l":3},"c":[{"e":1,"o":{"p":[{"i":18},23]},"r":19},9],"i":{"e":95,"t":{"i":{"v":4},"o":3,"y":3},"u":0},"l":1,"o":24,"p":{"a":1,"o":1,"h":{"e":{"r":83}}},"t":{"a":[{"t":{"i":19}},9],"i":{"l":4,"t":4}}},"t":{"a":{"n":21},"e":{"l":{"e":{"g":36}},"r":{".":3,"s":4},"s":[{"t":{"e":{"r":263},"o":{"r":264}}},21]},"h":[{"e":{"s":{"i":5},"o":{"s":265}},"i":14},18],"i":{"c":{".":3,"a":4,"e":23},"f":23,"s":23},"o":{"s":5}},"u":[{"b":{"l":3,"a":{"d":{"o":116}}},"c":{"h":{"i":6}},"e":{"t":4},"l":1,"n":{"c":{"e":{"r":6}},"d":8},"v":4},9],"v":{"e":{"n":1,"r":{"n":{"e":17},"s":12,"t":1}},"i":{"s":23,"t":{"i":36},"a":{"n":{".":266}}},"o":{"l":60}},"w":{"d":{"e":{"r":3}},"e":{"l":3,"s":{"t":4}},"i":2,"n":{"i":5},"o":21},"y":{"a":2},"x":{"i":{"d":{"i":{"c":267}}}}},"p":{"a":[{"c":{"a":1,"e":1,"t":0},"d":21,"g":{"a":{"n":32,"t":23}},"i":[{"n":17},21],"l":[{"m":{"a":{"t":268}}},21],"n":{"a":0,"e":{"l":11},"t":{"y":0},"y":3},"p":[{"u":1},2],"r":{"a":{"b":{"l":6},"g":{"e":5,"r":{"a":269}},"l":{"e":228},"m":[{"e":12},36]},"d":{"i":5},"e":[{"l":5},27],"i":[{"s":0},28]},"t":{"e":[{"r":4},9],"h":{"i":{"c":32},"y":4},"r":{"i":{"c":1}}},"v":0,"y":27},41],"b":43,"d":1,"e":{".":18,"a":[{"r":{"l":17}},138],"c":9,"d":[{"e":27,"i":[{"a":36,"c":0},27]},37],"e":[{"d":0,"v":208},21],"k":0,"l":{"a":1,"i":{"e":17}},"n":{"a":{"n":1},"c":21,"t":{"h":0}},"o":{"n":4},"r":{"a":{".":21,"b":{"l":6},"g":21},"i":[{"s":{"t":6}},21],"m":{"a":{"l":0},"e":7},"n":21,"o":11,"t":{"i":11},"u":4,"v":15},"t":[{"e":{"n":4},"i":{"z":4}},9]},"f":18,"g":18,"h":{".":18,"a":{"r":{"i":6}},"e":{"n":{"o":11},"r":1,"s":{".":1}},"i":{"c":2,"e":32,"n":{"g":4},"s":{"t":{"i":32}},"z":27,"l":{"a":{"n":{"t":168},"t":{"e":{"l":270}}}}},"l":9,"o":{"b":27,"n":{"e":27,"i":32},"r":0},"s":18,"t":3,"u":32,"y":41},"i":{"a":[{"n":17},3],"c":{"i":{"e":1},"y":1,"a":{"d":271}},"d":[{"a":19,"e":3,"i":32},21],"e":{"c":27,"n":3},"g":{"r":{"a":{"p":1}}},"l":{"o":3},"n":[{".":21,"d":17,"o":21},9],"o":[{"n":17},141],"t":{"h":[{"a":4},23],"u":9}},"k":142,"l":[{"a":{"n":27,"s":{"t":6}},"i":{"a":11,"e":{"r":5},"g":18,"n":[{"a":{"r":5}},0],"c":{"a":{"b":208}}},"o":{"i":17},"u":{"m":[{"b":17},0]}},143],"m":43,"n":48,"o":{"c":1,"d":{".":32},"e":{"m":4,"t":144},"g":145,"i":{"n":[{"t":32,"c":{"a":12}},84]},"l":{"y":{"t":6,"e":137,"p":{"h":{"o":{"n":{"o":272}}}}},"e":{".":41}},"n":{"i":1},"p":1,"r":[{"y":1},124],"s":[{"s":15},41],"t":[{"a":1},21],"u":{"n":32}},"p":[{"a":{"r":{"a":5}},"e":[{"d":21,"l":19,"n":23,"r":23,"t":23},24],"o":{"s":{"i":{"t":{"e":5}}}}},43],"r":[{"a":{"y":{"e":17}},"e":{"c":{"i":32,"o":5},"e":{"m":11},"f":{"a":{"c":6}},"l":{"a":0},"r":11,"s":{"e":23,"s":27,"p":{"l":{"i":84}}},"t":{"e":{"n":5}},"v":11,"m":{"a":{"c":273}},"n":{"e":{"u":15}}},"i":{"e":53,"n":{"t":146},"s":[{"o":12},0]},"o":{"c":{"a":23,"e":{"s":{"s":8}},"i":{"t":{"y":{".":274}}}},"f":{"i":{"t":6}},"l":11,"s":{"e":12},"t":15,"g":{"e":208}}},9],"s":[{"e":[{"u":{"d":[{"o":{"d":276,"f":276}},275]}},24],"h":1,"i":{"b":21}},81],"t":[{"a":{"b":134},"e":24,"h":24,"i":{"m":11},"u":{"r":0},"w":21,"o":{"m":{"a":{"t":277}}},"r":{"o":{"l":278}}},42],"u":{"b":[{"e":{"s":{"c":181}}},11],"e":0,"f":0,"l":{"c":11},"m":1,"n":9,"r":{"r":0},"s":32,"t":[{"e":[{"r":11},32],"r":3,"t":{"e":{"d":0},"i":{"n":0}}},9]},"w":23},"q":{"u":[{"a":{"v":5,"i":{"n":{"t":{"e":279}}},"s":{"i":[{"r":281,"s":281},280]}},"e":{".":25,"r":27,"t":27},"i":{"n":{"t":{"e":{"s":{"s":282}}}},"v":{"a":{"r":14}}}},9]},"r":{"a":{"b":[{"i":3,"o":{"l":{"i":{"c":29},"o":{"i":236}}}},25],"c":{"h":{"e":17,"u":3},"l":19},"f":{"f":{"i":5},"t":0},"i":24,"l":{"o":1},"m":{"e":{"t":[{"r":{"i":{"z":283}}},11],"n":24},"i":24,"o":{"u":3}},"n":{"e":{"o":6},"g":{"e":0},"i":21,"o":4,"h":{"a":{"s":167}}},"p":{"e":{"r":11},"h":{"y":27}},"r":{"c":5,"e":[{"f":5},17],"i":{"l":18}},"s":24,"t":{"i":{"o":{"n":115}}},"u":{"t":0},"v":{"a":{"i":4},"e":{"l":11}},"z":{"i":{"e":4}},"d":{"i":{"g":127,"o":{"g":249}}},"o":{"r":2}},"b":[{"a":{"b":21,"g":21},"i":[{"f":0,"n":[{"e":19,"g":{".":4,"e":284}},24]},8],"o":1},29],"c":[{"e":[{"n":17},24],"h":{"a":23,"e":{"r":0}},"i":{"b":90,"t":1},"u":{"m":12}},29],"d":{"a":{"l":21},"i":[{"a":0,"e":{"r":0},"n":[{"g":3},17]},9]},"e":{".":25,"a":{"l":2,"n":3,"r":{"r":4},"v":32,"w":1},"b":{"r":{"a":{"t":19}}},"c":{"o":{"l":{"l":5},"m":{"p":{"e":5}}},"r":{"e":1},"i":{"p":{"r":285}},"t":{"a":{"n":{"g":286}}}},"d":[{"e":2,"i":{"s":3,"t":5}},37],"f":{"a":{"c":1},"e":[{"r":{".":4}},9],"i":3,"y":1},"g":{"i":{"s":11}},"i":{"t":4},"l":{"i":2,"u":4},"n":{"t":{"a":90,"e":0}},"o":2,"p":{"i":{"n":4},"o":{"s":{"i":1}},"u":2},"r":[{"i":21,"o":17,"u":4},147],"s":{".":21,"p":{"i":1},"s":{"i":{"b":6}},"t":[{"a":{"l":4},"r":3},8]},"t":{"e":{"r":1},"i":{"z":96},"r":{"i":[{"b":{"u":85}},3]}},"u":[{"t":{"i":4}},8],"v":[{"a":{"l":1},"e":{"l":11,"r":{".":30,"s":4,"t":4}},"i":{"l":4},"o":{"l":{"u":5}}},8],"w":{"h":1}},"f":[{"u":0,"y":21},29],"g":[{"e":{"r":3,"t":23},"i":{"c":23,"n":[{"g":3},0],"s":19,"t":19},"l":29,"o":{"n":0},"u":23},9],"h":[{".":18,"a":{"l":18}},1],"i":{"a":[{"b":0,"g":1,"l":{".":23}},3],"b":[{"a":11},21],"c":{"a":{"s":5},"e":21,"i":[{"d":32,"e":1},18],"o":21},"d":{"e":{"r":5}},"e":{"n":{"c":3,"t":3},"r":2,"t":4},"g":{"a":{"n":5},"i":32},"l":{"i":{"z":11}},"m":{"a":{"n":32},"i":5,"o":27,"p":{"e":0}},"n":{"a":[{".":32},24],"d":0,"e":0,"g":0},"o":2,"p":{"h":[{"e":6},32],"l":[{"i":{"c":5}},9]},"q":21,"s":[{".":21,"c":0,"h":23,"p":0},24],"t":{"a":{"b":116},"e":{"d":{".":19},"r":{".":5,"s":5}},"i":{"c":11},"u":[{"r":5},9]},"v":{"e":{"l":5,"t":11},"i":11,"o":{"l":287}}},"j":23,"k":{"e":{"t":23},"l":{"e":1,"i":{"n":1}},".":288,"h":{"o":2},"r":{"a":{"u":29}},"s":{".":288}},"l":[{"e":[{"d":24,"q":{"u":30}},0],"i":{"g":21,"s":[{"h":4},21]},"o":73},29],"m":[{"a":{"c":5},"e":[{"n":23,"r":{"s":4}},24],"i":{"n":{"g":[{".":21},3]},"o":21,"t":23},"y":21},29],"n":{"a":{"r":21},"e":{"l":23,"r":21,"t":19,"y":23},"i":{"c":19,"s":92,"t":23,"v":23},"o":[{"u":21},0],"u":23},"o":{"b":{"l":11,"o":{"t":289}},"c":[{"r":3},24],"e":[{"l":{"a":{"s":167}},"p":{"i":{"d":{"e":290}}}},1],"f":{"e":2,"i":{"l":4}},"k":[{"e":{"r":4}},8],"l":{"e":{".":32}},"m":{"e":{"t":{"e":5},"s":{"h":3}},"i":0,"p":0},"n":{"a":{"l":0},"e":0,"i":{"s":134},"t":{"a":0}},"o":{"m":41,"t":32},"p":{"e":{"l":3},"i":{"c":11}},"r":{"i":11,"o":4},"s":{"p":{"e":{"r":5}},"s":0},"t":{"h":{"e":1},"y":1,"r":{"o":{"n":2}}},"v":{"a":1,"e":{"l":5}},"x":5},"p":[{"e":{"a":21,"n":{"t":19},"r":{".":4},"t":23},"h":95,"i":{"n":{"g":3}},"o":23,"a":{"u":{"l":{"i":291}}}},29],"r":[{"e":{"c":0,"f":0,"o":21,"s":{"t":0}},"i":{"o":0,"v":0},"o":{"n":17,"s":17},"y":{"s":17}},72],"s":[{"a":[{"t":{"i":5}},29],"c":1,"e":[{"c":[{"r":0},23],"r":{".":4,"a":{"d":{"i":238}}},"s":3,"v":148},24],"h":[{"a":19},29],"i":[{"b":90},29],"o":{"n":12},"p":29,"w":19},44],"t":{"a":{"c":{"h":36},"g":21},"e":{"b":23,"n":{"d":17},"o":5},"i":[{"b":4,"d":0,"e":{"r":21},"g":23,"l":{"i":12,"l":17,"y":21},"s":{"t":21},"v":21},29],"r":{"i":23,"o":{"p":{"h":115}},"e":{"u":29}},"s":{"h":1},"h":{"o":{"u":29}}},"u":{"a":3,"e":{"l":93,"n":3},"g":{"l":1},"i":{"n":3},"m":{"p":{"l":11}},"n":[{"k":6,"t":{"y":0}},9],"s":{"c":19},"t":{"i":{"n":6}}},"v":{"e":[{"l":{"i":17},"n":23,"r":{".":4},"s":{"t":19},"y":23,"i":{"l":29}},1],"i":{"c":23,"v":0},"o":23},"w":29,"y":{"c":1,"n":{"g":{"e":32}},"t":3},"z":{"s":{"c":2}}},"s":{"a":[{"b":42,"c":{"k":32,"r":{"i":11},"t":23},"i":32,"l":{"a":{"r":36},"m":0,"o":4,"t":0,"e":{"s":{"c":54,"w":7}}},"n":{"c":27,"d":{"e":0}},"p":[{"a":{"r":{"i":{"l":292}}}},29],"t":{"a":4,"i":{"o":76},"u":11},"u":0,"v":{"o":{"r":4}},"w":32},9],"b":56,"c":{"a":{"n":{"t":149},"p":[{"e":{"r":267}},0],"v":6,"t":{"o":{"l":208}}},"e":{"d":21,"i":18,"s":21},"h":[{"o":21,"i":{"t":{"z":21}},"r":{"o":{"d":{"i":{"n":{"g":293}}}}}},8],"i":{"e":68,"n":{"d":150},"u":{"t":{"t":294}}},"l":{"e":6,"i":21},"o":{"f":17,"p":{"y":18},"u":{"r":{"a":7}}},"u":29,"r":{"a":{"p":{"e":{"r":{".":36}}}}},"y":{"t":{"h":247}}},"d":56,"e":{".":18,"a":[{"s":17,"w":5},1],"c":{"o":151,"t":27},"d":[{"e":95,"l":19},125],"g":[{"r":11},9],"i":32,"l":{"e":2,"f":32,"v":32},"m":{"e":[{"s":{"t":295}},18],"o":{"l":1},"a":{"p":{"h":287}},"i":{"t":{"i":{"c":296}}}},"n":{"a":{"t":5},"c":18,"d":0,"e":{"d":19},"g":5,"i":{"n":19},"t":{"d":18,"l":18}},"p":{"a":152,"t":{"e":{"m":{"b":11}}}},"r":{".":43,"l":21,"o":0,"v":{"o":18}},"s":[{"h":4,"t":5},72],"u":{"m":113},"v":[{"e":{"n":11}},32],"w":{"i":0},"x":32},"f":47,"g":48,"h":[{".":25,"e":{"r":2,"v":32},"i":{"n":2,"o":3,"p":27,"v":6},"o":[{"l":{"d":4},"n":12,"r":[{"t":7},17],"e":{"s":{"t":137}}},0],"w":18},24],"i":{"b":2,"c":{"c":19},"d":{"e":{".":27,"s":[{"t":6,"w":6},32],"d":{".":8}},"i":[{"z":4},32]},"g":{"n":{"a":18}},"l":{"e":0,"y":18},"n":[{"a":24,"e":{".":32},"g":23},42],"o":[{"n":[{"a":6},32]},41],"r":[{"a":5,"e":{"s":{"i":{"d":4}}}},9],"s":41,"t":{"i":{"o":27}},"u":32,"v":41,"z":32},"k":[{"e":[{"t":23},18],"i":{"n":{"e":4,"g":4}},"y":{"s":{"c":15}}},9],"l":[{"a":{"t":23},"e":24,"i":{"t":{"h":7}},"o":{"v":{"a":{"k":{"i":{"a":297}}}}}},74],"m":[{"a":[{"l":{"l":54},"n":12},23],"e":{"l":17,"n":19},"i":{"t":{"h":32}},"o":{"l":{"d":49}}},42],"n":72,"o":[{"c":{"e":1},"f":{"t":12},"l":{"a":{"b":1},"d":153,"i":{"c":3},"v":32,"u":{"t":{"e":9}}},"m":27,"n":{".":68,"a":17,"g":0},"p":[{"h":{"i":{"c":32,"z":19},"y":19}},21],"r":{"c":5,"d":5},"v":[{"i":4},18],"g":{"a":{"m":{"y":298}}}},41],"p":{"a":[{"i":32,"n":0,"c":{"e":299,"i":{"n":69}}},25],"e":{"n":{"d":17},"o":57,"r":25,"c":{"i":{"o":11}}},"h":{"e":[{"r":[{"o":213},27]},24],"o":6},"i":{"l":17,"n":{"g":4},"o":18,"c":{"i":{"l":208}}},"l":{"y":21},"o":{"n":21,"r":[{"t":{"s":{"c":300,"w":300}}},17],"t":18,"k":{"e":{"s":{"w":10}}}}},"q":{"u":{"a":{"l":{"l":36}},"i":{"t":{"o":88}}}},"r":29,"s":[{"a":[{"s":12,"c":{"h":{"u":301}}},29],"c":94,"e":{"l":23,"n":{"g":19},"s":{".":21},"t":19},"i":[{"e":[{"r":0},21],"l":{"y":4},"a":{"n":{".":210}},"g":{"n":{"a":{"b":302}}}},29],"l":[{"i":1},21],"n":21,"p":{"e":{"n":{"d":115}}},"t":9,"u":{"r":{"a":6}},"w":4,"h":{"a":{"t":3}}},25],"t":{".":25,"a":{"g":24,"l":24,"m":{"i":17,"p":69},"n":{"d":32,"t":{"s":{"h":{"i":303}}}},"p":90,"t":{".":32,"i":15},"r":{"t":{"l":{"i":12}}}},"e":{"d":21,"r":{"n":{"i":7},"o":19},"w":[{"a":6},8]},"h":{"e":23},"i":[{".":21,"a":19,"c":[{"k":32},29],"e":21,"f":23,"n":{"g":3},"r":32},9],"l":{"e":29},"o":{"c":{"k":32},"m":{"a":12},"n":{"e":32},"p":21,"r":{"e":27,"a":{"b":304}}},"r":[{"a":{"d":21,"t":{"u":32,"a":{"g":305}},"y":21},"i":{"d":21,"b":{"u":{"t":7}}},"y":18},1],"w":61,"y":[{"l":{"i":{"s":137}}},24],"b":4,"s":{"c":{"r":4}},"u":{"p":{"i":{"d":306}}}},"u":[{"a":{"l":2},"b":111,"g":151,"i":{"s":4,"t":12},"l":21,"m":[{"i":11},9],"n":9,"r":9,"p":{"e":{"r":{"e":307}}}},41],"v":18,"w":[{"o":18,"i":{"m":{"m":177}}},9],"y":[{"c":18,"l":27,"n":{"o":5,"c":41},"r":{"i":{"n":4}},"t":{"h":{"i":308}}},21]},"t":{"a":[{".":27,"b":[{"l":{"e":{"s":4}},"o":{"l":{"i":{"z":32,"s":{"m":309}}}}},25],"c":{"i":18},"d":{"o":4},"f":46,"i":{"l":{"o":5}},"l":[{"a":4,"e":{"n":5},"i":11,"k":[{"a":204},18],"l":{"i":{"s":0}},"o":{"g":4}},9],"m":{"o":4,"i":{"n":82}},"n":{"d":{"e":0},"t":{"a":54}},"p":{"e":{"r":4},"l":4,"a":{"t":{"h":310}}},"r":{"a":0,"c":18,"e":18,"i":{"z":3},"r":{"h":311}},"s":{"e":0,"y":4},"t":{"i":{"c":18},"u":{"r":1}},"u":{"n":17},"v":0,"w":25,"x":{"i":{"s":0}},"g":{"o":{"n":{".":3}}}},41],"b":42,"c":[{"h":[{"e":{"t":5},"c":15,"i":{"e":{"r":237}}},21],"r":29},18],"d":43,"e":{".":18,"a":{"d":{"i":17},"t":18,"c":{"h":{"e":{"r":{".":36}}}}},"c":{"e":17,"t":32},"d":[{"i":4},42],"e":41,"g":[{"e":{"r":4},"i":4},0],"l":{".":27,"i":17,"s":32,"e":{"g":84,"r":{"o":249}}},"m":{"a":[{"t":11},154]},"n":{"a":{"n":27},"c":27,"d":27,"e":{"s":18},"t":[{"a":{"g":0}},41]},"o":41,"p":[{"e":4},1],"r":{"c":11,"d":155,"i":[{"e":{"s":5},"s":11,"z":{"a":6},"c":{".":8}},41],"n":{"i":{"t":32}},"v":5,"g":{"e":{"i":312}}},"s":{".":18,"s":[{".":23,"e":{"s":313}},18]},"t":{"h":{"e":6}},"u":27,"x":27,"y":18},"f":42,"g":43,"h":{".":25,"a":{"n":17,"l":{"a":{"m":228}}},"e":[{"a":[{"s":3,"t":5},18],"i":{"s":11},"t":27},9],"i":{"c":{".":4,"a":4},"l":18,"n":{"k":32}},"l":18,"o":{"d":{"e":4,"i":{"c":32},"o":{"n":11}},"o":18,"r":{"i":{"t":6,"z":5}},"g":{"e":{"n":{"i":314}}},"k":{"e":{"r":175}}},"s":25,"y":{"l":{"a":{"n":228}},"s":{"c":11}}},"i":{"a":[{"b":1,"t":{"o":1},"n":{".":70}},41],"b":156,"c":{"k":18,"o":21,"u":157},"d":{"i":32},"e":{"n":27},"f":[{"y":4},8],"g":[{"u":32},25],"l":{"l":{"i":{"n":6}}},"m":[{"p":18,"u":{"l":5}},41],"n":[{"a":24,"e":{".":27},"i":27,"o":{"m":285}},42],"o":[{"c":4,"n":{"e":{"e":6}}},41],"q":32,"s":{"a":3,"e":27,"m":0,"o":4,"p":0,"t":{"i":{"c":{"a":32}}}},"t":{"l":3},"u":1,"v":[{"a":0},41],"z":[{"a":3,"e":{"n":3}},41]},"l":[{"a":[{"n":17},19],"e":{".":27,"d":27,"s":{".":27},"t":{".":19}},"o":19,"i":{"e":{"r":315}}},25],"m":[{"e":0},43],"n":81,"o":[{"b":3,"c":{"r":{"a":{"t":4}}},"d":{"o":18},"f":25,"g":{"r":9},"i":{"c":4},"m":{"a":9,"b":0,"y":3},"n":{"a":{"l":{"i":0},"t":3},"o":18,"y":18},"r":{"a":9,"i":{"e":3,"z":5}},"s":8,"u":{"r":32,"t":18},"w":{"a":{"r":3}},"l":{"o":{"g":{"y":84}}},"t":{"i":{"c":11}}},41],"p":43,"r":{"a":[{"b":11,"c":{"h":5,"i":[{"t":17},36],"t":{"e":17}},"s":17,"v":{"e":{"n":5,"s":158,"r":{"s":[{"a":{"b":317}},15]}}},"i":{"t":{"o":{"r":316}}}},41],"e":{"f":5,"m":[{"i":6},0],"a":{"c":{"h":{"e":318}}}},"i":{"a":[{"l":{".":1}},32],"c":{"e":{"s":5},"i":{"a":32},"s":18},"m":25,"v":0},"o":{"m":{"i":5},"n":{"i":6,"y":18},"p":{"h":{"e":5},"i":{"s":175},"o":{"l":{"e":{"s":320},"i":{"s":320,"t":321}}}},"s":{"p":11},"v":11,"l":{"e":{"u":{"m":319}}},"f":{"i":{"c":{".":17},"t":11}}},"u":{"i":5,"s":17}},"s":[{"c":[{"h":{"i":{"e":12}}},21],"h":0,"w":21},101],"t":[{"e":{"s":21},"o":19,"u":0,"r":{"i":{"b":{"u":{"t":322}}}}},66],"u":[{"a":[{"r":3},2],"b":{"i":1},"d":8,"e":18,"f":46,"i":76,"m":27,"n":{"i":{"s":1}},"p":{".":48},"r":{"e":27,"i":[{"s":11},32],"o":5,"y":4,"n":{"a":{"r":12}}},"s":27},41],"v":18,"w":[{"a":43,"i":{"s":17},"o":18,"h":29},1],"y":[{"a":18,"l":25,"p":{"e":12,"h":4,"a":{"l":64}}},41],"z":[{"e":1},18]},"u":{"a":{"b":18,"c":0,"n":{"a":4,"i":0},"r":{"a":{"n":{"t":5}},"d":8,"i":11,"t":11},"t":29,"v":0,"d":{"r":{"a":{"t":{"i":3,"u":15}}}}},"b":{"e":[{"l":21,"r":[{"o":21},23]},1],"i":[{"n":{"g":33}},72],"l":{"e":{".":23}}},"c":{"a":23,"i":{"b":0,"t":1},"l":{"e":12},"r":23,"u":23,"y":21},"d":{"d":4,"e":{"r":3,"s":{"t":4},"v":17},"i":{"c":29,"e":{"d":3,"s":3},"s":4,"t":19},"o":{"n":[{"y":232},21]},"s":{"i":1},"u":21},"e":{"n":{"e":21,"s":17,"t":{"e":0}},"r":{"i":{"l":0}},"a":{"m":15}},"f":{"a":27,"l":23},"g":{"h":{"e":{"n":11}},"i":{"n":4}},"i":[{"l":{"i":{"z":5}},"n":[{"g":29},1],"r":{"m":0},"t":{"a":17},"v":[{"e":{"r":{".":0}}},11]},156],"j":19,"k":18,"l":{"a":[{"b":5,"t":{"i":19}},29],"c":{"h":[{"e":32},17]},"d":{"e":{"r":3}},"e":[{"n":29},1],"g":{"i":1},"i":[{"a":19,"n":{"g":3},"s":{"h":4}},9],"l":{"a":{"r":1},"i":{"b":96,"s":1}},"m":61,"o":72,"s":[{"e":{"s":5}},18],"t":{"i":2,"r":{"a":54},"u":18},"u":[{"l":4},23],"v":4},"m":{"a":{"b":4},"b":{"i":1,"l":{"y":1}},"i":[{"n":{"g":83}},29],"o":{"r":{"o":6}},"p":9},"n":{"a":{"t":17},"e":[{"r":1},24],"i":[{"m":1,"n":24,"s":{"h":4},"v":11},29],"s":[{"w":1},93],"t":{"a":{"b":11},"e":{"r":{".":1},"s":1}},"u":0,"y":4,"z":4},"o":{"r":{"s":21},"s":19,"u":29},"p":{"e":[{"r":{"s":6}},29],"i":{"a":19,"n":{"g":3}},"l":23,"p":[{"o":{"r":{"t":10}}},3],"t":{"i":{"b":5},"u":17}},"r":{"a":[{".":18,"g":21,"s":21,"l":{".":216}},29],"b":{"e":1},"c":0,"d":2,"e":{"a":{"t":5}},"f":{"e":{"r":1},"r":1},"i":{"f":[{"i":{"c":0}},23],"n":2,"o":23,"t":29,"z":3,"a":{"l":{".":0}}},"l":[{"i":{"n":{"g":{".":5}}}},9],"n":{"o":1},"o":{"s":17},"p":{"e":1,"i":1},"s":{"e":{"r":5}},"t":{"e":{"s":4},"h":{"e":3},"i":[{"e":1},17]},"u":23},"s":[{"a":{"d":19,"n":19,"p":1},"c":[{"i":3},8],"e":{"a":5,"r":{".":9}},"i":{"a":19,"c":23},"l":{"i":{"n":1}},"p":2,"s":{"l":4},"t":{"e":{"r":{"e":4}},"r":2},"u":[{"r":17},24]},25],"t":{"a":{"b":0,"t":23},"e":{".":18,"l":18,"n":[{"i":17},18]},"i":[{"l":{"i":{"z":5}},"n":{"e":23,"g":3},"o":{"n":{"a":7}},"s":21,"z":31},101],"l":34,"o":{"f":4,"g":5,"m":{"a":{"t":{"i":{"c":5}}}},"n":19,"u":21},"s":0},"u":[{"m":1},23],"v":74,"x":{"u":11},"z":{"e":1}},"v":{"a":[{".":32,"b":159,"c":{"i":{"l":5},"u":11},"g":[{"e":1,"u":{"e":{"r":170}}},0],"l":{"i":{"e":4},"o":5,"u":15},"m":{"o":4},"n":{"i":{"z":4}},"p":{"i":4},"r":{"i":{"e":{"d":5}}},"t":[{"i":{"v":29}},27],"u":{"d":{"e":{"v":54}}}},41],"e":{".":18,"d":18,"g":11,"l":{".":23,"l":{"i":11},"o":1,"y":21},"n":{"o":{"m":11},"u":{"e":19}},"r":{"d":21,"e":{".":32,"l":[{"y":{".":41}},21],"n":[{"c":5},23],"s":21,"i":{"g":324}},"i":{"e":11},"m":{"i":{"n":36}},"s":{"e":27},"t":{"h":11}},"s":[{".":18,"t":{"e":0,"i":{"t":{"e":15}}}},99],"t":{"e":[{"r":11},1],"y":1}},"i":{"a":{"l":{"i":4},"n":32},"d":{"e":{".":32,"d":32,"n":47,"s":32},"i":32},"f":23,"g":{"n":4},"k":0,"l":[{"i":{"t":32,"z":127}},25],"n":[{"a":26,"c":24,"d":5,"g":18},29],"o":{"l":11,"r":73,"u":2},"p":1,"r":{"o":4},"s":{"i":{"t":11},"o":3,"u":3},"t":{"i":18,"r":11,"y":18},"v":[{"i":{"p":{"a":{"r":325}}}},27]},"o":{".":32,"i":[{"r":{"d":{"u":323}},"c":{"e":{"p":213}}},0],"k":27,"l":{"a":1,"e":19,"t":32,"v":27},"m":{"i":5},"r":{"a":{"b":5},"i":17,"y":1},"t":{"a":1,"e":{"e":18}}},"v":26,"y":21},"w":{"a":{"b":{"l":19},"c":25,"g":{"e":{"r":4},"o":5},"i":{"t":6},"l":{".":19},"m":0,"r":{"t":0},"s":{"t":[{"e":{"w":{"a":326}}},0]},"t":{"e":2},"v":{"e":{"r":4,"g":327}}},"b":29,"e":{"a":{"r":{"i":{"e":5}},"t":{"h":54}},"d":{"n":0},"e":{"t":12,"v":5,"k":{"n":137}},"l":{"l":0},"r":29,"s":{"t":12},"v":23},"h":{"i":0},"i":[{"l":[{"l":{"i":{"n":6}}},8],"n":{"d":{"e":0},"g":0},"r":0,"s":{"e":27},"t":{"h":12},"z":5,"d":{"e":{"s":{"p":6}}}},9],"k":21,"l":{"e":{"s":1},"i":{"n":3}},"n":{"o":21},"o":[{"m":15,"v":{"e":{"n":4}},"k":{"e":{"n":85}}},160],"p":19,"r":{"a":[{"p":{"a":{"r":{"o":12}}}},0],"i":[{"t":{"a":36,"e":{"r":{".":183}}}},0]},"s":{"h":23,"l":1,"p":{"e":1},"t":60},"t":18,"y":1,"c":23},"x":{"a":[{"c":{"e":5},"g":{"o":21},"m":11,"p":21,"s":5},29],"c":161,"e":[{"c":{"u":{"t":{"o":1}}},"d":24,"r":{"i":0,"o":4}},29],"h":[{"i":[{"l":6},8],"u":0},29],"i":[{"a":4,"c":4,"d":{"i":4},"m":{"e":21,"i":{"z":4}}},23],"o":[{"b":21},23],"p":[{"a":{"n":{"d":17}},"e":{"c":{"t":{"o":10}},"d":11}},23],"t":[{"i":23},74],"u":[{"a":3},29],"x":1,"q":[{"u":{"i":{"s":54}}},29]},"y":{"a":{"c":19,"r":110,"t":19},"b":29,"c":[{"e":[{"r":4},24],"h":[{"e":[{"d":264},0]},23],"o":{"m":17,"t":17}},29],"d":29,"e":{"e":19,"r":[{"f":21},29],"s":[{"t":{"e":{"r":{"y":328}}}},0],"t":1},"g":{"i":19},"h":47,"i":29,"l":{"a":23,"l":{"a":{"b":{"l":6}}},"o":23,"u":19},"m":{"b":{"o":{"l":7}},"e":[{"t":{"r":{"y":20}}},0],"p":{"a":12}},"n":{"c":{"h":{"r":3}},"d":4,"g":4,"i":{"c":4},"x":32},"o":[{"d":4,"g":33,"m":0,"n":{"e":{"t":4},"s":21},"s":21},72],"p":{"e":{"d":21,"r":6},"i":3,"o":[{"c":21},23],"t":{"a":9},"u":19},"r":{"a":{"m":5},"i":{"a":4},"o":23,"r":1},"s":{"c":1,"e":161,"i":{"c":{"a":3},"o":3,"s":27},"o":21,"s":0,"t":[{"a":3,"r":{"o":29}},2],"u":{"r":17}},"t":{"h":{"i":{"n":23}},"i":{"c":3}},"w":29},"z":{"a":[{"b":79,"r":8},2],"b":18,"e":[{"n":1,"p":1,"r":[{"o":3},29],"t":0},25],"i":[{"l":21,"s":21,"a":{"n":{".":23}}},42],"l":32,"m":18,"o":[{"m":1,"o":{"l":4},"p":{"h":{"r":329}}},41],"t":{"e":0},"z":[{"y":21,"w":231},101]}}',["as-so-ciate","as-so-ciates","dec-li-na-tion","oblig-a-tory","phil-an-thropic","present","presents","project","projects","reci-procity","re-cog-ni-zance","ref-or-ma-tion","ret-ri-bu-tion","ta-ble"]]})?n.apply(t,r):n)||(e.exports=o)},7279:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7755),t.pad.AnsiX923={pad:function(e,t){var n=e.sigBytes,r=4*t,o=r-n%r,i=n+o-1;e.clamp(),e.words[i>>>2]|=o<<24-i%4*8,e.sigBytes+=o},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},t.pad.Ansix923)}()},7295:(e,t,n)=>{"use strict";var r=n(4994);t.Ay=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{themeId:t,defaultTheme:n=g,rootShouldForwardProp:r=p,slotShouldForwardProp:l=p}=e,u=e=>(0,c.default)((0,o.default)({},e,{theme:A((0,o.default)({},e,{defaultTheme:n,themeId:t}))}));return u.__mui_systemSx=!0,function(e){let c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(0,a.internal_processStyles)(e,(e=>e.filter((e=>!(null!=e&&e.__mui_systemSx)))));const{name:d,slot:f,skipVariantsResolver:g,skipSx:b,overridesResolver:x=v(m(f))}=c,w=(0,i.default)(c,h),C=void 0!==g?g:f&&"Root"!==f&&"root"!==f||!1,E=b||!1;let D=p;"Root"===f||"root"===f?D=r:f?D=l:function(e){return"string"===typeof e&&e.charCodeAt(0)>96}(e)&&(D=void 0);const k=(0,a.default)(e,(0,o.default)({shouldForwardProp:D,label:undefined},w)),I=e=>"function"===typeof e&&e.__emotion_real!==e||(0,s.isPlainObject)(e)?r=>y(e,(0,o.default)({},r,{theme:A({theme:r.theme,defaultTheme:n,themeId:t})})):e,S=function(r){let i=I(r);for(var a=arguments.length,s=new Array(a>1?a-1:0),l=1;l{const r=A((0,o.default)({},e,{defaultTheme:n,themeId:t}));if(!r.components||!r.components[d]||!r.components[d].styleOverrides)return null;const i=r.components[d].styleOverrides,a={};return Object.entries(i).forEach((t=>{let[n,i]=t;a[n]=y(i,(0,o.default)({},e,{theme:r}))})),x(e,a)})),d&&!C&&c.push((e=>{var r;const i=A((0,o.default)({},e,{defaultTheme:n,themeId:t}));return y({variants:null==i||null==(r=i.components)||null==(r=r[d])?void 0:r.variants},(0,o.default)({},e,{theme:i}))})),E||c.push(u);const h=c.length-s.length;if(Array.isArray(r)&&h>0){const e=new Array(h).fill("");i=[...r,...e],i.raw=[...r.raw,...e]}const f=k(i,...c);return e.muiName&&(f.muiName=e.muiName),f};return k.withConfig&&(S.withConfig=k.withConfig),S}};var o=r(n(4634)),i=r(n(4893)),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=f(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=o?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(r,i,a):r[i]=e[i]}return r.default=e,n&&n.set(e,r),r}(n(116)),s=n(7785),l=(r(n(304)),r(n(8399)),r(n(9904))),c=r(n(8807));const u=["ownerState"],d=["variants"],h=["name","slot","skipVariantsResolver","skipSx","overridesResolver"];function f(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(f=function(e){return e?n:t})(e)}function p(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}const g=(0,l.default)(),m=e=>e?e.charAt(0).toLowerCase()+e.slice(1):e;function A(e){let{defaultTheme:t,theme:n,themeId:r}=e;return o=n,0===Object.keys(o).length?t:n[r]||n;var o}function v(e){return e?(t,n)=>n[e]:null}function y(e,t){let{ownerState:n}=t,r=(0,i.default)(t,u);const a="function"===typeof e?e((0,o.default)({ownerState:n},r)):e;if(Array.isArray(a))return a.flatMap((e=>y(e,(0,o.default)({ownerState:n},r))));if(a&&"object"===typeof a&&Array.isArray(a.variants)){const{variants:e=[]}=a;let t=(0,i.default)(a,d);return e.forEach((e=>{let i=!0;"function"===typeof e.props?i=e.props((0,o.default)({ownerState:n},r,n)):Object.keys(e.props).forEach((t=>{(null==n?void 0:n[t])!==e.props[t]&&r[t]!==e.props[t]&&(i=!1)})),i&&(Array.isArray(t)||(t=[t]),t.push("function"===typeof e.style?e.style((0,o.default)({ownerState:n},r,n)):e.style))})),t}return a}},7305:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M21 11V3h-8l3.29 3.29-10 10L3 13v8h8l-3.29-3.29 10-10z"}),"OpenInFull")},7353:function(e,t,n){!function(){var t;e.exports=(t=n(4703),function(){var e=t,n=e.lib.WordArray,r=e.enc;function o(e){return e<<8&4278255360|e>>>8&16711935}r.Utf16=r.Utf16BE={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],o=0;o>>2]>>>16-o%4*8&65535;r.push(String.fromCharCode(i))}return r.join("")},parse:function(e){for(var t=e.length,r=[],o=0;o>>1]|=e.charCodeAt(o)<<16-o%2*16;return n.create(r,2*t)}},r.Utf16LE={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],i=0;i>>2]>>>16-i%4*8&65535);r.push(String.fromCharCode(a))}return r.join("")},parse:function(e){for(var t=e.length,r=[],i=0;i>>1]|=o(e.charCodeAt(i)<<16-i%2*16);return n.create(r,2*t)}}}(),t.enc.Utf16)}()},7370:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,E:()=>m,T:()=>d,c:()=>p,h:()=>h,w:()=>u});var r=n(9950),o=n(8603),i=n(1783),a=n(9015),s=n(6477),l=r.createContext("undefined"!==typeof HTMLElement?(0,o.A)({key:"css"}):null),c=l.Provider,u=function(e){return(0,r.forwardRef)((function(t,n){var o=(0,r.useContext)(l);return e(t,o,n)}))},d=r.createContext({});var h={}.hasOwnProperty,f="__EMOTION_TYPE_PLEASE_DO_NOT_USE__",p=function(e,t){var n={};for(var r in t)h.call(t,r)&&(n[r]=t[r]);return n[f]=e,n},g=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;return(0,i.SF)(t,n,r),(0,s.s)((function(){return(0,i.sk)(t,n,r)})),null},m=u((function(e,t,n){var o=e.css;"string"===typeof o&&void 0!==t.registered[o]&&(o=t.registered[o]);var s=e[f],l=[o],c="";"string"===typeof e.className?c=(0,i.Rk)(t.registered,l,e.className):null!=e.className&&(c=e.className+" ");var u=(0,a.J)(l,void 0,r.useContext(d));c+=t.key+"-"+u.name;var p={};for(var m in e)h.call(e,m)&&"css"!==m&&m!==f&&(p[m]=e[m]);return p.className=c,n&&(p.ref=n),r.createElement(r.Fragment,null,r.createElement(g,{cache:t,serialized:u,isStringTag:"string"===typeof s}),r.createElement(s,p))}))},7402:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=n(6907).A},7413:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},7427:function(e,t,n){!function(){var t;e.exports=(t=n(4703),function(e){var n=t,r=n.lib,o=r.WordArray,i=r.Hasher,a=n.algo,s=[],l=[];!function(){function t(t){for(var n=e.sqrt(t),r=2;r<=n;r++)if(!(t%r))return!1;return!0}function n(e){return 4294967296*(e-(0|e))|0}for(var r=2,o=0;o<64;)t(r)&&(o<8&&(s[o]=n(e.pow(r,.5))),l[o]=n(e.pow(r,1/3)),o++),r++}();var c=[],u=a.SHA256=i.extend({_doReset:function(){this._hash=new o.init(s.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],o=n[1],i=n[2],a=n[3],s=n[4],u=n[5],d=n[6],h=n[7],f=0;f<64;f++){if(f<16)c[f]=0|e[t+f];else{var p=c[f-15],g=(p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3,m=c[f-2],A=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;c[f]=g+c[f-7]+A+c[f-16]}var v=r&o^r&i^o&i,y=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),b=h+((s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25))+(s&u^~s&d)+l[f]+c[f];h=d,d=u,u=s,s=a+b|0,a=i,i=o,o=r,r=b+(y+v)|0}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+i|0,n[3]=n[3]+a|0,n[4]=n[4]+s|0,n[5]=n[5]+u|0,n[6]=n[6]+d|0,n[7]=n[7]+h|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;return n[o>>>5]|=128<<24-o%32,n[14+(o+64>>>9<<4)]=e.floor(r/4294967296),n[15+(o+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});n.SHA256=i._createHelper(u),n.HmacSHA256=i._createHmacHelper(u)}(Math),t.SHA256)}()},7483:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,Q:()=>i});var r=n(8168),o=n(9950);function i(e){if("object"!==typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}function a(e){if(o.isValidElement(e)||!i(e))return e;const t={};return Object.keys(e).forEach((n=>{t[n]=a(e[n])})),t}function s(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{clone:!0};const l=n.clone?(0,r.A)({},e):e;return i(e)&&i(t)&&Object.keys(t).forEach((r=>{o.isValidElement(t[r])?l[r]=t[r]:i(t[r])&&Object.prototype.hasOwnProperty.call(e,r)&&i(e[r])?l[r]=s(e[r],t[r],n):n.clone?l[r]=i(t[r])?a(t[r]):t[r]:l[r]=t[r]})),l}},7524:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M9 15c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4m13.1-8.16c.01-.11.02-.22.02-.34 0-.12-.01-.23-.03-.34l.74-.58c.07-.05.08-.15.04-.22l-.7-1.21c-.04-.08-.14-.1-.21-.08l-.86.35c-.18-.14-.38-.25-.59-.34l-.13-.93c-.02-.09-.09-.15-.18-.15h-1.4c-.09 0-.16.06-.17.15l-.13.93c-.21.09-.41.21-.59.34l-.87-.35c-.08-.03-.17 0-.21.08l-.7 1.21c-.04.08-.03.17.04.22l.74.58c-.02.11-.03.23-.03.34 0 .11.01.23.03.34l-.74.58c-.07.05-.08.15-.04.22l.7 1.21c.04.08.14.1.21.08l.87-.35c.18.14.38.25.59.34l.13.93c.01.09.08.15.17.15h1.4c.09 0 .16-.06.17-.15l.13-.93c.21-.09.41-.21.59-.34l.87.35c.08.03.17 0 .21-.08l.7-1.21c.04-.08.03-.17-.04-.22zm-2.6.91c-.69 0-1.25-.56-1.25-1.25s.56-1.25 1.25-1.25 1.25.56 1.25 1.25-.56 1.25-1.25 1.25m.42 3.93-.5-.87c-.03-.06-.1-.08-.15-.06l-.62.25c-.13-.1-.27-.18-.42-.24l-.09-.66c-.02-.06-.08-.1-.14-.1h-1c-.06 0-.11.04-.12.11l-.09.66c-.15.06-.29.15-.42.24l-.62-.25c-.06-.02-.12 0-.15.06l-.5.87c-.03.06-.02.12.03.16l.53.41c-.01.08-.02.16-.02.24 0 .08.01.17.02.24l-.53.41c-.05.04-.06.11-.03.16l.5.87c.03.06.1.08.15.06l.62-.25c.13.1.27.18.42.24l.09.66c.01.07.06.11.12.11h1c.06 0 .12-.04.12-.11l.09-.66c.15-.06.29-.15.42-.24l.62.25c.06.02.12 0 .15-.06l.5-.87c.03-.06.02-.12-.03-.16l-.52-.41c.01-.08.02-.16.02-.24 0-.08-.01-.17-.02-.24l.53-.41c.05-.04.06-.11.04-.17m-2.42 1.65c-.46 0-.83-.38-.83-.83 0-.46.38-.83.83-.83s.83.38.83.83c0 .46-.37.83-.83.83M4.74 9h8.53c.27 0 .49-.22.49-.49v-.02c0-.27-.22-.49-.49-.49H13c0-1.48-.81-2.75-2-3.45v.95c0 .28-.22.5-.5.5s-.5-.22-.5-.5V4.14C9.68 4.06 9.35 4 9 4s-.68.06-1 .14V5.5c0 .28-.22.5-.5.5S7 5.78 7 5.5v-.95C5.81 5.25 5 6.52 5 8h-.26c-.27 0-.49.22-.49.49v.03c0 .26.22.48.49.48M9 13c1.86 0 3.41-1.28 3.86-3H5.14c.45 1.72 2 3 3.86 3"}),"Engineering")},7550:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r="$$material"},7626:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6z"}),"Code")},7644:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M7.41 15.41 12 10.83l4.59 4.58L18 14l-6-6-6 6z"}),"KeyboardArrowUp")},7755:function(e,t,n){!function(){var t;e.exports=(t=n(4703),n(7020),void(t.lib.Cipher||function(e){var n=t,r=n.lib,o=r.Base,i=r.WordArray,a=r.BufferedBlockAlgorithm,s=n.enc,l=(s.Utf8,s.Base64),c=n.algo.EvpKDF,u=r.Cipher=a.extend({cfg:o.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){a.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return"string"==typeof e?y:A}return function(t){return{encrypt:function(n,r,o){return e(r).encrypt(t,n,r,o)},decrypt:function(n,r,o){return e(r).decrypt(t,n,r,o)}}}}()}),d=(r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),n.mode={}),h=r.BlockCipherMode=o.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),f=d.CBC=function(){var t=h.extend();function n(t,n,r){var o,i=this._iv;i?(o=i,this._iv=e):o=this._prevBlock;for(var a=0;a>>2];e.sigBytes-=t}},g=(r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:f,padding:p}),reset:function(){var e;u.reset.call(this);var t=this.cfg,n=t.iv,r=t.mode;this._xformMode==this._ENC_XFORM_MODE?e=r.createEncryptor:(e=r.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==e?this._mode.init(this,n&&n.words):(this._mode=e.call(r,this,n&&n.words),this._mode.__creator=e)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e,t=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(t.pad(this._data,this.blockSize),e=this._process(!0)):(e=this._process(!0),t.unpad(e)),e},blockSize:4}),r.CipherParams=o.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}})),m=(n.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext,n=e.salt;return(n?i.create([1398893684,1701076831]).concat(n).concat(t):t).toString(l)},parse:function(e){var t,n=l.parse(e),r=n.words;return 1398893684==r[0]&&1701076831==r[1]&&(t=i.create(r.slice(2,4)),r.splice(0,4),n.sigBytes-=16),g.create({ciphertext:n,salt:t})}},A=r.SerializableCipher=o.extend({cfg:o.extend({format:m}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var o=e.createEncryptor(n,r),i=o.finalize(t),a=o.cfg;return g.create({ciphertext:i,key:n,iv:a.iv,algorithm:e,mode:a.mode,padding:a.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),e.createDecryptor(n,r).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),v=(n.kdf={}).OpenSSL={execute:function(e,t,n,r,o){if(r||(r=i.random(8)),o)a=c.create({keySize:t+n,hasher:o}).compute(e,r);else var a=c.create({keySize:t+n}).compute(e,r);var s=i.create(a.words.slice(t),4*n);return a.sigBytes=4*t,g.create({key:a,iv:s,salt:r})}},y=r.PasswordBasedCipher=A.extend({cfg:A.cfg.extend({kdf:v}),encrypt:function(e,t,n,r){var o=(r=this.cfg.extend(r)).kdf.execute(n,e.keySize,e.ivSize,r.salt,r.hasher);r.iv=o.iv;var i=A.encrypt.call(this,e,t,o.key,r);return i.mixIn(o),i},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var o=r.kdf.execute(n,e.keySize,e.ivSize,t.salt,r.hasher);return r.iv=o.iv,A.decrypt.call(this,e,t,o.key,r)}})}()))}()},7760:(e,t,n)=>{var r=n(7161).z,o=n(7161).y,i=n(4429),a=n(2010),s=n(1789).z,l=n(1789).u,c=n(4423),u=n(1318),d=n(2036),h=1080,f=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),p=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),g=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),m=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function A(e){var t;return 0===e.readBits(1)?16:(t=e.readBits(3))>0?17+t:(t=e.readBits(3))>0?8+t:17}function v(e){if(e.readBits(1)){var t=e.readBits(3);return 0===t?1:e.readBits(t)+(1<1&&0===i)throw new Error("Invalid size byte");o.meta_block_length|=i<<8*r}}else for(r=0;r4&&0===a)throw new Error("Invalid size nibble");o.meta_block_length|=a<<4*r}return++o.meta_block_length,o.input_end||o.is_metadata||(o.is_uncompressed=e.readBits(1)),o}function x(e,t,n){var r;return n.fillBitWindow(),(r=e[t+=n.val_>>>n.bit_pos_&255].bits-8)>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<>=1,++u;for(p=0;p0;++p){var y,b=f[p],x=0;r.fillBitWindow(),x+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=v[x].bits,y=v[x].value,g[b]=y,0!==y&&(m-=32>>y,++A)}if(1!==A&&0!==m)throw new Error("[ReadHuffmanCode] invalid num_codes or space");!function(e,t,n,r){for(var o=0,i=8,a=0,c=0,u=32768,d=[],h=0;h<32;h++)d.push(new s(0,0));for(l(d,0,5,e,18);o0;){var f,p=0;if(r.readMoreInput(),r.fillBitWindow(),p+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=d[p].bits,(f=255&d[p].value)<16)a=0,n[o++]=f,0!==f&&(i=f,u-=32768>>f);else{var g,m,A=f-14,v=0;if(16===f&&(v=i),c!==v&&(a=0,c=v),g=a,a>0&&(a-=2,a<<=A),o+(m=(a+=r.readBits(A)+3)-g)>t)throw new Error("[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols");for(var y=0;y>>5]),this.htrees=new Uint32Array(t)}function I(e,t){var n,r,o={num_htrees:null,context_map:null},i=0;t.readMoreInput();var a=o.num_htrees=v(t)+1,l=o.context_map=new Uint8Array(e);if(a<=1)return o;for(t.readBits(1)&&(i=t.readBits(4)+1),n=[],r=0;r=e)throw new Error("[DecodeContextMap] i >= context_map_size");l[r]=0,++r}else l[r]=c-i,++r}return t.readBits(1)&&function(e,t){var n,r=new Uint8Array(256);for(n=0;n<256;++n)r[n]=n;for(n=0;n=e&&(s-=e),r[n]=s,o[l+(1&i[c])]=s,++i[c]}function B(e,t,n,r,o,a){var s,l=o+1,c=n&o,u=a.pos_&i.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)0;)a.readMoreInput(),r[c++]=a.readBits(8),c===l&&(e.write(r,l),c=0);else{if(a.bit_end_pos_<32)throw new Error("[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32");for(;a.bit_pos_<32;)r[c]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,++c,--t;if(u+(s=a.bit_end_pos_-a.bit_pos_>>3)>i.IBUF_MASK){for(var d=i.IBUF_MASK+1-u,h=0;h=l){e.write(r,l),c-=l;for(h=0;h=l;){if(s=l-c,a.input_.read(r,c,s)t.buffer.length){var he=new Uint8Array(F+Z);he.set(t.buffer),t.buffer=he}if(j=de.input_end,z=de.is_uncompressed,de.is_metadata)for(_(D);Z>0;--Z)D.readMoreInput(),D.readBits(8);else if(0!==Z)if(z)D.bit_pos_=D.bit_pos_+7&-8,B(t,Z,F,p,f,D),F+=Z;else{for(n=0;n<3;++n)te[n]=v(D)+1,te[n]>=2&&(w(te[n]+2,m,n*h,D),w(26,y,n*h,D),$[n]=C(y,n*h,D),re[n]=1);for(D.readMoreInput(),W=(1<<(U=D.readBits(2)))-1,G=(H=16+(D.readBits(4)<0;){var ge,me,Ae,ve,ye,be,xe,we,Ce,Ee,De,ke;for(D.readMoreInput(),0===$[1]&&(S(te[1],m,1,ee,ne,re,D),$[1]=C(y,h,D),X=P[1].htrees[ee[1]]),--$[1],(me=(ge=x(P[1].codes,X,D))>>6)>=2?(me-=2,xe=-1):xe=0,Ae=u.kInsertRangeLut[me]+(ge>>3&7),ve=u.kCopyRangeLut[me]+(7&ge),ye=u.kInsertLengthPrefixCode[Ae].offset+D.readBits(u.kInsertLengthPrefixCode[Ae].nbits),be=u.kCopyLengthPrefixCode[ve].offset+D.readBits(u.kCopyLengthPrefixCode[ve].nbits),N=p[F-1&f],Q=p[F-2&f],Ce=0;Ce4?3:be-2))],(xe=x(P[2].codes,P[2].htrees[le],D))>=H)ke=(xe-=H)&W,xe=H+((Ie=(2+(1&(xe>>=U))<<(De=1+(xe>>1)))-4)+D.readBits(De)<(T=F=a.minDictionaryWordLength&&be<=a.maxDictionaryWordLength))throw new Error("Invalid backward reference. pos: "+F+" distance: "+we+" len: "+be+" bytes left: "+Z);var Ie=a.offsetsByLength[be],Se=we-T-1,Be=a.sizeBitsByLength[be],_e=Se>>Be;if(Ie+=(Se&(1<=g){t.write(p,l);for(var je=0;je0&&(R[3&M]=we,++M),be>Z)throw new Error("Invalid backward reference. pos: "+F+" distance: "+we+" len: "+be+" bytes left: "+Z);for(Ce=0;Ce>>24)|4278255360&(o<<24|o>>>8)}var i=this._hash.words,a=e[t+0],l=e[t+1],f=e[t+2],p=e[t+3],g=e[t+4],m=e[t+5],A=e[t+6],v=e[t+7],y=e[t+8],b=e[t+9],x=e[t+10],w=e[t+11],C=e[t+12],E=e[t+13],D=e[t+14],k=e[t+15],I=i[0],S=i[1],B=i[2],_=i[3];I=c(I,S,B,_,a,7,s[0]),_=c(_,I,S,B,l,12,s[1]),B=c(B,_,I,S,f,17,s[2]),S=c(S,B,_,I,p,22,s[3]),I=c(I,S,B,_,g,7,s[4]),_=c(_,I,S,B,m,12,s[5]),B=c(B,_,I,S,A,17,s[6]),S=c(S,B,_,I,v,22,s[7]),I=c(I,S,B,_,y,7,s[8]),_=c(_,I,S,B,b,12,s[9]),B=c(B,_,I,S,x,17,s[10]),S=c(S,B,_,I,w,22,s[11]),I=c(I,S,B,_,C,7,s[12]),_=c(_,I,S,B,E,12,s[13]),B=c(B,_,I,S,D,17,s[14]),I=u(I,S=c(S,B,_,I,k,22,s[15]),B,_,l,5,s[16]),_=u(_,I,S,B,A,9,s[17]),B=u(B,_,I,S,w,14,s[18]),S=u(S,B,_,I,a,20,s[19]),I=u(I,S,B,_,m,5,s[20]),_=u(_,I,S,B,x,9,s[21]),B=u(B,_,I,S,k,14,s[22]),S=u(S,B,_,I,g,20,s[23]),I=u(I,S,B,_,b,5,s[24]),_=u(_,I,S,B,D,9,s[25]),B=u(B,_,I,S,p,14,s[26]),S=u(S,B,_,I,y,20,s[27]),I=u(I,S,B,_,E,5,s[28]),_=u(_,I,S,B,f,9,s[29]),B=u(B,_,I,S,v,14,s[30]),I=d(I,S=u(S,B,_,I,C,20,s[31]),B,_,m,4,s[32]),_=d(_,I,S,B,y,11,s[33]),B=d(B,_,I,S,w,16,s[34]),S=d(S,B,_,I,D,23,s[35]),I=d(I,S,B,_,l,4,s[36]),_=d(_,I,S,B,g,11,s[37]),B=d(B,_,I,S,v,16,s[38]),S=d(S,B,_,I,x,23,s[39]),I=d(I,S,B,_,E,4,s[40]),_=d(_,I,S,B,a,11,s[41]),B=d(B,_,I,S,p,16,s[42]),S=d(S,B,_,I,A,23,s[43]),I=d(I,S,B,_,b,4,s[44]),_=d(_,I,S,B,C,11,s[45]),B=d(B,_,I,S,k,16,s[46]),I=h(I,S=d(S,B,_,I,f,23,s[47]),B,_,a,6,s[48]),_=h(_,I,S,B,v,10,s[49]),B=h(B,_,I,S,D,15,s[50]),S=h(S,B,_,I,m,21,s[51]),I=h(I,S,B,_,C,6,s[52]),_=h(_,I,S,B,p,10,s[53]),B=h(B,_,I,S,x,15,s[54]),S=h(S,B,_,I,l,21,s[55]),I=h(I,S,B,_,y,6,s[56]),_=h(_,I,S,B,k,10,s[57]),B=h(B,_,I,S,A,15,s[58]),S=h(S,B,_,I,E,21,s[59]),I=h(I,S,B,_,g,6,s[60]),_=h(_,I,S,B,w,10,s[61]),B=h(B,_,I,S,f,15,s[62]),S=h(S,B,_,I,b,21,s[63]),i[0]=i[0]+I|0,i[1]=i[1]+S|0,i[2]=i[2]+B|0,i[3]=i[3]+_|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;n[o>>>5]|=128<<24-o%32;var i=e.floor(r/4294967296),a=r;n[15+(o+64>>>9<<4)]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),n[14+(o+64>>>9<<4)]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),t.sigBytes=4*(n.length+1),this._process();for(var s=this._hash,l=s.words,c=0;c<4;c++){var u=l[c];l[c]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}return s},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});function c(e,t,n,r,o,i,a){var s=e+(t&n|~t&r)+o+a;return(s<>>32-i)+t}function u(e,t,n,r,o,i,a){var s=e+(t&r|n&~r)+o+a;return(s<>>32-i)+t}function d(e,t,n,r,o,i,a){var s=e+(t^n^r)+o+a;return(s<>>32-i)+t}function h(e,t,n,r,o,i,a){var s=e+(n^(t|~r))+o+a;return(s<>>32-i)+t}n.MD5=i._createHelper(l),n.HmacMD5=i._createHmacHelper(l)}(Math),t.MD5)}()},7785:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A,isPlainObject:()=>r.Q});var r=n(7483)},7887:(e,t,n)=>{"use strict";n.d(t,{$W:()=>o,Ay:()=>a,uE:()=>i});var r=n(6910);const o={apiUrl:"/api/v1"},i=r.A.create({baseURL:o.apiUrl,headers:{"Content-Type":"application/json"}});i.interceptors.request.use((e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization="Bearer ".concat(t)),e}),(e=>Promise.reject(e))),i.interceptors.response.use((e=>e),(e=>(e.response?404!==e.response.status&&console.error("API Error Response:",{status:e.response.status,data:e.response.data,headers:e.response.headers}):e.request?console.error("API No Response:",e.request):console.error("API Request Error:",e.message),Promise.reject(e))));const a=i},7899:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"}),"Check")},7923:(e,t,n)=>{"use strict";function r(e){var t=Object.create(null);return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}n.d(t,{A:()=>r})},7937:(e,t,n)=>{"use strict";n.d(t,{LX:()=>p,MA:()=>f,_W:()=>g,Lc:()=>v,Ms:()=>y});var r=n(8286),o=n(2703),i=n(6206);const a={m:"margin",p:"padding"},s={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},l={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},c=function(e){const t={};return n=>(void 0===t[n]&&(t[n]=e(n)),t[n])}((e=>{if(e.length>2){if(!l[e])return[e];e=l[e]}const[t,n]=e.split(""),r=a[t],o=s[n]||"";return Array.isArray(o)?o.map((e=>r+e)):[r+o]})),u=["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"],d=["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"],h=[...u,...d];function f(e,t,n,r){var i;const a=null!=(i=(0,o.Yn)(e,t,!1))?i:n;return"number"===typeof a?e=>"string"===typeof e?e:a*e:Array.isArray(a)?e=>"string"===typeof e?e:a[e]:"function"===typeof a?a:()=>{}}function p(e){return f(e,"spacing",8)}function g(e,t){if("string"===typeof t||null==t)return t;const n=e(Math.abs(t));return t>=0?n:"number"===typeof n?-n:"-".concat(n)}function m(e,t,n,o){if(-1===t.indexOf(n))return null;const i=function(e,t){return n=>e.reduce(((e,r)=>(e[r]=g(t,n),e)),{})}(c(n),o),a=e[n];return(0,r.NI)(e,a,i)}function A(e,t){const n=p(e.theme);return Object.keys(e).map((r=>m(e,t,r,n))).reduce(i.A,{})}function v(e){return A(e,u)}function y(e){return A(e,d)}function b(e){return A(e,h)}v.propTypes={},v.filterProps=u,y.propTypes={},y.filterProps=d,b.propTypes={},b.filterProps=h},7949:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M18 14.49V9c0-1-1.01-2.01-2-2V3h-2v4h-4V3H8v2.48l9.51 9.5zm-1.76 1.77L7.2 7.2l-.01.01L3.98 4 2.71 5.25l3.36 3.36C6.04 8.74 6 8.87 6 9v5.48L9.5 18v3h5v-3l.48-.48L19.45 22l1.26-1.28z"}),"PowerOff")},7988:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM19 4h-3.5l-1-1h-5l-1 1H5v2h14z"}),"Delete")},7991:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"}),"Info")},7999:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 0 0-1.41 0l-1.83 1.83 3.75 3.75z"}),"Edit")},8076:(e,t,n)=>{"use strict";n.d(t,{A:()=>R});var r=n(7937),o=n(2703),i=n(6206);const a=function(){for(var e=arguments.length,t=new Array(e),n=0;n(t.filterProps.forEach((n=>{e[n]=t})),e)),{}),o=e=>Object.keys(e).reduce(((t,n)=>r[n]?(0,i.A)(t,r[n](e)):t),{});return o.propTypes={},o.filterProps=t.reduce(((e,t)=>e.concat(t.filterProps)),[]),o};var s=n(8286);function l(e){return"number"!==typeof e?e:"".concat(e,"px solid")}function c(e,t){return(0,o.Ay)({prop:e,themeKey:"borders",transform:t})}const u=c("border",l),d=c("borderTop",l),h=c("borderRight",l),f=c("borderBottom",l),p=c("borderLeft",l),g=c("borderColor"),m=c("borderTopColor"),A=c("borderRightColor"),v=c("borderBottomColor"),y=c("borderLeftColor"),b=c("outline",l),x=c("outlineColor"),w=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=(0,r.MA)(e.theme,"shape.borderRadius",4,"borderRadius"),n=e=>({borderRadius:(0,r._W)(t,e)});return(0,s.NI)(e,e.borderRadius,n)}return null};w.propTypes={},w.filterProps=["borderRadius"];a(u,d,h,f,p,g,m,A,v,y,w,b,x);const C=e=>{if(void 0!==e.gap&&null!==e.gap){const t=(0,r.MA)(e.theme,"spacing",8,"gap"),n=e=>({gap:(0,r._W)(t,e)});return(0,s.NI)(e,e.gap,n)}return null};C.propTypes={},C.filterProps=["gap"];const E=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=(0,r.MA)(e.theme,"spacing",8,"columnGap"),n=e=>({columnGap:(0,r._W)(t,e)});return(0,s.NI)(e,e.columnGap,n)}return null};E.propTypes={},E.filterProps=["columnGap"];const D=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=(0,r.MA)(e.theme,"spacing",8,"rowGap"),n=e=>({rowGap:(0,r._W)(t,e)});return(0,s.NI)(e,e.rowGap,n)}return null};D.propTypes={},D.filterProps=["rowGap"];a(C,E,D,(0,o.Ay)({prop:"gridColumn"}),(0,o.Ay)({prop:"gridRow"}),(0,o.Ay)({prop:"gridAutoFlow"}),(0,o.Ay)({prop:"gridAutoColumns"}),(0,o.Ay)({prop:"gridAutoRows"}),(0,o.Ay)({prop:"gridTemplateColumns"}),(0,o.Ay)({prop:"gridTemplateRows"}),(0,o.Ay)({prop:"gridTemplateAreas"}),(0,o.Ay)({prop:"gridArea"}));function k(e,t){return"grey"===t?t:e}a((0,o.Ay)({prop:"color",themeKey:"palette",transform:k}),(0,o.Ay)({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:k}),(0,o.Ay)({prop:"backgroundColor",themeKey:"palette",transform:k}));function I(e){return e<=1&&0!==e?"".concat(100*e,"%"):e}const S=(0,o.Ay)({prop:"width",transform:I}),B=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const t=t=>{var n,r;const o=(null==(n=e.theme)||null==(n=n.breakpoints)||null==(n=n.values)?void 0:n[t])||s.zu[t];return o?"px"!==(null==(r=e.theme)||null==(r=r.breakpoints)?void 0:r.unit)?{maxWidth:"".concat(o).concat(e.theme.breakpoints.unit)}:{maxWidth:o}:{maxWidth:I(t)}};return(0,s.NI)(e,e.maxWidth,t)}return null};B.filterProps=["maxWidth"];const _=(0,o.Ay)({prop:"minWidth",transform:I}),F=(0,o.Ay)({prop:"height",transform:I}),j=(0,o.Ay)({prop:"maxHeight",transform:I}),T=(0,o.Ay)({prop:"minHeight",transform:I}),R=((0,o.Ay)({prop:"size",cssProperty:"width",transform:I}),(0,o.Ay)({prop:"size",cssProperty:"height",transform:I}),a(S,B,_,F,j,T,(0,o.Ay)({prop:"boxSizing"})),{border:{themeKey:"borders",transform:l},borderTop:{themeKey:"borders",transform:l},borderRight:{themeKey:"borders",transform:l},borderBottom:{themeKey:"borders",transform:l},borderLeft:{themeKey:"borders",transform:l},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:l},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:w},color:{themeKey:"palette",transform:k},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:k},backgroundColor:{themeKey:"palette",transform:k},p:{style:r.Ms},pt:{style:r.Ms},pr:{style:r.Ms},pb:{style:r.Ms},pl:{style:r.Ms},px:{style:r.Ms},py:{style:r.Ms},padding:{style:r.Ms},paddingTop:{style:r.Ms},paddingRight:{style:r.Ms},paddingBottom:{style:r.Ms},paddingLeft:{style:r.Ms},paddingX:{style:r.Ms},paddingY:{style:r.Ms},paddingInline:{style:r.Ms},paddingInlineStart:{style:r.Ms},paddingInlineEnd:{style:r.Ms},paddingBlock:{style:r.Ms},paddingBlockStart:{style:r.Ms},paddingBlockEnd:{style:r.Ms},m:{style:r.Lc},mt:{style:r.Lc},mr:{style:r.Lc},mb:{style:r.Lc},ml:{style:r.Lc},mx:{style:r.Lc},my:{style:r.Lc},margin:{style:r.Lc},marginTop:{style:r.Lc},marginRight:{style:r.Lc},marginBottom:{style:r.Lc},marginLeft:{style:r.Lc},marginX:{style:r.Lc},marginY:{style:r.Lc},marginInline:{style:r.Lc},marginInlineStart:{style:r.Lc},marginInlineEnd:{style:r.Lc},marginBlock:{style:r.Lc},marginBlockStart:{style:r.Lc},marginBlockEnd:{style:r.Lc},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:C},rowGap:{style:D},columnGap:{style:E},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:I},maxWidth:{style:B},minWidth:{transform:I},height:{transform:I},maxHeight:{transform:I},minHeight:{transform:I},boxSizing:{},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}})},8099:(e,t,n)=>{"use strict";function r(e){let t="https://mui.com/production-error/?code="+e;for(let n=1;nr})},8135:(e,t,n)=>{"use strict";n.d(t,{J:()=>r});const r={}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;tr})},8169:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M22 5.18 10.59 16.6l-4.24-4.24 1.41-1.41 2.83 2.83 10-10zM12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8c1.57 0 3.04.46 4.28 1.25l1.45-1.45C16.1 2.67 14.13 2 12 2 6.48 2 2 6.48 2 12s4.48 10 10 10c1.73 0 3.36-.44 4.78-1.22l-1.5-1.5c-1 .46-2.11.72-3.28.72m7-5h-3v2h3v3h2v-3h3v-2h-3v-3h-2z"}),"AddTask")},8211:(e,t,n)=>{var r=n(6676);t.init=function(){return(0,n(7760).BrotliDecompressBuffer)(r.toByteArray(n(1105)))}},8276:(e,t,n)=>{"use strict";var r=n(5899),o=15,i=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],a=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],l=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];e.exports=function(e,t,n,c,u,d,h,f){var p,g,m,A,v,y,b,x,w,C=f.bits,E=0,D=0,k=0,I=0,S=0,B=0,_=0,F=0,j=0,T=0,R=null,M=0,N=new r.Buf16(16),Q=new r.Buf16(16),P=null,O=0;for(E=0;E<=o;E++)N[E]=0;for(D=0;D=1&&0===N[I];I--);if(S>I&&(S=I),0===I)return u[d++]=20971520,u[d++]=20971520,f.bits=1,0;for(k=1;k0&&(0===e||1!==I))return-1;for(Q[1]=0,E=1;E852||2===e&&j>592)return 1;for(;;){b=E-_,h[D]y?(x=P[O+h[D]],w=R[M+h[D]]):(x=96,w=0),p=1<>_)+(g-=p)]=b<<24|x<<16|w}while(0!==g);for(p=1<>=1;if(0!==p?(T&=p-1,T+=p):T=0,D++,0===--N[E]){if(E===I)break;E=t[n+h[D]]}if(E>S&&(T&A)!==m){for(0===_&&(_=S),v+=k,F=1<<(B=E-_);B+_852||2===e&&j>592)return 1;u[m=T&A]=S<<24|B<<16|v-d}}return 0!==T&&(u[v+T]=E-_<<24|64<<16),f.bits=S,0}},8283:(e,t,n)=>{"use strict";n.d(t,{AH:()=>u,i7:()=>d,mL:()=>c});var r=n(7370),o=n(9950),i=n(1783),a=n(6477),s=n(9015),l=(n(8603),n(3876),function(e,t){var n=arguments;if(null==t||!r.h.call(t,"css"))return o.createElement.apply(void 0,n);var i=n.length,a=new Array(i);a[0]=r.E,a[1]=(0,r.c)(e,t);for(var s=2;s{"use strict";n.d(t,{EU:()=>s,NI:()=>a,iZ:()=>c,kW:()=>u,vf:()=>l,zu:()=>o});var r=n(7483);const o={xs:0,sm:600,md:900,lg:1200,xl:1536},i={keys:["xs","sm","md","lg","xl"],up:e=>"@media (min-width:".concat(o[e],"px)")};function a(e,t,n){const r=e.theme||{};if(Array.isArray(t)){const e=r.breakpoints||i;return t.reduce(((r,o,i)=>(r[e.up(e.keys[i])]=n(t[i]),r)),{})}if("object"===typeof t){const e=r.breakpoints||i;return Object.keys(t).reduce(((r,i)=>{if(-1!==Object.keys(e.values||o).indexOf(i)){r[e.up(i)]=n(t[i],i)}else{const e=i;r[e]=t[e]}return r}),{})}return n(t)}function s(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};var t;return(null==(t=e.keys)?void 0:t.reduce(((t,n)=>(t[e.up(n)]={},t)),{}))||{}}function l(e,t){return e.reduce(((e,t)=>{const n=e[t];return(!n||0===Object.keys(n).length)&&delete e[t],e}),t)}function c(e){const t=s(e);for(var n=arguments.length,o=new Array(n>1?n-1:0),i=1;i(0,r.A)(e,t)),{});return l(Object.keys(t),a)}function u(e){let{values:t,breakpoints:n,base:r}=e;const o=r||function(e,t){if("object"!==typeof e)return{};const n={},r=Object.keys(t);return Array.isArray(e)?r.forEach(((t,r)=>{r{null!=e[t]&&(n[t]=!0)})),n}(t,n),i=Object.keys(o);if(0===i.length)return t;let a;return i.reduce(((e,n,r)=>(Array.isArray(t)?(e[n]=null!=t[r]?t[r]:t[a],a=r):"object"===typeof t?(e[n]=null!=t[n]?t[n]:t[a],a=n):e[n]=t,e)),{})}},8287:(e,t,n)=>{"use strict";var r=n(4994);t.A=void 0;var o=r(n(7145)),i=n(4414);t.A=(0,o.default)((0,i.jsx)("path",{d:"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.89-2-2-2m0 16H5V7h14zm-5.5-6c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5.67-1.5 1.5-1.5 1.5.67 1.5 1.5M12 9c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5"}),"Preview")},8345:(e,n,r)=>{"use strict";var o=r(9950),i=r(3204);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n